Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndy Jury2018-06-27 19:55:23 +0000
committerAndy Jury2018-06-27 19:55:23 +0000
commit54332fc35de2dd9f5eededa861df6680be974509 (patch)
treea472dba5f1e492cec22364e99b8f4ad47f8a1cca
parent8507a8a82c12544aee8f68b6b7b5917a6bde1932 (diff)
parentf0822d2eb3119e7adfeb887df55546596f8d27c1 (diff)
downloadorg.eclipse.ote-sprint129.tar.gz
org.eclipse.ote-sprint129.tar.xz
org.eclipse.ote-sprint129.zip
-rw-r--r--org.eclipse.osee.client.ote.feature/.pmd925
-rw-r--r--org.eclipse.osee.client.ote.feature/.project17
-rw-r--r--org.eclipse.osee.client.ote.feature/build.properties5
-rw-r--r--org.eclipse.osee.client.ote.feature/epl-v10.html328
-rw-r--r--org.eclipse.osee.client.ote.feature/feature.properties141
-rw-r--r--org.eclipse.osee.client.ote.feature/feature.xml240
-rw-r--r--org.eclipse.osee.client.ote.feature/license.html79
-rw-r--r--org.eclipse.osee.client.ote.feature/pom.xml17
-rw-r--r--org.eclipse.osee.client.ote.feature/sourceTemplateFeature/feature.properties144
-rw-r--r--org.eclipse.osee.client.ote.feature/sourceTemplateFeature/license.html79
-rw-r--r--org.eclipse.osee.framework.ui.workspacebundleloader.test/.project28
-rw-r--r--org.eclipse.osee.framework.ui.workspacebundleloader/.classpath7
-rw-r--r--org.eclipse.osee.framework.ui.workspacebundleloader/.pmd925
-rw-r--r--org.eclipse.osee.framework.ui.workspacebundleloader/.project28
-rw-r--r--org.eclipse.osee.framework.ui.workspacebundleloader/META-INF/MANIFEST.MF26
-rw-r--r--org.eclipse.osee.framework.ui.workspacebundleloader/build.properties5
-rw-r--r--org.eclipse.osee.framework.ui.workspacebundleloader/plugin.xml27
-rw-r--r--org.eclipse.osee.framework.ui.workspacebundleloader/pom.xml17
-rw-r--r--org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/BundleCollection.java81
-rw-r--r--org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/BundleInfoLite.java166
-rw-r--r--org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/EarlyStartup.java46
-rw-r--r--org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/FileChangeDetector.java81
-rw-r--r--org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/IJarChangeListener.java44
-rw-r--r--org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/JarChangeResourceListener.java176
-rw-r--r--org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/JarCollectionNature.java171
-rw-r--r--org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/SafeWorkspaceTracker.java152
-rw-r--r--org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/WorkspaceBundleLoadCoordinator.java649
-rw-r--r--org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/WorkspaceLoader.java24
-rw-r--r--org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/WorkspaceStarterNature.java31
-rw-r--r--org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/internal/Activator.java31
-rw-r--r--org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/internal/ManagedFolderArea.java113
-rw-r--r--org.eclipse.osee.logback.config/.classpath6
-rw-r--r--org.eclipse.osee.logback.config/.project28
-rw-r--r--org.eclipse.osee.logback.config/META-INF/MANIFEST.MF8
-rw-r--r--org.eclipse.osee.logback.config/build.properties3
-rw-r--r--org.eclipse.osee.logback.config/logback-test.xml29
-rw-r--r--org.eclipse.osee.logback.config/logback.xml23
-rw-r--r--org.eclipse.osee.logback.config/pom.xml17
-rw-r--r--org.eclipse.osee.logger.slf4j/.classpath7
-rw-r--r--org.eclipse.osee.logger.slf4j/.project33
-rw-r--r--org.eclipse.osee.logger.slf4j/META-INF/MANIFEST.MF15
-rw-r--r--org.eclipse.osee.logger.slf4j/OSGI-INF/log.impl.provider.xml9
-rw-r--r--org.eclipse.osee.logger.slf4j/OSGI-INF/log.service.reader.xml13
-rw-r--r--org.eclipse.osee.logger.slf4j/build.properties5
-rw-r--r--org.eclipse.osee.logger.slf4j/pom.xml34
-rw-r--r--org.eclipse.osee.logger.slf4j/src/org/eclipse/osee/logger/slf4j/internal/OsgiSlf4jLogger.java38
-rw-r--r--org.eclipse.osee.logger.slf4j/src/org/eclipse/osee/logger/slf4j/internal/Sfl4jLogImpl.java207
-rw-r--r--org.eclipse.osee.logger.slf4j/src/org/eclipse/osee/logger/slf4j/internal/Slf4jLogListener.java78
-rw-r--r--org.eclipse.osee.logger/.classpath7
-rw-r--r--org.eclipse.osee.logger/.project28
-rw-r--r--org.eclipse.osee.logger/META-INF/MANIFEST.MF8
-rw-r--r--org.eclipse.osee.logger/build.properties4
-rw-r--r--org.eclipse.osee.logger/pom.xml34
-rw-r--r--org.eclipse.osee.logger/src/org/eclipse/osee/logger/Log.java47
-rw-r--r--org.eclipse.osee.ote.client.msg/.classpath7
-rw-r--r--org.eclipse.osee.ote.client.msg/.pmd925
-rw-r--r--org.eclipse.osee.ote.client.msg/.project33
-rw-r--r--org.eclipse.osee.ote.client.msg/META-INF/MANIFEST.MF22
-rw-r--r--org.eclipse.osee.ote.client.msg/OSGI-INF/MessageSubscriptionServiceComponent.xml12
-rw-r--r--org.eclipse.osee.ote.client.msg/build.properties5
-rw-r--r--org.eclipse.osee.ote.client.msg/pom.xml35
-rw-r--r--org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/IOteMessageService.java38
-rw-r--r--org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/AbstractMessageListener.java52
-rw-r--r--org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/IMessageDbFactory.java21
-rw-r--r--org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/IMessageSubscription.java59
-rw-r--r--org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/ISubscriptionListener.java58
-rw-r--r--org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/db/AbstractMessageDataBase.java204
-rw-r--r--org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/db/MessageInstance.java140
-rw-r--r--org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/Activator.java82
-rw-r--r--org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/ChannelProcessor.java136
-rw-r--r--org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/MessageDatabase.java73
-rw-r--r--org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/MessageReference.java64
-rw-r--r--org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/MessageServiceSupport.java191
-rw-r--r--org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/MessageSubscription.java257
-rw-r--r--org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/MessageSubscriptionService.java371
-rw-r--r--org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/OteClientServiceTracker.java67
-rw-r--r--org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/SubscriptionHandler.java9
-rw-r--r--org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/UpdateDispatcher.java173
-rw-r--r--org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/AbstractSubscriptionState.java56
-rw-r--r--org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/ActivateState.java96
-rw-r--r--org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/ISubscriptionState.java47
-rw-r--r--org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/InactiveState.java104
-rw-r--r--org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/UnresolvedState.java112
-rw-r--r--org.eclipse.osee.ote.client/.classpath7
-rw-r--r--org.eclipse.osee.ote.client/.pmd925
-rw-r--r--org.eclipse.osee.ote.client/.project28
-rw-r--r--org.eclipse.osee.ote.client/META-INF/MANIFEST.MF71
-rw-r--r--org.eclipse.osee.ote.client/build.properties4
-rw-r--r--org.eclipse.osee.ote.client/pom.xml35
-rw-r--r--org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/Activator.java46
-rw-r--r--org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/ConnectionEvent.java78
-rw-r--r--org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/IEnvironmentConfigurer.java21
-rw-r--r--org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/IOteClientService.java110
-rw-r--r--org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/ITestConnectionListener.java35
-rw-r--r--org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/ITestEnvironmentAvailibilityListener.java33
-rw-r--r--org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/ITestEnvironmentFilter.java20
-rw-r--r--org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/JmsToJiniBridgeConnector.java192
-rw-r--r--org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/OteServiceProperties.java119
-rw-r--r--org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/SessionDelegate.java48
-rw-r--r--org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/TestSessionException.java28
-rw-r--r--org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/ClientSession.java220
-rw-r--r--org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/ConnectionServiceTracker.java83
-rw-r--r--org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/ListenerNotifier.java94
-rw-r--r--org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/TestClientServiceImpl.java378
-rw-r--r--org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/TestHostConnection.java93
-rw-r--r--org.eclipse.osee.ote.connection.jini/.classpath7
-rw-r--r--org.eclipse.osee.ote.connection.jini/.pmd925
-rw-r--r--org.eclipse.osee.ote.connection.jini/.project28
-rw-r--r--org.eclipse.osee.ote.connection.jini/META-INF/MANIFEST.MF18
-rw-r--r--org.eclipse.osee.ote.connection.jini/build.properties5
-rw-r--r--org.eclipse.osee.ote.connection.jini/plugin.xml11
-rw-r--r--org.eclipse.osee.ote.connection.jini/pom.xml35
-rw-r--r--org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/Activator.java74
-rw-r--r--org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/ConnectorContribution.java24
-rw-r--r--org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/IJiniConnectorLink.java18
-rw-r--r--org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/IJiniConnectorRegistrar.java28
-rw-r--r--org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/JiniClientSideConnector.java68
-rw-r--r--org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/JiniConnector.java152
-rw-r--r--org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/JiniServiceSideConnector.java179
-rw-r--r--org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/TestEntry.java38
-rw-r--r--org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/util/LeaseRenewTask.java83
-rw-r--r--org.eclipse.osee.ote.connection.service.test/.classpath7
-rw-r--r--org.eclipse.osee.ote.connection.service.test/.pmd925
-rw-r--r--org.eclipse.osee.ote.connection.service.test/.project28
-rw-r--r--org.eclipse.osee.ote.connection.service.test/META-INF/MANIFEST.MF15
-rw-r--r--org.eclipse.osee.ote.connection.service.test/build.properties4
-rw-r--r--org.eclipse.osee.ote.connection.service.test/pom.xml31
-rw-r--r--org.eclipse.osee.ote.connection.service.test/src/org/eclipse/osee/ote/connection/service/test/Activator.java95
-rw-r--r--org.eclipse.osee.ote.connection.service.test/src/org/eclipse/osee/ote/connection/service/test/TestJiniService.java24
-rw-r--r--org.eclipse.osee.ote.connection.service/.classpath7
-rw-r--r--org.eclipse.osee.ote.connection.service/.pmd925
-rw-r--r--org.eclipse.osee.ote.connection.service/.project28
-rw-r--r--org.eclipse.osee.ote.connection.service/META-INF/MANIFEST.MF15
-rw-r--r--org.eclipse.osee.ote.connection.service/build.properties5
-rw-r--r--org.eclipse.osee.ote.connection.service/plugin.xml6
-rw-r--r--org.eclipse.osee.ote.connection.service/pom.xml35
-rw-r--r--org.eclipse.osee.ote.connection.service/schema/org.eclipse.osee.connection.service.ext.exsd102
-rw-r--r--org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IConnectionService.java45
-rw-r--r--org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IConnectorContributor.java16
-rw-r--r--org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IConnectorFilter.java18
-rw-r--r--org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IConnectorListener.java29
-rw-r--r--org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IFileKey.java18
-rw-r--r--org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IServiceConnector.java71
-rw-r--r--org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IServicePropertyChangeListener.java20
-rw-r--r--org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/LocalConnector.java131
-rw-r--r--org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/LocalFileKey.java29
-rw-r--r--org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/internal/Activator.java69
-rw-r--r--org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/internal/ConnectionServiceImpl.java115
-rw-r--r--org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/internal/EventNotifier.java79
-rw-r--r--org.eclipse.osee.ote.container/.classpath7
-rw-r--r--org.eclipse.osee.ote.container/.pmd925
-rw-r--r--org.eclipse.osee.ote.container/.project28
-rw-r--r--org.eclipse.osee.ote.container/META-INF/MANIFEST.MF19
-rw-r--r--org.eclipse.osee.ote.container/build.properties5
-rw-r--r--org.eclipse.osee.ote.container/plugin.xml20
-rw-r--r--org.eclipse.osee.ote.container/pom.xml17
-rw-r--r--org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/IUserLibListener.java20
-rw-r--r--org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/JarChangeResourceListener.java158
-rw-r--r--org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/LibraryChangeProvider.java62
-rw-r--r--org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/OteClasspathContainer.java176
-rw-r--r--org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/OteClasspathContainerInitializer.java33
-rw-r--r--org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/OteContainerActivator.java82
-rw-r--r--org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/OteContainerPage.java61
-rw-r--r--org.eclipse.osee.ote.core.test/.classpath7
-rw-r--r--org.eclipse.osee.ote.core.test/.project28
-rw-r--r--org.eclipse.osee.ote.core.test/META-INF/MANIFEST.MF13
-rw-r--r--org.eclipse.osee.ote.core.test/build.properties4
-rw-r--r--org.eclipse.osee.ote.core.test/data/loading.test1.jarbin0 -> 1167 bytes
-rw-r--r--org.eclipse.osee.ote.core.test/data/loading.test2.jarbin0 -> 1176 bytes
-rw-r--r--org.eclipse.osee.ote.core.test/data/loading.test3.jarbin0 -> 1182 bytes
-rw-r--r--org.eclipse.osee.ote.core.test/pom.xml17
-rw-r--r--org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/OTEApiTest.java223
-rw-r--r--org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/OTEStatusCallbackForTests.java37
-rw-r--r--org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/core/XmlSupportTest.java36
-rw-r--r--org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/core/environment/status/msg/SerializedMessageTest.java32
-rw-r--r--org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/core/log/record/PropertyStoreRecordTest.java81
-rw-r--r--org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/endpoint/OteUdpEndpointTest.java43
-rw-r--r--org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/data/MemoryResourceTest.java43
-rw-r--r--org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/BiSci16ElementTest.java167
-rw-r--r--org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/CharElementTest.java80
-rw-r--r--org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/Float32ElementTest.java87
-rw-r--r--org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/Float64ElementTest.java88
-rw-r--r--org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/IntegerElementTest.java270
-rw-r--r--org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/LongIntegerElementTest.java224
-rw-r--r--org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/RecordMapTest.java50
-rw-r--r--org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/SignedInteger16ElementTest.java69
-rw-r--r--org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/StringElementTest.java190
-rw-r--r--org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/ISequenceHandle.java20
-rw-r--r--org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/SequenceHandle.java53
-rw-r--r--org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/TestEnum.java41
-rw-r--r--org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/TestMemType.java32
-rw-r--r--org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/TestMessage.java76
-rw-r--r--org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/TestMessageData.java44
-rw-r--r--org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/TestRecordElement.java22
-rw-r--r--org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/UnitTestAccessor.java668
-rw-r--r--org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/UnitTestSupport.java439
-rw-r--r--org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/other/TestEnumElementOperations.java92
-rw-r--r--org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/other/TestFloat32Operations.java57
-rw-r--r--org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/other/TestIntegerOperations.java333
-rw-r--r--org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/other/TestMessageOperations.java97
-rw-r--r--org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/other/TestStringOperations.java95
-rw-r--r--org.eclipse.osee.ote.core/.classpath7
-rw-r--r--org.eclipse.osee.ote.core/.cvsignore1
-rw-r--r--org.eclipse.osee.ote.core/.pmd925
-rw-r--r--org.eclipse.osee.ote.core/.project33
-rw-r--r--org.eclipse.osee.ote.core/META-INF/MANIFEST.MF95
-rw-r--r--org.eclipse.osee.ote.core/OSGI-INF/StatusBoardComponent.xml8
-rw-r--r--org.eclipse.osee.ote.core/OSGI-INF/message.service.handler.xml6
-rw-r--r--org.eclipse.osee.ote.core/OSGI-INF/org.eclipse.osee.ote.io.xml6
-rw-r--r--org.eclipse.osee.ote.core/OSGI-INF/ote.api.component.xml14
-rw-r--r--org.eclipse.osee.ote.core/OSGI-INF/ote.endpoint.component.xml9
-rw-r--r--org.eclipse.osee.ote.core/OSGI-INF/ote.runtime.manager.xml8
-rw-r--r--org.eclipse.osee.ote.core/OSGI-INF/ote.server.runtime.cache.component.xml8
-rw-r--r--org.eclipse.osee.ote.core/OSGI-INF/ote.sessions.xml7
-rw-r--r--org.eclipse.osee.ote.core/OSGI-INF/oteapi.handler.xml7
-rw-r--r--org.eclipse.osee.ote.core/build.properties8
-rw-r--r--org.eclipse.osee.ote.core/images/laser_16_16.gifbin0 -> 1092 bytes
-rw-r--r--org.eclipse.osee.ote.core/plugin.xml30
-rw-r--r--org.eclipse.osee.ote.core/pom.xml35
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/Configuration.java31
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/ConfigurationItem.java47
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/ConfigurationStatus.java32
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/ConfigurationStatusCallback.java9
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/HostServerProperties.java20
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/NonRemoteUserSession.java98
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/OTEApi.java132
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/OTEException.java21
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/OTEServerRuntimeCache.java26
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/OTEStatusCallback.java18
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/OTETestEnvironmentClient.java388
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/OseeLogStatusCallback.java39
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/WaitForCompletion.java67
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/BundleResourceFinder.java34
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/ClassFinder.java34
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/ClassServer.java318
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/ClassServerPermissions.java50
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/FrameworkResourceFinder.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/HeadlessClassServer.java88
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/PathResourceFinder.java255
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/ResourceFinder.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/classserver.properties15
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/collections/ObjectPool.java32
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/collections/ObjectPoolConfiguration.java23
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/AbstractRemoteSession.java40
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/BaseUdpReceiveRunnable.java88
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/BundleInfo.java171
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ConnectionRequestResult.java54
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/CopyOnWriteNoIteratorList.java128
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ExecutionUnitException.java27
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/GCHelper.java118
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/IRemoteUserSession.java54
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ITestClient.java22
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/IUserSession.java53
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/MethodFormatter.java158
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OSEEPerson1_4.java71
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OTESessionManager.java13
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OseeTestThread.java167
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OseeURLClassLoader.java77
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OteBundleLocator.java26
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OteLevel.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OteProperties.java67
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ReturnFormatter.java93
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ReturnStatus.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ServerApplication.java23
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ServiceUtility.java112
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/StandardShell.java94
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestCase.java461
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestException.java52
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestPointTally.java56
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestPrompt.java61
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestPromptImpl.java166
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestScript.java628
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestScriptLogFilter.java38
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/XmlSupport.java153
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/annotations/OteEventTopic.java22
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/annotations/OteProperty.java22
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/CommandId.java20
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/Name.java15
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/Namespace.java15
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/Source.java18
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/StringCommandId.java55
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/StringName.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/StringNamespace.java36
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/UriSource.java41
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/enums/PromptResponseType.java32
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/enums/ScriptTypeEnum.java23
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/enums/SkynetTestTypes.java21
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/enums/SupportedScriptTypes.java36
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/AsynchRemoteJobs.java68
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/BundleConfigurationReport.java43
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/BundleDescription.java134
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/BundleResolveException.java38
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/ConsoleOutputJob.java34
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/EnvironmentTask.java105
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/IScriptCompleteEvent.java18
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/IScriptSetupEvent.java18
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/OteLogFile.java79
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/ReportDataControl.java77
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/ScriptControl.java81
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestEnvironment.java594
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestEnvironmentConfig.java46
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestEnvironmentInterface.java95
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestEnvironmentLogFilter.java40
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestServerMode.java47
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TimerControl.java68
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/command/CommandDescription.java63
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/command/RunTestScriptDescription.java94
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/command/TestEnvironmentCommand.java49
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/config/ScriptVersionConfig.java167
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/config/TestScriptConfig.java61
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/config/TesterConfig.java65
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/ConsoleCommand.java75
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/ConsoleCommandManager.java57
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/ConsoleShell.java93
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/ICommandManager.java24
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/BenchmarkCommand.java104
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/HostCmd.java39
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/LastCmd.java34
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/ListSystemPropertiesCmd.java48
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/MemoryUsageCommand.java36
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/BasicTimeout.java27
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IAssociatedObjectListener.java18
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ICancelTimer.java19
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IEnvironmentFactory.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IExecutionUnitManagement.java34
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IHostTestEnvironment.java35
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IOTypeDefinition.java20
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IOTypeHandlerDefinition.java24
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IOutfileResults.java17
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IRemoteCommandConsole.java21
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IReportData.java24
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IRuntimeLibraryManager.java46
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IScriptCompleteListener.java20
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IScriptControl.java38
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IScriptInitializer.java21
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IServiceCommand.java19
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestEnvironment.java44
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestEnvironmentAccessor.java53
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestEnvironmentListener.java33
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestEnvironmentServiceConfig.java53
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestGroup.java33
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestLogger.java73
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestPoint.java29
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestStation.java35
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITimeTypeControl.java23
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITimeout.java17
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITimerControl.java51
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/OteUtil.java28
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/RuntimeLibraryListener.java20
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/jini/EclipseConsolePrintStream.java234
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/jini/EclipseConsoleWriter.java72
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/jini/ITestEnvironmentCommandCallback.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/jini/InputStreamConnection.java44
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/CommandAdded.java44
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/CommandEndedStatusEnum.java20
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/CommandRemoved.java53
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/CommandStatusEvent.java41
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/EnvironmentError.java41
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/ExceptionEvent.java33
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/IServiceStatusData.java18
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/IServiceStatusDataCommand.java21
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/IServiceStatusDataVisitor.java36
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/OTEStatusBoard.java46
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/SequentialCommandBegan.java42
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/SequentialCommandEnded.java50
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/StatusBoard.java244
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/StatusBoardRunnable.java26
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestComplete.java61
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestPointStatusBoardRunnable.java34
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestPointUpdate.java68
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestServerCommandComplete.java43
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestStart.java49
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/CommandAddedMessage.java33
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/CommandRemovedMessage.java34
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/EnvErrorMessage.java34
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/SequentialCommandBeganMessage.java34
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/SequentialCommandEndedMessage.java34
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/TestCompleteMessage.java34
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/TestPointUpdateMessage.java33
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/TestServerCommandCompleteMessage.java35
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/TestStartMessage.java34
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/BaseCommandContextFactory.java22
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/BaseRunManager.java138
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/BaseTestLifecycleListenerProvider.java123
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/DestroyableService.java15
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/ICommandContextFactory.java21
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/IMethodResult.java23
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/IRunManager.java36
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/ITestLifecycleListener.java25
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/ITestLifecycleListenerProvider.java31
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/MethodResultImpl.java82
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/ResultBuilder.java51
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/ReturnCode.java20
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/adapter/TestLifecycleListenerAdapter.java44
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/BaseCommandManager.java54
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/BatchLog.java54
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/CommandCompleteListener.java18
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/ICommandHandle.java26
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/ICommandManager.java18
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/ITestCommandResult.java19
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/ITestContext.java24
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/ITestServerCommand.java29
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/RunTests.java256
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/RunTestsHandle.java64
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/RunTestsKeys.java29
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/TestCallableWrapper.java55
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/TestCommandComplete.java52
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/TestCommandResult.java43
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/TestCommandStatus.java17
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/event/BaseEvent.java65
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/event/BaseEventDataProvider.java23
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/event/IEventData.java23
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/event/IEventDataProvider.java20
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/AbstractInteractivePrompt.java101
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/AbstractRemotePrompt.java53
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/BlockingMessagePrompt.java68
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/IPassFailPromptResponse.java20
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/IPromptHandle.java23
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/IResumeResponse.java20
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/ISteppingPrompt.java22
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/IUserInputPromptResponse.java20
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/IYesNoPromptResponse.java17
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/InformationalPrompt.java57
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/NonBlockingMessagePrompt.java38
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/OfpDebugPrompt.java46
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/PassFailPromptImpl.java36
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/PassFailPromptResult.java36
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/ScriptPausePromptImpl.java36
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/ScriptSteppingPrompt.java43
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/UserInputPromptImpl.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/YesNoPromptImpl.java34
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/YesNoPromptResult.java23
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/ElementHandlers.java67
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/IBaseSaxElementListener.java22
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/OteSaxHandler.java214
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/ProcessOutfileOverview.java127
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Actual.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/AdditionalInfo.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Argument.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Attention.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/CheckGroup.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/CheckGroupData.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/CheckPoint.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Config.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ConfigData.java29
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/CurrentProcessor.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Debug.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ElapsedTime.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Environment.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ExecutedBy.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ExecutionDate.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Expected.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Global.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/GroupName.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Info.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/InfoData.java31
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/InfoGroup.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/InfoGroupData.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Location.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Message.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/MethodArguments.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/MethodName.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Name.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Notes.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Number.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/NumberOfTransmissions.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ObjectName.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OfpErrorEntry.java31
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OfpErrorEntryData.java58
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OfpLoggingInfo.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OteLog.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OteLogData.java39
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/PropertyElementHandler.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/PropertyElementHandlerData.java24
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/PropertyStoreElementHandler.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Qualification.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/QualificationData.java40
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Requirement.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Result.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/RetryGroup.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/RetryGroupData.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ReturnValue.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/RuntimeVersions.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptInit.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptName.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptResult.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptVersion.java31
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptVersionData.java75
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SoftKeyInfoGroup.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SoftKeyInfoGroupData.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Stacktrace.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/StacktraceData.java43
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Summary.java32
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SummaryData.java84
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Support.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SystemInfo.java34
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SystemInfoData.java67
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestCase.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestEventElement.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestPoint.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestPointName.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestPointResults.java32
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestPointResultsData.java59
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestScript.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ThrowableElement.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Time.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TimeSummary.java32
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TimeSummaryData.java58
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Tracability.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Trace.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TraceEnd.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Type.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/User.java29
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/UserData.java49
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Value.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Version.java31
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/VersionData.java58
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/VersionInformation.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Witnesses.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/BaseTestRunListenerDataProvider.java45
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/BaseTestRunListenerProvider.java131
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/BaseTestRunListenerProviderFactory.java25
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/BaseTestRunManager.java146
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestFactory.java21
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestResultCollector.java25
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestResultCollectorFactory.java19
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestRunListener.java25
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestRunListenerDataProvider.java28
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestRunListenerProvider.java31
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestRunListenerProviderFactory.java17
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestRunManager.java35
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/TestRunThread.java171
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/thread/OteThread.java23
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/thread/OteThreadFactory.java49
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/thread/OteThreadManager.java53
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/internal/Activator.java145
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/internal/OTESessionManagerImpl.java60
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/internal/StatusBoardRegistrationHandler.java45
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/Env.java90
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/GCHelper.java221
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/ITestPointTally.java35
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/ScriptLogHandler.java193
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/TestLevel.java39
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/TestLogger.java323
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/AttentionRecord.java84
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/DebugRecord.java45
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/ErrorRecord.java98
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/InfoRecord.java40
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/ParentLogRecord.java39
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/PropertyStoreRecord.java69
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/RequirementRecord.java49
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/ScriptConfigRecord.java221
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/ScriptInitRecord.java85
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/ScriptResultRecord.java95
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/SevereRecord.java44
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/SupportRecord.java44
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TestCaseRecord.java77
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TestDescriptionRecord.java54
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TestPointRecord.java214
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TestRecord.java341
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TraceRecord.java139
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TraceRecordEnd.java104
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/WarningRecord.java43
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/json/LogRecordModule.java34
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModel.java35
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModelKeyFactory.java20
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModelListener.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModelManager.java55
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModelManagerRemote.java40
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IRemoteModel.java20
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/ModelKey.java119
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/ModelState.java23
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/osgi/IServiceOperation.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/osgi/ServiceOperationExecutor.java105
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/test/shells/BashShell.java138
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/test/shells/TelnetShell.java339
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/test/tags/BaseTestTags.java75
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/test/tags/FunctionalTestTags.java36
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/testPoint/CheckGroup.java156
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/testPoint/CheckPoint.java156
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/testPoint/Operation.java55
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/testPoint/RetryGroup.java66
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/AddressBuffer.java31
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/EndpointDataProcessor.java11
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteEndpointReceiveRunnable.java174
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteEndpointSendRunnable.java147
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteEndpointSender.java21
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteEndpointUtil.java54
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteUdpEndpoint.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteUdpEndpointInlineSender.java70
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteUdpEndpointReceiverImpl.java42
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteUdpEndpointSender.java95
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/filetransfer/TcpFileTransfer.java282
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/filetransfer/TcpFileTransferHandle.java54
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/filetransfer/TransferProgressMonitor.java61
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/AddressResponseListener.java44
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/Configure.java58
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/ConfigureAndResponseListener.java143
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/ConnectionListener.java58
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/DisconnectListener.java39
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/DownloadConfiguration.java40
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/GetPropertiesListener.java49
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/OTEApiImpl.java278
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/OTEBundleLoader.java331
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/OTEFutureImpl.java64
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/OTEServerRuntimeCacheImpl.java222
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/OTESystemOutConnection.java91
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/OTESystemOutputHandler.java87
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/PhysicalTypesResponceListener.java42
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/RecordCommandListener.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/RemoteMessageServiceHandler.java86
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/RemoteOteApiHandler.java103
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/RunTestListener.java110
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/ServerShutdownListener.java69
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/SetBatchModeListener.java28
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/SetElementCommandListener.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/StopRecordCommandListener.java21
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/SubscriptionCommandListener.java48
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/TransferFileToClientListener.java54
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/UnSubscribeCommandListener.java42
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/ZeroizeElementCommandListener.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/endpoint/EndpointComponent.java148
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/message/event/send/NotifyOnResponse.java88
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/message/event/send/OteEventMessageFutureImpl.java143
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/message/event/send/OteEventMessageFutureMultipleResponseImpl.java38
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/message/event/send/OteEventMessageResponseFutureImpl.java54
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/message/event/send/TimeoutRunnable.java57
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/ElementPath.java107
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IInstrumentationRegistrationListener.java24
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IMemSourceChangeListener.java20
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IMessageDisposeListener.java20
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IMessageHeader.java37
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IMessageSendListener.java22
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IMessageTestContext.java22
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IOInstrumentationDB.java88
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IOType.java5
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IOteIO.java18
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IPreScriptInstantiation.java18
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/Message.java1355
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageDefinitionProvider.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageEventLogger.java100
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageListenerTrace.java232
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageProviderVersion.java47
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSendPeriodTrace.java165
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSendTrace.java161
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSink.java35
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageState.java59
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSystemException.java27
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSystemTestCase.java67
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSystemTestEnvironment.java128
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSystemTestScript.java127
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageTimeTrace.java57
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageTraceLogger.java12
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageTraceOutput.java136
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/TimeEvent.java20
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/TimeTrace.java63
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/UniversalMessageListener.java20
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/ChangeSubscription.java61
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/RecordCommand.java102
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/SetElementValue.java66
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/SetMessageModeCmd.java81
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/SubscribeToMessage.java64
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/UnSubscribeToMessage.java63
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/ZeroizeElement.java53
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/AbstractCondition.java34
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/AndCondition.java42
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/ChangesCondition.java49
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/ComparisonCondition.java55
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/DifferenceCondition.java69
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/EmptyStringCondition.java43
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/EqualityOperation.java72
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/EqualsCondition.java46
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/ICondition.java19
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/IDiscreteElementCondition.java16
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/InRangeCondition.java64
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/ListCondition.java67
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/MultiMessageCondition.java271
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/NotInRangeCondition.java43
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/NumericEvaluator.java47
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/OrCondition.java42
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/PulseCondition.java59
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/StringComparisonCondition.java55
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/StringOperation.java88
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/StringTrimCondition.java36
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/TransitionCondition.java61
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/TransmissionCountCondition.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/ByteArrayHolder.java43
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/DDSTypeSupport.java53
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/HeaderData.java41
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/IMessageDataVisitor.java18
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/MemoryResource.java511
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/MemoryResourceByteBuffer.java515
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/MessageData.java690
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/ArrayElement.java92
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/BiSci16Element.java224
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/BooleanElement.java75
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/CharElement.java611
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/Dec32Element.java81
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/DiscreteElement.java1473
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/Element.java316
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/EmptyEnum_Element.java135
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/EnumeratedElement.java193
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/FixedPointElement.java342
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/Float32Element.java137
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/Float64Element.java159
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/IElementVisitor.java49
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/IEnumValue.java17
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/IRecordFactory.java18
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/InaccessibleElement.java50
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/IntegerElement.java233
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/LongIntegerElement.java183
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/MsgWaitResult.java36
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/NonFilteredStringElement.java28
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/NumericElement.java31
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/RealElement.java107
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/RecordElement.java159
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/RecordMap.java137
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/SignedInteger16Element.java205
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/StringElement.java216
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingCharElement.java910
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingEmptyEnumElement.java348
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingEnumeratedElement.java381
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingFixedPointElement.java91
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingFloat32Element.java56
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingFloat64Element.java57
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingIntegerElement.java841
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingLongIntegerElement.java831
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingRecordElement.java52
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingSignedInteger16Element.java844
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingStringElement.java169
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/enums/DataType.java27
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/enums/EmptyEnum.java93
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/ADDRESS_TYPE.java83
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/FileAvailableRequest.java24
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/FileAvailableStatus.java27
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/MyObjectInputStream.java26
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/OteEventMessage.java76
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/OteEventMessageData.java48
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/OteEventMessageHeader.java112
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/OteEventMessageType.java35
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/OteEventMessageUtil.java149
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/SOCKET_ADDRESS_RECORD.java67
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/SerializedClassMessage.java75
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/send/OteEndpointSendEventMessage.java228
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/send/OteEventMessageCallable.java19
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/send/OteEventMessageFuture.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/send/OteEventMessageResponseCallable.java17
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/send/OteEventMessageResponseFuture.java19
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/send/OteSendEventMessage.java161
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/instrumentation/BaseIOInstrumentation.java77
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/instrumentation/IOInstrumentation.java27
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IMessageManager.java48
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IMessageRequestor.java30
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IMessageScheduleChangeListener.java24
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IMsgToolServiceClient.java28
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/INamespace.java15
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IOSEEMessageReader.java24
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IOSEEMessageReaderListener.java20
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IOSEEMessageWriter.java26
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IOSEEMessageWriterListener.java20
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IRemoteMessageService.java64
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/ITestAccessor.java25
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/ITestEnvironmentMessageSystem.java29
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/ITestEnvironmentMessageSystemAccessor.java26
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/Namespace.java40
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/internal/MessageIoManagementStarter.java64
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/io/IMessageIoDriver.java22
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/io/IMessageIoManagementService.java25
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/io/MessageIoManagementService.java79
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/listener/IOSEEMessageListener.java24
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/listener/MessageSystemListener.java333
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/listener/SPEED.java19
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/log/record/MessageJarConfigrecord.java58
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/timer/AlarmClock.java45
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/timer/CycleCountDown.java66
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/timer/RealTime.java160
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/timer/SimulatedTime.java204
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/IFileTransferHandle.java22
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/IUdpTransferListener.java29
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/MessageMode.java21
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/SubscriptionDetails.java46
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/SubscriptionKey.java51
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/TransferConfig.java92
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/UdpFileTransferHandler.java284
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/ElementEntryFactory.java145
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/IMessageEntryFactory.java20
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/MessageRecordConfig.java87
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/MessageRecorder.java115
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/RecUtil.java35
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/ArrayElementEntry.java76
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/BooleanElementEntry.java43
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/CharElementEntry.java41
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/EmptyEnumEntry.java42
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/EnumeratedElementEntry.java49
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/IElementEntry.java28
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/IMessageEntry.java17
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/IntegerElementEntry.java38
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/LongIntegerElementEntry.java38
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/RealElementEntry.java38
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/RecordElementEntry.java64
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/RecordMapEntry.java52
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/SignedInteger16ElementEntry.java38
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/StringElementEntry.java38
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/AVAILABLE_PHYSICAL_TYPES_REQ.java14
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/BooleanResponse.java19
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/ConfigurationAndResponse.java45
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/ConsoleInputMessage.java22
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/ConsoleMessage.java56
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/ConsoleOutputMessage.java24
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/DisconnectRemoteTestEnvironment.java19
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/GET_INET_ADDRESS_REQ.java19
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/GET_INET_ADDRESS_RESP.java20
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/JobStatus.java90
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/MESSAGE_META_DATA_STAT.java26
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RECORDING_COMPLETE.java13
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RequestHostEnvironmentProperties.java15
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RequestRemoteTestEnvironment.java35
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RunTestsCancel.java29
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RunTestsGetCommandResultReq.java25
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RunTestsGetCommandResultResp.java33
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RunTestsIsCancelled.java26
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RunTestsIsDone.java26
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RunTestsSerialized.java34
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SOCKET_ID.java83
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/STOP_RECORDING_CMD.java13
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedAvailablePhysicalTypesMessage.java34
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedConfigurationAndResponse.java32
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedConnectionRequestResult.java33
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedDisconnectRemoteTestEnvironment.java22
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedEnhancedProperties.java33
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedOTEJobStatus.java32
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedRecordCommandMessage.java33
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedRequestRemoteTestEnvironment.java24
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedSetElementMessage.java33
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedSubscribeToMessage.java33
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedSubscriptionDetailsMessage.java33
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedUnSubscribeMessage.java33
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedZeroizeElementMessage.java33
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/TestEnvironmentServerShutdown.java24
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/TestEnvironmentSetBatchMode.java24
-rw-r--r--org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/TestEnvironmentTransferFile.java27
-rw-r--r--org.eclipse.osee.ote.feature/.project17
-rw-r--r--org.eclipse.osee.ote.feature/build.properties4
-rw-r--r--org.eclipse.osee.ote.feature/feature.properties141
-rw-r--r--org.eclipse.osee.ote.feature/feature.xml28
-rw-r--r--org.eclipse.osee.ote.feature/license.html79
-rw-r--r--org.eclipse.osee.ote.feature/pom.xml13
-rw-r--r--org.eclipse.osee.ote.feature/sourceTemplateFeature/.gitkeep0
-rw-r--r--org.eclipse.osee.ote.help.ui.test/.classpath7
-rw-r--r--org.eclipse.osee.ote.help.ui.test/.project28
-rw-r--r--org.eclipse.osee.ote.help.ui.test/META-INF/MANIFEST.MF12
-rw-r--r--org.eclipse.osee.ote.help.ui.test/build.properties4
-rw-r--r--org.eclipse.osee.ote.help.ui.test/pom.xml30
-rw-r--r--org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/HelpContextTest.java87
-rw-r--r--org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/HelpTableOfContentTest.java63
-rw-r--r--org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/OteHelpUiTestSuite.java23
-rw-r--r--org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/util/ContextParser.java141
-rw-r--r--org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/util/HelpTestUtil.java43
-rw-r--r--org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/util/HtmlParser.java119
-rw-r--r--org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/util/TocParser.java103
-rw-r--r--org.eclipse.osee.ote.help.ui/.classpath7
-rw-r--r--org.eclipse.osee.ote.help.ui/.gitignore1
-rw-r--r--org.eclipse.osee.ote.help.ui/.project28
-rw-r--r--org.eclipse.osee.ote.help.ui/.settings/org.eclipse.pde.prefs32
-rw-r--r--org.eclipse.osee.ote.help.ui/META-INF/MANIFEST.MF10
-rw-r--r--org.eclipse.osee.ote.help.ui/about.html27
-rw-r--r--org.eclipse.osee.ote.help.ui/build-helper.xml49
-rw-r--r--org.eclipse.osee.ote.help.ui/build.properties11
-rw-r--r--org.eclipse.osee.ote.help.ui/contexts/contexts.xml74
-rw-r--r--org.eclipse.osee.ote.help.ui/intro/overviewExtensionContent.xml13
-rw-r--r--org.eclipse.osee.ote.help.ui/intro/tutorialsExtensionContent.xml26
-rw-r--r--org.eclipse.osee.ote.help.ui/plugin.xml31
-rw-r--r--org.eclipse.osee.ote.help.ui/pom.xml106
-rw-r--r--org.eclipse.osee.ote.help.ui/src/org/eclipse/osee/ote/help/ui/OteHelpContext.java43
-rw-r--r--org.eclipse.osee.ote.io/.classpath7
-rw-r--r--org.eclipse.osee.ote.io/.project33
-rw-r--r--org.eclipse.osee.ote.io/META-INF/MANIFEST.MF14
-rw-r--r--org.eclipse.osee.ote.io/OSGI-INF/org.eclipse.osee.ote.io.xml8
-rw-r--r--org.eclipse.osee.ote.io/OSGI-INF/ote.server.folder.component.xml7
-rw-r--r--org.eclipse.osee.ote.io/build.properties5
-rw-r--r--org.eclipse.osee.ote.io/pom.xml35
-rw-r--r--org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/OTEServerFolder.java107
-rw-r--r--org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/SystemOutput.java7
-rw-r--r--org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/SystemOutputListener.java15
-rw-r--r--org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/EarlyIORedirect.java77
-rw-r--r--org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/OTEFolderImpl.java327
-rw-r--r--org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/SpecializedInputStream.java76
-rw-r--r--org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/SpecializedOut.java23
-rw-r--r--org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/SpecializedOutputStream.java58
-rw-r--r--org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/SystemOutputImpl.java71
-rw-r--r--org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/SystemOutputListerImpl.java36
-rw-r--r--org.eclipse.osee.ote.jms/.classpath7
-rw-r--r--org.eclipse.osee.ote.jms/.project33
-rw-r--r--org.eclipse.osee.ote.jms/META-INF/MANIFEST.MF25
-rw-r--r--org.eclipse.osee.ote.jms/OSGI-INF/ote.endpoint.bridge.component.xml9
-rw-r--r--org.eclipse.osee.ote.jms/build.properties5
-rw-r--r--org.eclipse.osee.ote.jms/pom.xml35
-rw-r--r--org.eclipse.osee.ote.jms/src/org/eclipse/osee/ote/jms/bridge/EventToEndpoint.java45
-rw-r--r--org.eclipse.osee.ote.master.feature/.project17
-rw-r--r--org.eclipse.osee.ote.master.feature/build.properties1
-rw-r--r--org.eclipse.osee.ote.master.feature/feature.xml111
-rw-r--r--org.eclipse.osee.ote.master.feature/pom.xml13
-rw-r--r--org.eclipse.osee.ote.master.feature/sourceTemplateFeature/.gitkeep0
-rw-r--r--org.eclipse.osee.ote.master.product/.project11
-rw-r--r--org.eclipse.osee.ote.master.product/customize-product.xml103
-rw-r--r--org.eclipse.osee.ote.master.product/etc/ote.server.config.json8
-rw-r--r--org.eclipse.osee.ote.master.product/org.eclipse.osee.ote.master.product53
-rw-r--r--org.eclipse.osee.ote.master.product/pom.xml72
-rw-r--r--org.eclipse.osee.ote.master.rest.client/.classpath7
-rw-r--r--org.eclipse.osee.ote.master.rest.client/.project33
-rw-r--r--org.eclipse.osee.ote.master.rest.client/META-INF/MANIFEST.MF23
-rw-r--r--org.eclipse.osee.ote.master.rest.client/OSGI-INF/ote.master.rest.client.xml7
-rw-r--r--org.eclipse.osee.ote.master.rest.client/build.properties5
-rw-r--r--org.eclipse.osee.ote.master.rest.client/pom.xml35
-rw-r--r--org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/OTEMasterServer.java12
-rw-r--r--org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/OTEMasterServerAvailableNodes.java27
-rw-r--r--org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/OTEMasterServerResult.java21
-rw-r--r--org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/internal/AddServer.java50
-rw-r--r--org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/internal/GetAvailableServers.java39
-rw-r--r--org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/internal/HttpUtil.java24
-rw-r--r--org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/internal/OTEMasterServerImpl.java63
-rw-r--r--org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/internal/RemoveServer.java46
-rw-r--r--org.eclipse.osee.ote.master.rest.model/.classpath7
-rw-r--r--org.eclipse.osee.ote.master.rest.model/.project28
-rw-r--r--org.eclipse.osee.ote.master.rest.model/META-INF/MANIFEST.MF10
-rw-r--r--org.eclipse.osee.ote.master.rest.model/build.properties4
-rw-r--r--org.eclipse.osee.ote.master.rest.model/pom.xml35
-rw-r--r--org.eclipse.osee.ote.master.rest.model/src/org/eclipse/osee/ote/master/rest/model/OTEServer.java107
-rw-r--r--org.eclipse.osee.ote.master.rest.test/.classpath7
-rw-r--r--org.eclipse.osee.ote.master.rest.test/.project28
-rw-r--r--org.eclipse.osee.ote.master.rest.test/META-INF/MANIFEST.MF14
-rw-r--r--org.eclipse.osee.ote.master.rest.test/build.properties4
-rw-r--r--org.eclipse.osee.ote.master.rest.test/src/org/eclipse/osee/ote/master/rest/test/ClientAPITest.java120
-rw-r--r--org.eclipse.osee.ote.master.rest/.classpath7
-rw-r--r--org.eclipse.osee.ote.master.rest/.project33
-rw-r--r--org.eclipse.osee.ote.master.rest/META-INF/MANIFEST.MF15
-rw-r--r--org.eclipse.osee.ote.master.rest/OSGI-INF/ote.master.rest.application.xml8
-rw-r--r--org.eclipse.osee.ote.master.rest/build.properties6
-rw-r--r--org.eclipse.osee.ote.master.rest/plugin.xml33
-rw-r--r--org.eclipse.osee.ote.master.rest/pom.xml35
-rw-r--r--org.eclipse.osee.ote.master.rest/src/org/eclipse/osee/ote/master/rest/internal/OTEAvailableServersResource.java116
-rw-r--r--org.eclipse.osee.ote.master.rest/src/org/eclipse/osee/ote/master/rest/internal/OTEMasterApplication.java22
-rw-r--r--org.eclipse.osee.ote.master.rest/src/org/eclipse/osee/ote/master/rest/internal/OTERestApplication.java39
-rw-r--r--org.eclipse.osee.ote.master.rest/src/org/eclipse/osee/ote/master/rest/internal/Util.java63
-rw-r--r--org.eclipse.osee.ote.master.test/.classpath7
-rw-r--r--org.eclipse.osee.ote.master.test/.project28
-rw-r--r--org.eclipse.osee.ote.master.test/META-INF/MANIFEST.MF9
-rw-r--r--org.eclipse.osee.ote.master.test/build.properties4
-rw-r--r--org.eclipse.osee.ote.master.test/pom.xml35
-rw-r--r--org.eclipse.osee.ote.master.test/src/org/eclipse/osee/ote/master/internal/OTELookupImplTest.java177
-rw-r--r--org.eclipse.osee.ote.master/.classpath7
-rw-r--r--org.eclipse.osee.ote.master/.project33
-rw-r--r--org.eclipse.osee.ote.master/META-INF/MANIFEST.MF11
-rw-r--r--org.eclipse.osee.ote.master/OSGI-INF/ote.master.lookup.xml7
-rw-r--r--org.eclipse.osee.ote.master/build.properties5
-rw-r--r--org.eclipse.osee.ote.master/pom.xml35
-rw-r--r--org.eclipse.osee.ote.master/src/org/eclipse/osee/ote/master/OTELookup.java14
-rw-r--r--org.eclipse.osee.ote.master/src/org/eclipse/osee/ote/master/OTELookupServerEntry.java175
-rw-r--r--org.eclipse.osee.ote.master/src/org/eclipse/osee/ote/master/OTEServerType.java5
-rw-r--r--org.eclipse.osee.ote.master/src/org/eclipse/osee/ote/master/internal/LookupTimeoutMonitor.java42
-rw-r--r--org.eclipse.osee.ote.master/src/org/eclipse/osee/ote/master/internal/OTELookupImpl.java101
-rw-r--r--org.eclipse.osee.ote.messaging.dds/.classpath7
-rw-r--r--org.eclipse.osee.ote.messaging.dds/.pmd925
-rw-r--r--org.eclipse.osee.ote.messaging.dds/.project28
-rw-r--r--org.eclipse.osee.ote.messaging.dds/META-INF/MANIFEST.MF18
-rw-r--r--org.eclipse.osee.ote.messaging.dds/build.properties4
-rw-r--r--org.eclipse.osee.ote.messaging.dds/pom.xml35
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/Data.java55
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/DataSample.java63
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/DataStoreItem.java58
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/Duration.java49
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/IDestination.java18
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/IOteData.java29
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/ISource.java18
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/InstanceHandle.java24
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/InstanceStateKind.java39
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/Kind.java37
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/NotImplementedException.java30
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/ReturnCode.java65
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/SampleStateKind.java36
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/StatusKind.java50
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/Time.java64
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/ViewStateKind.java36
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/Condition.java35
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/GuardCondition.java33
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/QueryCondition.java60
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/ReadCondition.java68
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/StatusCondition.java53
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/WaitSet.java81
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/package.html13
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DataReader.java625
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DataWriter.java376
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DomainEntity.java29
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DomainParticipant.java619
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DomainParticipantFactory.java151
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/Entity.java148
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/EntityFactory.java25
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/PublicationBuiltinTopicData.java31
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/Publisher.java388
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/PublisherThread.java66
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/SampleInfo.java296
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/Subscriber.java337
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/SubscriptionBuiltinTopicData.java31
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/Topic.java226
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/package.html13
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/DataReaderListener.java73
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/DataWriterListener.java57
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/DomainParticipantListener.java37
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/Listener.java22
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/PublisherListener.java21
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/SubscriberListener.java30
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/TopicListener.java25
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/package.html13
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/package.html13
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/qos/QosPolicy.java54
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/qos/package.html13
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/DomainId.java55
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/Key.java29
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/TopicDescription.java45
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/TypeRegistry.java86
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/TypeSignature.java109
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/TypeSupport.java83
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/package.html13
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/CountedStatus.java53
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/InconsistentTopicStatus.java29
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/LivelinessChangedStatus.java77
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/LivelinessLostStatus.java30
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/OfferedDeadlineMissedStatus.java43
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/OfferedIncompatibleQosStatus.java62
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/PublicationMatchStatus.java44
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/RequestedDeadlineMissedStatus.java43
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/RequestedIncompatibleQosStatus.java61
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/SampleLostStatus.java29
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/SampleRejectedStatus.java54
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/SampleRejectedStatusKind.java52
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/Status.java21
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/SubscriptionMatchStatus.java44
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/package.html13
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/Driver.java179
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/IntMessage.java24
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/IntMessageReader.java87
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/IntMessageTypeSupport.java42
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/IntMessageWriter.java36
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/IntegerData.java97
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/package.html13
-rw-r--r--org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/package.html13
-rw-r--r--org.eclipse.osee.ote.p2/.project17
-rw-r--r--org.eclipse.osee.ote.p2/category.xml20
-rw-r--r--org.eclipse.osee.ote.p2/pom.xml93
-rw-r--r--org.eclipse.osee.ote.p2/version.xml71
-rw-r--r--org.eclipse.osee.ote.parent/.project11
-rw-r--r--org.eclipse.osee.ote.parent/build.sh2
-rw-r--r--org.eclipse.osee.ote.parent/buildLocal.sh3
-rw-r--r--org.eclipse.osee.ote.parent/pom.xml445
-rw-r--r--org.eclipse.osee.ote.properties/.classpath7
-rw-r--r--org.eclipse.osee.ote.properties/.project28
-rw-r--r--org.eclipse.osee.ote.properties/META-INF/MANIFEST.MF8
-rw-r--r--org.eclipse.osee.ote.properties/build.properties4
-rw-r--r--org.eclipse.osee.ote.properties/pom.xml35
-rw-r--r--org.eclipse.osee.ote.properties/src/org/eclipse/osee/ote/properties/OteProperties.java8
-rw-r--r--org.eclipse.osee.ote.properties/src/org/eclipse/osee/ote/properties/OtePropertiesCore.java130
-rw-r--r--org.eclipse.osee.ote.rest.client/.classpath7
-rw-r--r--org.eclipse.osee.ote.rest.client/.project33
-rw-r--r--org.eclipse.osee.ote.rest.client/META-INF/MANIFEST.MF30
-rw-r--r--org.eclipse.osee.ote.rest.client/OSGI-INF/ote.client.xml7
-rw-r--r--org.eclipse.osee.ote.rest.client/build.properties5
-rw-r--r--org.eclipse.osee.ote.rest.client/pom.xml35
-rw-r--r--org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/BasicProgress.java55
-rw-r--r--org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/ConfigurationStatusCallback.java12
-rw-r--r--org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/GetFileProgress.java6
-rw-r--r--org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/OTECacheItem.java31
-rw-r--r--org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/OteClient.java31
-rw-r--r--org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/Progress.java11
-rw-r--r--org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/ProgressWithCancel.java9
-rw-r--r--org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/internal/BaseClientCallable.java27
-rw-r--r--org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/internal/ConfigureOteServer.java114
-rw-r--r--org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/internal/GetOteServerFile.java51
-rw-r--r--org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/internal/OteClientImpl.java86
-rw-r--r--org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/internal/PrepareOteServerFile.java79
-rw-r--r--org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/internal/RunTests.java108
-rw-r--r--org.eclipse.osee.ote.rest.model/.classpath7
-rw-r--r--org.eclipse.osee.ote.rest.model/.project28
-rw-r--r--org.eclipse.osee.ote.rest.model/META-INF/MANIFEST.MF14
-rw-r--r--org.eclipse.osee.ote.rest.model/build.properties4
-rw-r--r--org.eclipse.osee.ote.rest.model/pom.xml35
-rw-r--r--org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/KeyValue.java62
-rw-r--r--org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/OTEConfiguration.java94
-rw-r--r--org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/OTEConfigurationIdentity.java38
-rw-r--r--org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/OTEConfigurationItem.java99
-rw-r--r--org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/OTEJobStatus.java91
-rw-r--r--org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/OTETestRun.java62
-rw-r--r--org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/Properties.java96
-rw-r--r--org.eclipse.osee.ote.rest/.classpath7
-rw-r--r--org.eclipse.osee.ote.rest/.project33
-rw-r--r--org.eclipse.osee.ote.rest/META-INF/MANIFEST.MF21
-rw-r--r--org.eclipse.osee.ote.rest/OSGI-INF/ote.configuration.store.xml9
-rw-r--r--org.eclipse.osee.ote.rest/OSGI-INF/ote.job.store.xml7
-rw-r--r--org.eclipse.osee.ote.rest/OSGI-INF/ote.rest.application.xml8
-rw-r--r--org.eclipse.osee.ote.rest/OSGI-INF/ote.run.tests.component.xml7
-rw-r--r--org.eclipse.osee.ote.rest/build.properties8
-rw-r--r--org.eclipse.osee.ote.rest/pom.xml35
-rw-r--r--org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/ConfigurationJobStatus.java101
-rw-r--r--org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/HTMLBuilder.java127
-rw-r--r--org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OTEConfigItemSort.java14
-rw-r--r--org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OTEStatusCallbackForRun.java44
-rw-r--r--org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteBatchResource.java203
-rw-r--r--org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteBatchesResource.java70
-rw-r--r--org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteConfigurationResource.java82
-rw-r--r--org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteConfigurationStore.java19
-rw-r--r--org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteConfigurationStoreImpl.java107
-rw-r--r--org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteFilesResource.java65
-rw-r--r--org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteJob.java13
-rw-r--r--org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteJobResource.java51
-rw-r--r--org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteJobStore.java16
-rw-r--r--org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteJobStoreImpl.java36
-rw-r--r--org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteJobsResource.java55
-rw-r--r--org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteRestApplication.java48
-rw-r--r--org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteRootResource.java95
-rw-r--r--org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteRunTestCommands.java9
-rw-r--r--org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteRunTestCommandsImpl.java28
-rw-r--r--org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteRunTestResource.java113
-rw-r--r--org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteRunTestResourceItem.java63
-rw-r--r--org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/ReverseAlphabeticalSort.java13
-rw-r--r--org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/TestResultSummary.java59
-rw-r--r--org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/TimeSort.java21
-rw-r--r--org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/TranslateUtil.java41
-rw-r--r--org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/ZIPGenerator.java57
-rw-r--r--org.eclipse.osee.ote.runtimeManager/.classpath7
-rw-r--r--org.eclipse.osee.ote.runtimeManager/.pmd925
-rw-r--r--org.eclipse.osee.ote.runtimeManager/.project28
-rw-r--r--org.eclipse.osee.ote.runtimeManager/META-INF/MANIFEST.MF33
-rw-r--r--org.eclipse.osee.ote.runtimeManager/build.properties5
-rw-r--r--org.eclipse.osee.ote.runtimeManager/plugin.xml47
-rw-r--r--org.eclipse.osee.ote.runtimeManager/pom.xml35
-rw-r--r--org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/EarlyStartup.java41
-rw-r--r--org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/JarListenerStub.java139
-rw-r--r--org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/LibJarListener.java159
-rw-r--r--org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/OteSystemLibsNature.java28
-rw-r--r--org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/OteUserLibsNature.java28
-rw-r--r--org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/PrecompiledListener.java151
-rw-r--r--org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/RuntimeManager.java44
-rw-r--r--org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/SafeWorkspaceTracker.java267
-rw-r--r--org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/UserLibResourceFinder.java74
-rw-r--r--org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/container/OteClasspathContainer.java199
-rw-r--r--org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/container/OteClasspathContainerInitializer.java33
-rw-r--r--org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/container/OteContainerPage.java61
-rw-r--r--org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/internal/ProjectChangeResourceListener.java29
-rw-r--r--org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/internal/RuntimeBundleServer.java75
-rw-r--r--org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/internal/RuntimeLibResourceFinder.java53
-rw-r--r--org.eclipse.osee.ote.server.external.feature/.project17
-rw-r--r--org.eclipse.osee.ote.server.external.feature/build.properties1
-rw-r--r--org.eclipse.osee.ote.server.external.feature/feature.xml76
-rw-r--r--org.eclipse.osee.ote.server.external.feature/pom.xml36
-rw-r--r--org.eclipse.osee.ote.server.external.feature/sourceTemplateFeature/.gitkeep0
-rw-r--r--org.eclipse.osee.ote.server/.classpath7
-rw-r--r--org.eclipse.osee.ote.server/.pmd925
-rw-r--r--org.eclipse.osee.ote.server/.project33
-rw-r--r--org.eclipse.osee.ote.server/META-INF/MANIFEST.MF46
-rw-r--r--org.eclipse.osee.ote.server/OSGI-INF/ConsoleCmd.xml7
-rw-r--r--org.eclipse.osee.ote.server/OSGI-INF/ote.server.start.xml5
-rw-r--r--org.eclipse.osee.ote.server/OSGI-INF/ote.service.starter.xml12
-rw-r--r--org.eclipse.osee.ote.server/build.properties5
-rw-r--r--org.eclipse.osee.ote.server/pom.xml35
-rw-r--r--org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/OteClose.java63
-rw-r--r--org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/OteServiceStarter.java25
-rw-r--r--org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/PropertyParamter.java57
-rw-r--r--org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/RemoteShell.java56
-rw-r--r--org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/TestEnvironmentFactory.java18
-rw-r--r--org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/TestEnvironmentServiceConfigImpl.java81
-rw-r--r--org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/internal/EnvironmentCreationParameter.java95
-rw-r--r--org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/internal/OTEServerCreationComponent.java107
-rw-r--r--org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/internal/OteService.java206
-rw-r--r--org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/internal/OteServiceStarterImpl.java424
-rw-r--r--org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/internal/RemoteTestEnvironment.java262
-rw-r--r--org.eclipse.osee.ote.ui.builder/.classpath7
-rw-r--r--org.eclipse.osee.ote.ui.builder/.project28
-rw-r--r--org.eclipse.osee.ote.ui.builder/META-INF/MANIFEST.MF17
-rw-r--r--org.eclipse.osee.ote.ui.builder/build.properties5
-rw-r--r--org.eclipse.osee.ote.ui.builder/plugin.xml57
-rw-r--r--org.eclipse.osee.ote.ui.builder/pom.xml35
-rw-r--r--org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/Activator.java50
-rw-r--r--org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/ArchiveBuilder.java93
-rw-r--r--org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/JarPackager.java108
-rw-r--r--org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/OTEBuilderPreferencePage.java65
-rw-r--r--org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/OTEPackagingBuilder.java174
-rw-r--r--org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/OTEPackagingNature.java81
-rw-r--r--org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/ToggleNatureHandler.java130
-rw-r--r--org.eclipse.osee.ote.ui.markers/.classpath7
-rw-r--r--org.eclipse.osee.ote.ui.markers/.pmd925
-rw-r--r--org.eclipse.osee.ote.ui.markers/.project28
-rw-r--r--org.eclipse.osee.ote.ui.markers/META-INF/MANIFEST.MF21
-rw-r--r--org.eclipse.osee.ote.ui.markers/build.properties5
-rw-r--r--org.eclipse.osee.ote.ui.markers/plugin.xml31
-rw-r--r--org.eclipse.osee.ote.ui.markers/pom.xml35
-rw-r--r--org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/CheckPointData.java55
-rw-r--r--org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/CheckPointHelper.java65
-rw-r--r--org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/ClearOteMarkerAction.java66
-rw-r--r--org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/ClearOteMarkerActionView.java59
-rw-r--r--org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/FileWatchList.java107
-rw-r--r--org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/MarkerInfo.java44
-rw-r--r--org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/MarkerPlugin.java122
-rw-r--r--org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/OteMarkerHelper.java143
-rw-r--r--org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/ProcessOutfileSax.java277
-rw-r--r--org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/StackTraceCollection.java32
-rw-r--r--org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/TestPointData.java57
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/.classpath7
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/.pmd925
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/.project33
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/META-INF/MANIFEST.MF55
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/build.properties7
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/add.gifbin0 -> 298 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/alert_obj.gifbin0 -> 146 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/binoculars.gifbin0 -> 964 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/check.gifbin0 -> 131 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/chkbox_disabled.gifbin0 -> 90 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/chkbox_enabled.gifbin0 -> 343 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/connected.gifbin0 -> 1312 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/connected_plug.gifbin0 -> 328 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/connected_sm.gifbin0 -> 1049 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/debugOutput.gifbin0 -> 683 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/debugOutput_sm.gifbin0 -> 617 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/delete.gifbin0 -> 163 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/disconnected_plug.gifbin0 -> 928 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/environment.gifbin0 -> 946 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/error.gifbin0 -> 84 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/error_stack.gifbin0 -> 603 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/file.gifbin0 -> 354 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/file_delete.gifbin0 -> 995 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/flatOutput.gifbin0 -> 680 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/flatOutput_sm.gifbin0 -> 616 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/fldr_obj.gifbin0 -> 916 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/glasses.gifbin0 -> 909 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/green_bug.gifbin0 -> 949 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/import_wiz.gifbin0 -> 327 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/light_bolt.gifbin0 -> 1049 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/loadConfig.gifbin0 -> 950 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/normalOutput.gifbin0 -> 684 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/normalOutput_sm.gifbin0 -> 611 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/ofp.gifbin0 -> 913 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/red_bug.gifbin0 -> 924 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/save_edit.gifbin0 -> 1039 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/saveas_edit.gifbin0 -> 982 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/scriptCancelled.gifbin0 -> 1797 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/scriptCancelled_sm.gifbin0 -> 1035 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/scriptCancelling.gifbin0 -> 2042 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/scriptCancelling_sm.gifbin0 -> 1033 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/scriptComplete.gifbin0 -> 2354 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/scriptComplete_sm.gifbin0 -> 1034 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/scriptInQueue.gifbin0 -> 1971 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/scriptInQueue_sm.gifbin0 -> 1034 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/scriptOutput.gifbin0 -> 1723 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/scriptOutput_sm.gifbin0 -> 1036 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/scriptReady.gifbin0 -> 1988 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/scriptReady_sm.gifbin0 -> 1035 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/scriptRunning.gifbin0 -> 676 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/sel_abort_stop.gifbin0 -> 190 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/sel_batch_abort_stop.gifbin0 -> 908 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/sel_run_exec.gifbin0 -> 987 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/showerr_tsk.gifbin0 -> 1005 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/test.gifbin0 -> 208 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/tm.gifbin0 -> 70 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/tmError.gifbin0 -> 96 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/tracability.gifbin0 -> 871 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/unsel_abort_stop.gifbin0 -> 137 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/unsel_batch_abort_stop.gifbin0 -> 153 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/images/unsel_run_exec.gifbin0 -> 968 bytes
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/plugin.xml89
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/pom.xml35
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/ITestManagerFactory.java37
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/OteTestManagerImage.java78
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/actions/AddToTestManagerEditorAction.java56
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/actions/AddToTestManagerPopupAction.java108
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/actions/TMBugAction.java32
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/ConfigFactory.java62
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/ConfigFileHandler.java54
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/ILoadConfig.java19
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/ISaveConfig.java24
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/LoadConfigurationOperation.java64
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/LoadWidget.java111
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/SaveWidget.java140
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/pages/LoadScriptPage.java162
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/pages/SaveScriptPage.java95
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/pages/ScriptPageConstants.java25
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/ScriptManager.java227
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/ScriptQueue.java42
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/StatusBoardRecieveEvent.done41
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/StatusBoardRecieveEvent.java34
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/TestManagerServiceStatusDataVisitor.java353
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/TestManagerStatusListener.java96
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/ITestManagerModel.java27
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/PageManager.java171
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerEditor.java593
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerEditorContributor.java103
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerEditorInput.java186
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerEditorInputFactory.java34
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerInput.java151
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/internal/ServiceUtility.java54
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/internal/TestManagerPlugin.java95
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/jobs/ScriptRunJob.java150
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/jobs/StoreOutfileJob.java170
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/models/FileModel.java195
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/models/OutputModel.java112
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/models/OutputModelJob.done70
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/models/OutputModelJob.java62
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/models/ScriptModel.java168
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/operations/AddIFileToTestManager.java95
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/AdvancedPage.java168
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/HostPage.java99
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/ScriptPage.java476
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/StatusWindowWidget.java137
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/TestManagerPage.java89
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/contributions/ScriptExecutionContribution.java119
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/contributions/TestManagerStorageKeys.java29
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/ITaskListViewer.java34
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/ScriptTableViewer.java528
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/ScriptTask.java181
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/ScriptTaskList.java121
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/xscript/XScriptTable.java90
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/xscript/XScriptTableContentProvider.java75
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/xscript/XScriptTableFactory.java72
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/xscript/XScriptTableLabelProvider.java125
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/panels/FileOrDirectorySelectionPanel.java160
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/panels/LoggingPanel.java137
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/panels/ScriptExecutionOptionsPanel.java100
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/preferences/TestManagerPreferencePage.java101
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/preferences/environment/EnvironmentPageDataViewer.java136
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/preferences/environment/EnvironmentPageEventHandler.java124
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/preferences/environment/EnvironmentPreferenceNode.java55
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/preferences/environment/EnvironmentPreferencePage.java331
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/ClassServerInst.java209
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/Dialogs.java26
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/EnvVariableDetailsDialog.java167
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/EnvVariableDetailsDialogHelper.java57
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/EnvVariableDialog.java125
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/EnvVariableDialogHelper.java56
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/OTEBuilderResourceFinder.java42
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/PluginUtil.java67
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/TestManagerSelectDialog.java70
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/WidgetFactory.java63
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/wizards/TestManagerNewWizard.java167
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/wizards/TestManagerNewWizardPage.java212
-rw-r--r--org.eclipse.osee.ote.ui.test.manager/support/output.xsd191
-rw-r--r--org.eclipse.osee.ote.ui/.classpath7
-rw-r--r--org.eclipse.osee.ote.ui/.pmd925
-rw-r--r--org.eclipse.osee.ote.ui/.project28
-rw-r--r--org.eclipse.osee.ote.ui/META-INF/MANIFEST.MF46
-rw-r--r--org.eclipse.osee.ote.ui/build.properties8
-rw-r--r--org.eclipse.osee.ote.ui/images/checkout.gifbin0 -> 577 bytes
-rw-r--r--org.eclipse.osee.ote.ui/images/connected_sm.gifbin0 -> 1049 bytes
-rw-r--r--org.eclipse.osee.ote.ui/images/welcome_item3.gifbin0 -> 124 bytes
-rw-r--r--org.eclipse.osee.ote.ui/plugin.xml75
-rw-r--r--org.eclipse.osee.ote.ui/pom.xml35
-rw-r--r--org.eclipse.osee.ote.ui/schema/WorkspaceSetup.exsd107
-rw-r--r--org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/IOteConsoleService.java34
-rw-r--r--org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/OteConsole.java78
-rw-r--r--org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/OteConsoleWrapper.java270
-rw-r--r--org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/OteImage.java41
-rw-r--r--org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/OteRemoteConsole.java83
-rw-r--r--org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/ProjectNatureTest.java50
-rw-r--r--org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/RemoteConsoleLauncher.java55
-rw-r--r--org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/TestPerspective.java77
-rw-r--r--org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/OteConsolePageParticipant.java90
-rw-r--r--org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/OteConsoleServiceImpl.java72
-rw-r--r--org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/OteServerConsole.java86
-rw-r--r--org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/TestCoreGuiPlugin.java171
-rw-r--r--org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/prefs/OteConsolePreferences.java43
-rw-r--r--org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/prefs/OteConsolePrefsUtil.java58
-rw-r--r--org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/wizard/OteConsolePrefsWizPage.java177
-rw-r--r--org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/wizard/OteConsolePrefsWizard.java48
-rw-r--r--org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/OteNavigateView.java126
-rw-r--r--org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/OteNavigateViewItems.java100
-rw-r--r--org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/OteNavigateViewerSorter.java34
-rw-r--r--org.eclipse.osee.ote.version.git.test/.classpath7
-rw-r--r--org.eclipse.osee.ote.version.git.test/.project28
-rw-r--r--org.eclipse.osee.ote.version.git.test/META-INF/MANIFEST.MF9
-rw-r--r--org.eclipse.osee.ote.version.git.test/build.properties4
-rw-r--r--org.eclipse.osee.ote.version.git.test/pom.xml35
-rw-r--r--org.eclipse.osee.ote.version.git.test/src/org/eclipse/osee/ote/version/git/GitVersionTest.java153
-rw-r--r--org.eclipse.osee.ote.version.git/.classpath7
-rw-r--r--org.eclipse.osee.ote.version.git/.project33
-rw-r--r--org.eclipse.osee.ote.version.git/META-INF/MANIFEST.MF18
-rw-r--r--org.eclipse.osee.ote.version.git/OSGI-INF/GITFileVersionInformationComponent.xml7
-rw-r--r--org.eclipse.osee.ote.version.git/build.properties5
-rw-r--r--org.eclipse.osee.ote.version.git/pom.xml35
-rw-r--r--org.eclipse.osee.ote.version.git/src/org/eclipse/osee/ote/version/git/GitFileVersion.java66
-rw-r--r--org.eclipse.osee.ote.version.git/src/org/eclipse/osee/ote/version/git/GitVersion.java84
-rw-r--r--org.eclipse.osee.ote.version.git/src/org/eclipse/osee/ote/version/git/GitVersionBase.java63
-rw-r--r--org.eclipse.osee.ote.version.git/src/org/eclipse/osee/ote/version/git/GitVersionProvider.java35
-rw-r--r--org.eclipse.osee.ote.version.git/src/org/eclipse/osee/ote/version/git/GitVersions.java83
-rw-r--r--org.eclipse.osee.ote.version.svn/.classpath7
-rw-r--r--org.eclipse.osee.ote.version.svn/.project33
-rw-r--r--org.eclipse.osee.ote.version.svn/META-INF/MANIFEST.MF19
-rw-r--r--org.eclipse.osee.ote.version.svn/OSGI-INF/svnFileVersionInformationComponent.xml8
-rw-r--r--org.eclipse.osee.ote.version.svn/build.properties6
-rw-r--r--org.eclipse.osee.ote.version.svn/pom.xml35
-rw-r--r--org.eclipse.osee.ote.version.svn/src/org/eclipse/osee/ote/version/svn/ScriptToProject.java82
-rw-r--r--org.eclipse.osee.ote.version.svn/src/org/eclipse/osee/ote/version/svn/SvnFileVersion.java65
-rw-r--r--org.eclipse.osee.ote.version.svn/src/org/eclipse/osee/ote/version/svn/SvnVersionProvider.java66
-rw-r--r--org.eclipse.osee.ote.version/.classpath7
-rw-r--r--org.eclipse.osee.ote.version/.project33
-rw-r--r--org.eclipse.osee.ote.version/META-INF/MANIFEST.MF10
-rw-r--r--org.eclipse.osee.ote.version/OSGI-INF/FileVersionInformationComponent.xml8
-rw-r--r--org.eclipse.osee.ote.version/build.properties5
-rw-r--r--org.eclipse.osee.ote.version/pom.xml35
-rw-r--r--org.eclipse.osee.ote.version/src/org/eclipse/osee/ote/version/FileVersion.java20
-rw-r--r--org.eclipse.osee.ote.version/src/org/eclipse/osee/ote/version/FileVersionInformation.java21
-rw-r--r--org.eclipse.osee.ote.version/src/org/eclipse/osee/ote/version/FileVersionInformationProvider.java19
-rw-r--r--org.eclipse.osee.ote.version/src/org/eclipse/osee/ote/version/internal/DefaultFileVersion.java67
-rw-r--r--org.eclipse.osee.ote.version/src/org/eclipse/osee/ote/version/internal/FileVersionInformationImpl.java56
-rw-r--r--org.eclipse.ote.bytemessage.test/.classpath2
-rw-r--r--org.eclipse.ote.bytemessage.test/.settings/org.eclipse.jdt.core.prefs6
-rw-r--r--org.eclipse.ote.bytemessage/.classpath2
-rw-r--r--org.eclipse.ote.bytemessage/.settings/org.eclipse.jdt.core.prefs6
-rw-r--r--org.eclipse.ote.io.test/.settings/org.eclipse.jdt.core.prefs6
-rw-r--r--org.eclipse.ote.io/.classpath2
-rw-r--r--org.eclipse.ote.io/.settings/org.eclipse.jdt.core.prefs6
-rw-r--r--org.eclipse.ote.mavenbuild/pom.xml8
-rw-r--r--org.eclipse.ote.message.lookup/.settings/org.eclipse.jdt.core.prefs6
-rw-r--r--org.eclipse.ote.services.core/.settings/org.eclipse.jdt.core.prefs6
-rw-r--r--org.eclipse.ote.statemachine.test/.settings/org.eclipse.jdt.core.prefs6
-rw-r--r--org.eclipse.ote.statemachine/.settings/org.eclipse.jdt.core.prefs6
-rw-r--r--org.eclipse.ote.ui.message.search/.settings/org.eclipse.jdt.core.prefs6
-rw-r--r--org.eclipse.ote.util/.settings/org.eclipse.jdt.core.prefs6
1423 files changed, 109296 insertions, 37 deletions
diff --git a/org.eclipse.osee.client.ote.feature/.pmd b/org.eclipse.osee.client.ote.feature/.pmd
new file mode 100644
index 000000000..c7b0a9fb3
--- /dev/null
+++ b/org.eclipse.osee.client.ote.feature/.pmd
@@ -0,0 +1,925 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<pmd>
+ <useProjectRuleSet>false</useProjectRuleSet>
+ <ruleSetFile>.ruleset</ruleSetFile>
+ <rules>
+ <rule>
+ <name>LooseCoupling</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneMethodMustImplementCloneable</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedImports</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SignatureDeclareThrowsException</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IfStmtsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>WhileLoopsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IfElseStmtsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ForLoopsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseSingleton</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanReturns</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanExpressions</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SwitchStmtsShouldHaveDefault</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDeeplyNestedIfStmts</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidReassigningParameters</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SwitchDensity</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConstructorCallsOverridableMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AccessorClassGeneration</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalFieldCouldBeStatic</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloseResource</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonStaticInitializer</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DefaultLabelNotLastInSwitchStmt</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonCaseLabelInSwitchStatement</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>OptimizableToArrayCall</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BadComparison</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EqualsNull</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConfusingTernary</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InstantiationToGetClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IdempotentOperations</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimpleDateFormatNeedsLocale</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ImmutableField</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseLocaleWithCaseConversions</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidProtectedFieldInFinalClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AssignmentToNonFinalStatic</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingStaticMethodInNonInstantiatableClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidSynchronizedAtMethodLevel</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingBreakInSwitch</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseNotifyAllInsteadOfNotify</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidInstanceofChecksInCatchClause</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractClassWithoutAbstractMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyConditional</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CompareObjectsWithEquals</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PositionLiteralsFirstInComparisons</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryLocalBeforeReturn</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonThreadSafeSingleton</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UncommentedEmptyMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UncommentedEmptyConstructor</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidConstantsInterface</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnsynchronizedStaticDateFormatter</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PreserveStackTrace</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseCollectionIsEmpty</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassWithOnlyPrivateConstructorsShouldBeFinal</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyMethodInAbstractClassShouldBeAbstract</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SingularField</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReturnEmptyArrayRatherThanNull</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractClassWithoutAnyMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooFewBranchesForASwitchStatement</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCatchingThrowable</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SignatureDeclareThrowsException</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExceptionAsFlowControl</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCatchingNPE</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingRawExceptionTypes</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingNullPointerException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidRethrowingException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotExtendJavaLangError</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotThrowExceptionInFinally</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingNewInstanceOfSameException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedPrivateField</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedLocalVariable</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedPrivateMethod</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedFormalParameter</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MoreThanOneLogger</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LoggerIsNotStaticFinal</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SystemPrintln</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidPrintStackTrace</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDuplicateLiterals</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringInstantiation</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringToString</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InefficientStringBuffering</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryCaseChange</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseStringBufferLength</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AppendCharacterWithChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConsecutiveLiteralAppends</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseIndexOfChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InefficientEmptyStringCheck</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InsufficientStringBufferDeclaration</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessStringValueOf</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringBufferInstantiationWithChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseEqualsToCompareStrings</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidStringBufferField</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceVectorWithList</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceHashtableWithMap</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceEnumerationWithIterator</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidEnumAsIdentifier</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidAssertAsIdentifier</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IntegerInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ByteInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ShortInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LongInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseBeforeAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseAfterAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseTestAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4SuitesShouldUseSuiteAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitUseExpected</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseProperClassLoader</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MDBAndSessionBeanNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>RemoteSessionInterfaceNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LocalInterfaceSessionNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LocalHomeNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>RemoteInterfaceNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotCallSystemExit</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StaticEJBFieldShouldBeFinal</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotUseThreads</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidInstantiatingObjectsInLoops</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseArrayListInsteadOfVector</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyStartsWith</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseStringBufferForStringAppends</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseArraysAsList</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidArrayLoops</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryWrapperObjectCreation</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AddEmptyString</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyCatchBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyIfStmt</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyWhileStmt</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyTryBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyFinallyBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptySwitchStatements</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JumbledIncrementer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ForLoopShouldBeWhileLoop</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryConversionTemporary</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>OverrideBothEqualsAndHashcode</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoubleCheckedLocking</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReturnFromFinallyBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptySynchronizedBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryReturn</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyStaticInitializer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnconditionalIfStatement</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyStatementNotInLoop</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanInstantiation</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryFinalModifier</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CollapsibleIfStatements</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessOverridingMethod</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassCastExceptionWithToArray</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDecimalLiteralsInBigDecimalConstructor</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessOperationOnImmutable</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MisplacedNullCheck</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedNullCheckInEquals</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThreadGroup</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BrokenNullCheck</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BigIntegerInstantiation</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingOctalValues</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingHardCodedIP</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CheckResultSet</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidMultipleUnaryOperators</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyInitializer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodReturnsInternalArray</name>
+ <ruleset>Security Code Guidelines</ruleset>
+ </rule>
+ <rule>
+ <name>ArrayIsStoredDirectly</name>
+ <ruleset>Security Code Guidelines</ruleset>
+ </rule>
+ <rule>
+ <name>CouplingBetweenObjects</name>
+ <ruleset>Coupling Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveImports</name>
+ <ruleset>Coupling Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LooseCoupling</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DuplicateImports</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DontImportJavaLang</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedImports</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ImportFromSamePackage</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyStaticImports</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitStaticSuite</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitSpelling</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitAssertionsShouldIncludeMessage</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitTestsShouldIncludeAssert</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TestClassWithoutTestCases</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryBooleanAssertion</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertEqualsInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertSameInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertNullInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanAssertion</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NullAssignment</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedModifier</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AssignmentInOperand</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AtLeastOneConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DontImportSun</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousOctalEscape</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CallSuperInConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryParentheses</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DefaultPackage</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanInversion</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DataflowAnomalyAnalysis</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFinalLocalVariable</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingShortType</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingVolatile</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingNativeCode</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidAccessibilityAlteration</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotCallGarbageCollectionExplicitly</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodNamingConventions</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassNamingConventions</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractNaming</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDollarSigns</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodWithSameNameAsEnclosingClass</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousHashcodeMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousConstantFieldName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousEqualsMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFieldNameMatchingTypeName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFieldNameMatchingMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NoPackage</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PackageCase</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MisleadingVariableName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanGetMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NPathComplexity</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveMethodLength</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveParameterList</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveClassLength</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CyclomaticComplexity</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessivePublicCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyFields</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssMethodCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssTypeCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssConstructorCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyMethods</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyFinalizer</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeOnlyCallsSuperFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeOverloaded</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeDoesNotCallSuperFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeShouldBeProtected</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCallingFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseCorrectExceptionLogging</name>
+ <ruleset>Jakarta Commons Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ProperLogger</name>
+ <ruleset>Jakarta Commons Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingSerialVersionUID</name>
+ <ruleset>JavaBean Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ProperCloneImplementation</name>
+ <ruleset>Clone Implementation Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneThrowsCloneNotSupportedException</name>
+ <ruleset>Clone Implementation Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneMethodMustImplementCloneable</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ </rules>
+ <includeDerivedFiles>false</includeDerivedFiles>
+ <violationsAsErrors>true</violationsAsErrors>
+</pmd>
diff --git a/org.eclipse.osee.client.ote.feature/.project b/org.eclipse.osee.client.ote.feature/.project
new file mode 100644
index 000000000..08dc78ffe
--- /dev/null
+++ b/org.eclipse.osee.client.ote.feature/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.client.ote.feature</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.pde.FeatureBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.FeatureNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.client.ote.feature/build.properties b/org.eclipse.osee.client.ote.feature/build.properties
new file mode 100644
index 000000000..f55cce2d2
--- /dev/null
+++ b/org.eclipse.osee.client.ote.feature/build.properties
@@ -0,0 +1,5 @@
+bin.includes = feature.xml,\
+ epl-v10.html,\
+ feature.properties,\
+ license.html
+generate.feature@org.eclipse.osee.client.ote.feature.source = org.eclipse.osee.client.ote.feature \ No newline at end of file
diff --git a/org.eclipse.osee.client.ote.feature/epl-v10.html b/org.eclipse.osee.client.ote.feature/epl-v10.html
new file mode 100644
index 000000000..ed4b19665
--- /dev/null
+++ b/org.eclipse.osee.client.ote.feature/epl-v10.html
@@ -0,0 +1,328 @@
+<html xmlns:o="urn:schemas-microsoft-com:office:office"
+xmlns:w="urn:schemas-microsoft-com:office:word"
+xmlns="http://www.w3.org/TR/REC-html40">
+
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
+<meta name=ProgId content=Word.Document>
+<meta name=Generator content="Microsoft Word 9">
+<meta name=Originator content="Microsoft Word 9">
+<link rel=File-List
+href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
+<title>Eclipse Public License - Version 1.0</title>
+<!--[if gte mso 9]><xml>
+ <o:DocumentProperties>
+ <o:Revision>2</o:Revision>
+ <o:TotalTime>3</o:TotalTime>
+ <o:Created>2004-03-05T23:03:00Z</o:Created>
+ <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
+ <o:Pages>4</o:Pages>
+ <o:Words>1626</o:Words>
+ <o:Characters>9270</o:Characters>
+ <o:Lines>77</o:Lines>
+ <o:Paragraphs>18</o:Paragraphs>
+ <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
+ <o:Version>9.4402</o:Version>
+ </o:DocumentProperties>
+</xml><![endif]--><!--[if gte mso 9]><xml>
+ <w:WordDocument>
+ <w:TrackRevisions/>
+ </w:WordDocument>
+</xml><![endif]-->
+<style>
+<!--
+ /* Font Definitions */
+@font-face
+ {font-family:Tahoma;
+ panose-1:2 11 6 4 3 5 4 4 2 4;
+ mso-font-charset:0;
+ mso-generic-font-family:swiss;
+ mso-font-pitch:variable;
+ mso-font-signature:553679495 -2147483648 8 0 66047 0;}
+ /* Style Definitions */
+p.MsoNormal, li.MsoNormal, div.MsoNormal
+ {mso-style-parent:"";
+ margin:0in;
+ margin-bottom:.0001pt;
+ mso-pagination:widow-orphan;
+ font-size:12.0pt;
+ font-family:"Times New Roman";
+ mso-fareast-font-family:"Times New Roman";}
+p
+ {margin-right:0in;
+ mso-margin-top-alt:auto;
+ mso-margin-bottom-alt:auto;
+ margin-left:0in;
+ mso-pagination:widow-orphan;
+ font-size:12.0pt;
+ font-family:"Times New Roman";
+ mso-fareast-font-family:"Times New Roman";}
+p.BalloonText, li.BalloonText, div.BalloonText
+ {mso-style-name:"Balloon Text";
+ margin:0in;
+ margin-bottom:.0001pt;
+ mso-pagination:widow-orphan;
+ font-size:8.0pt;
+ font-family:Tahoma;
+ mso-fareast-font-family:"Times New Roman";}
+@page Section1
+ {size:8.5in 11.0in;
+ margin:1.0in 1.25in 1.0in 1.25in;
+ mso-header-margin:.5in;
+ mso-footer-margin:.5in;
+ mso-paper-source:0;}
+div.Section1
+ {page:Section1;}
+-->
+</style>
+</head>
+
+<body lang=EN-US style='tab-interval:.5in'>
+
+<div class=Section1>
+
+<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
+</p>
+
+<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
+THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE,
+REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
+OF THIS AGREEMENT.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
+
+<p><span style='font-size:10.0pt'>&quot;Contribution&quot; means:</span> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+in the case of the initial Contributor, the initial code and documentation
+distributed under this Agreement, and<br clear=left>
+b) in the case of each subsequent Contributor:</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
+changes to the Program, and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
+additions to the Program;</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
+such changes and/or additions to the Program originate from and are distributed
+by that particular Contributor. A Contribution 'originates' from a Contributor
+if it was added to the Program by such Contributor itself or anyone acting on
+such Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in conjunction
+with the Program under their own license agreement, and (ii) are not derivative
+works of the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>&quot;Contributor&quot; means any person or
+entity that distributes the Program.</span> </p>
+
+<p><span style='font-size:10.0pt'>&quot;Licensed Patents &quot; mean patent
+claims licensable by a Contributor which are necessarily infringed by the use
+or sale of its Contribution alone or when combined with the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>&quot;Program&quot; means the Contributions
+distributed in accordance with this Agreement.</span> </p>
+
+<p><span style='font-size:10.0pt'>&quot;Recipient&quot; means anyone who
+receives the Program under this Agreement, including all Contributors.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+Subject to the terms of this Agreement, each Contributor hereby grants Recipient
+a non-exclusive, worldwide, royalty-free copyright license to<span
+style='color:red'> </span>reproduce, prepare derivative works of, publicly
+display, publicly perform, distribute and sublicense the Contribution of such
+Contributor, if any, and such derivative works, in source code and object code
+form.</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
+Subject to the terms of this Agreement, each Contributor hereby grants
+Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
+patent license under Licensed Patents to make, use, sell, offer to sell, import
+and otherwise transfer the Contribution of such Contributor, if any, in source
+code and object code form. This patent license shall apply to the combination
+of the Contribution and the Program if, at the time the Contribution is added
+by the Contributor, such addition of the Contribution causes such combination
+to be covered by the Licensed Patents. The patent license shall not apply to
+any other combinations which include the Contribution. No hardware per se is
+licensed hereunder. </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
+Recipient understands that although each Contributor grants the licenses to its
+Contributions set forth herein, no assurances are provided by any Contributor
+that the Program does not infringe the patent or other intellectual property
+rights of any other entity. Each Contributor disclaims any liability to Recipient
+for claims brought by any other entity based on infringement of intellectual
+property rights or otherwise. As a condition to exercising the rights and
+licenses granted hereunder, each Recipient hereby assumes sole responsibility
+to secure any other intellectual property rights needed, if any. For example,
+if a third party patent license is required to allow Recipient to distribute
+the Program, it is Recipient's responsibility to acquire that license before
+distributing the Program.</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
+Each Contributor represents that to its knowledge it has sufficient copyright
+rights in its Contribution, if any, to grant the copyright license set forth in
+this Agreement. </span></p>
+
+<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
+
+<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
+Program in object code form under its own license agreement, provided that:</span>
+</p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+it complies with the terms and conditions of this Agreement; and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
+its license agreement:</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
+effectively disclaims on behalf of all Contributors all warranties and
+conditions, express and implied, including warranties or conditions of title
+and non-infringement, and implied warranties or conditions of merchantability
+and fitness for a particular purpose; </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
+effectively excludes on behalf of all Contributors all liability for damages,
+including direct, indirect, special, incidental and consequential damages, such
+as lost profits; </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
+states that any provisions which differ from this Agreement are offered by that
+Contributor alone and not by any other party; and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
+states that source code for the Program is available from such Contributor, and
+informs licensees how to obtain it in a reasonable manner on or through a
+medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
+
+<p><span style='font-size:10.0pt'>When the Program is made available in source
+code form:</span> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+it must be made available under this Agreement; and </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
+copy of this Agreement must be included with each copy of the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
+copyright notices contained within the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
+originator of its Contribution, if any, in a manner that reasonably allows
+subsequent Recipients to identify the originator of the Contribution. </span></p>
+
+<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
+
+<p><span style='font-size:10.0pt'>Commercial distributors of software may
+accept certain responsibilities with respect to end users, business partners
+and the like. While this license is intended to facilitate the commercial use
+of the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create potential
+liability for other Contributors. Therefore, if a Contributor includes the
+Program in a commercial product offering, such Contributor (&quot;Commercial
+Contributor&quot;) hereby agrees to defend and indemnify every other
+Contributor (&quot;Indemnified Contributor&quot;) against any losses, damages and
+costs (collectively &quot;Losses&quot;) arising from claims, lawsuits and other
+legal actions brought by a third party against the Indemnified Contributor to
+the extent caused by the acts or omissions of such Commercial Contributor in
+connection with its distribution of the Program in a commercial product
+offering. The obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In order
+to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
+Contributor in writing of such claim, and b) allow the Commercial Contributor
+to control, and cooperate with the Commercial Contributor in, the defense and
+any related settlement negotiations. The Indemnified Contributor may participate
+in any such claim at its own expense.</span> </p>
+
+<p><span style='font-size:10.0pt'>For example, a Contributor might include the
+Program in a commercial product offering, Product X. That Contributor is then a
+Commercial Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance claims and
+warranties are such Commercial Contributor's responsibility alone. Under this
+section, the Commercial Contributor would have to defend claims against the
+other Contributors related to those performance claims and warranties, and if a
+court requires any other Contributor to pay any damages as a result, the
+Commercial Contributor must pay those damages.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
+
+<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
+AGREEMENT, THE PROGRAM IS PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT
+WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING,
+WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
+MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and distributing the
+Program and assumes all risks associated with its exercise of rights under this
+Agreement , including but not limited to the risks and costs of program errors,
+compliance with applicable laws, damage to or loss of data, programs or
+equipment, and unavailability or interruption of operations. </span></p>
+
+<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
+
+<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
+AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
+THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
+
+<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
+or unenforceable under applicable law, it shall not affect the validity or
+enforceability of the remainder of the terms of this Agreement, and without
+further action by the parties hereto, such provision shall be reformed to the
+minimum extent necessary to make such provision valid and enforceable.</span> </p>
+
+<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
+against any entity (including a cross-claim or counterclaim in a lawsuit)
+alleging that the Program itself (excluding combinations of the Program with
+other software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the date
+such litigation is filed. </span></p>
+
+<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
+shall terminate if it fails to comply with any of the material terms or
+conditions of this Agreement and does not cure such failure in a reasonable
+period of time after becoming aware of such noncompliance. If all Recipient's
+rights under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive. </span></p>
+
+<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
+copies of this Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The Agreement
+Steward reserves the right to publish new versions (including revisions) of
+this Agreement from time to time. No one other than the Agreement Steward has
+the right to modify this Agreement. The Eclipse Foundation is the initial
+Agreement Steward. The Eclipse Foundation may assign the responsibility to
+serve as the Agreement Steward to a suitable separate entity. Each new version
+of the Agreement will be given a distinguishing version number. The Program
+(including Contributions) may always be distributed subject to the version of
+the Agreement under which it was received. In addition, after a new version of
+the Agreement is published, Contributor may elect to distribute the Program
+(including its Contributions) under the new version. Except as expressly stated
+in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
+the intellectual property of any Contributor under this Agreement, whether
+expressly, by implication, estoppel or otherwise. All rights in the Program not
+expressly granted under this Agreement are reserved.</span> </p>
+
+<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
+State of New York and the intellectual property laws of the United States of
+America. No party to this Agreement will bring a legal action under this
+Agreement more than one year after the cause of action arose. Each party waives
+its rights to a jury trial in any resulting litigation.</span> </p>
+
+<p class=MsoNormal><![if !supportEmptyParas]>&nbsp;<![endif]><o:p></o:p></p>
+
+</div>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.client.ote.feature/feature.properties b/org.eclipse.osee.client.ote.feature/feature.properties
new file mode 100644
index 000000000..aea943865
--- /dev/null
+++ b/org.eclipse.osee.client.ote.feature/feature.properties
@@ -0,0 +1,141 @@
+###############################################################################
+# Copyright (c) 2004, 2007 Boeing and others.
+# 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:
+# Boeing - initial API and implementation
+###############################################################################
+# feature.properties
+# contains externalized strings for feature.xml
+# "%foo" in feature.xml corresponds to the key "foo" in this file
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file should be translated.
+
+# "featureName" property - name of the feature
+featureName=Eclipse OSEE Test Environment Feature (Incubation)
+
+# "providerName" property - name of the company that provides the feature
+providerName=Eclipse.org
+
+# "description" property - description of the feature
+description=Open System Engineering Environment - Test Environment
+
+# "copyright" property - text of the "Feature Update Copyright"
+copyright=\
+Copyright (c) 2004, 2009 Boeing and others.\n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License v1.0\n\
+which accompanies this distribution, and is available at\n\
+http://www.eclipse.org/legal/epl-v10.html\n\
+\n\
+Contributors:\n\
+ Boeing - initial API and implementation\n
+################ end of copyright property ####################################
+
+# "licenseURL" property - URL of the "Feature License"
+# do not translate value - just change to point to a locale-specific HTML page
+licenseURL=license.html
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+license=\
+ECLIPSE FOUNDATION SOFTWARE USER AGREEMENT\n\
+March 17, 2005\n\
+\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
+OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
+USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
+AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
+NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU\n\
+AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
+AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
+OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE\n\
+TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
+OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
+BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the Eclipse Foundation\n\
+is provided to you under the terms and conditions of the Eclipse Public\n\
+License Version 1.0 ("EPL"). A copy of the EPL is provided with this\n\
+Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code,\n\
+documentation and other files maintained in the Eclipse.org CVS\n\
+repository ("Repository") in CVS modules ("Modules") and made available\n\
+as downloadable archives ("Downloads").\n\
+\n\
+ - Content may be structured and packaged into modules to facilitate delivering,\n\
+ extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
+ plug-in fragments ("Fragments"), and features ("Features").\n\
+ - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java? ARchive)\n\
+ in a directory named "plugins".\n\
+ - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
+ Each Feature may be packaged as a sub-directory in a directory named "features".\n\
+ Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
+ numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+ - Features may also include other Features ("Included Features"). Within a Feature, files\n\
+ named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+Features may also include other Features ("Included Features"). Files named\n\
+"feature.xml" may contain a list of the names and version numbers of\n\
+Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be\n\
+contained in files named "about.html" ("Abouts"). The terms and\n\
+conditions governing Features and Included Features should be contained\n\
+in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
+Licenses may be located in any directory of a Download or Module\n\
+including, but not limited to the following locations:\n\
+\n\
+ - The top-level (root) directory\n\
+ - Plug-in and Fragment directories\n\
+ - Inside Plug-ins and Fragments packaged as JARs\n\
+ - Sub-directories of the directory named "src" of certain Plug-ins\n\
+ - Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
+Eclipse Update Manager, you must agree to a license ("Feature Update\n\
+License") during the installation process. If the Feature contains\n\
+Included Features, the Feature Update License should either provide you\n\
+with the terms and conditions governing the Included Features or inform\n\
+you where you can locate them. Feature Update Licenses may be found in\n\
+the "license" property of files named "feature.properties". Such Abouts,\n\
+Feature Licenses and Feature Update Licenses contain the terms and\n\
+conditions (or references to such terms and conditions) that govern your\n\
+use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES AND FEATURE UPDATE LICENSES MAY REFER\n\
+TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
+SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+ - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+ - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+ - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+ - IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html)\n\
+ - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+ - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
+TO USE OF THE CONTENT. If no About, Feature License or Feature Update License\n\
+is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
+govern that particular Content.\n\
+\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are\n\
+currently may have restrictions on the import, possession, and use,\n\
+and/or re-export to another country, of encryption software. BEFORE\n\
+using any encryption software, please check the country's laws,\n\
+regulations and policies concerning the import, possession, or use,\n\
+and re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.\n
+########### end of license property ##########################################
diff --git a/org.eclipse.osee.client.ote.feature/feature.xml b/org.eclipse.osee.client.ote.feature/feature.xml
new file mode 100644
index 000000000..44cb6edad
--- /dev/null
+++ b/org.eclipse.osee.client.ote.feature/feature.xml
@@ -0,0 +1,240 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+ id="org.eclipse.osee.client.ote.feature"
+ label="%featureName"
+ version="0.25.3.qualifier"
+ provider-name="%providerName">
+
+ <description>
+ %description
+ </description>
+
+ <copyright>
+ %copyright
+ </copyright>
+
+ <license url="%licenseURL">
+ %license
+ </license>
+
+ <requires>
+ <import plugin="org.eclipse.osee.framework.jdk.core"/>
+ <import plugin="org.eclipse.core.runtime"/>
+ <import plugin="org.apache.commons.net"/>
+ <import plugin="org.eclipse.osee.framework.logging"/>
+ <import plugin="net.jini" version="2.1.0" match="greaterOrEqual"/>
+ <import plugin="org.eclipse.osgi"/>
+ <import plugin="org.apache.xerces"/>
+ <import plugin="org.eclipse.osee.framework.core"/>
+ <import plugin="org.eclipse.osee.framework.plugin.core"/>
+ <import plugin="org.eclipse.osgi.services"/>
+ <import plugin="org.eclipse.ui" version="3.5.1" match="greaterOrEqual"/>
+ <import plugin="org.eclipse.core.resources"/>
+ <import plugin="org.eclipse.core.jobs"/>
+ <import plugin="org.eclipse.jface"/>
+ <import plugin="org.eclipse.osee.framework.ui.plugin"/>
+ <import plugin="org.eclipse.osee.framework.ui.swt"/>
+ <import plugin="org.eclipse.swt"/>
+ <import plugin="org.eclipse.ui.editors"/>
+ <import plugin="org.eclipse.ui.ide"/>
+ <import plugin="org.eclipse.ui.workbench.texteditor"/>
+ <import plugin="org.eclipse.jface.text"/>
+ <import plugin="org.eclipse.nebula.widgets.xviewer"/>
+ <import plugin="org.eclipse.osee.framework.ui.ws"/>
+ <import plugin="org.eclipse.jdt.core"/>
+ <import plugin="org.eclipse.osee.framework.jini"/>
+ <import plugin="org.eclipse.jdt.ui"/>
+ <import plugin="org.eclipse.ui.workbench"/>
+ <import plugin="jms.libraries"/>
+ <import plugin="org.apache.felix.gogo.runtime"/>
+ <import plugin="org.eclipse.jgit"/>
+ <import plugin="org.eclipse.team.svn.core"/>
+ <import plugin="javax.servlet"/>
+ <import plugin="javax.ws.rs" version="2.0.0" match="greaterOrEqual"/>
+ <import plugin="org.apache.commons.lang"/>
+ <import plugin="org.eclipse.core.net"/>
+ <import plugin="org.apache.cxf.core"/>
+ <import plugin="org.apache.cxf.jaxrs.client"/>
+ <import plugin="org.apache.cxf.jaxrs.frontend"/>
+ <import plugin="org.apache.cxf.jaxrs.model.wadl"/>
+ <import plugin="org.apache.cxf.jaxrs.provider"/>
+ <import plugin="org.apache.cxf.rs.security.oauth2"/>
+ <import plugin="org.apache.cxf.transport.http"/>
+ <import plugin="org.apache.aries.blueprint"/>
+ <import plugin="org.apache.aries.blueprint.annotation"/>
+ <import plugin="org.apache.aries.proxy"/>
+ <import plugin="org.apache.aries.quiesce"/>
+ <import plugin="org.apache.aries.util"/>
+ <import plugin="org.osgi.service.blueprint"/>
+ <import plugin="javax.wsdl"/>
+ <import plugin="javax.validation" version="1.1.0" match="greaterOrEqual"/>
+ <import plugin="javax.annotation" version="1.2.0" match="greaterOrEqual"/>
+ <import plugin="org.codehaus.jackson.core"/>
+ <import plugin="org.codehaus.jackson.jaxrs"/>
+ <import plugin="org.codehaus.jackson.mapper"/>
+ <import plugin="org.codehaus.jackson.xc"/>
+ <import plugin="com.sun.xml.fastinfoset"/>
+ </requires>
+
+ <plugin
+ id="org.eclipse.osee.ote.core"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.ote.messaging.dds"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.ote.ui"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.ote.ui.test.manager"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.ote.ui.markers"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.ote.client"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.ote.connection.jini"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.ote.connection.service"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.ote.client.msg"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.ote.runtimeManager"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.framework.ui.workspacebundleloader"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.ote.server"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.ote.jms"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.ote.version"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.ote.version.git"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.ote.version.svn"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.ote.rest.client"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.ote.rest.model"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.ote.master.rest.client"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.ote.master.rest.model"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.ote.ui.builder"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.ote.io"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.ote.properties"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+</feature>
diff --git a/org.eclipse.osee.client.ote.feature/license.html b/org.eclipse.osee.client.ote.feature/license.html
new file mode 100644
index 000000000..c6af966b6
--- /dev/null
+++ b/org.eclipse.osee.client.ote.feature/license.html
@@ -0,0 +1,79 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
+<title>Eclipse.org Software User Agreement</title>
+</head>
+
+<body lang="EN-US" link=blue vlink=purple>
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>March 17, 2005</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+ (COLLECTIVELY &quot;CONTENT&quot;). USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+ CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+ OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+ NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+ CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+ (&quot;EPL&quot;). A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+ For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository (&quot;Repository&quot;) in CVS
+ modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
+
+<ul>
+ <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content. Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+ <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
+ <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material. Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;. Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
+ and/or Fragments associated with that Feature.</li>
+ <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
+Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;). Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+ <li>The top-level (root) directory</li>
+ <li>Plug-in and Fragment directories</li>
+ <li>Inside Plug-ins and Fragments packaged as JARs</li>
+ <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
+ <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license (&quot;Feature Update License&quot;) during the
+installation process. If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them. Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS. SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+ <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+ <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+ <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+ <li>IBM Public License 1.0 (available at <a href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</a>)</li>
+ <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+ <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+ another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+ possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<small>Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.</small>
+</body>
+</html>
diff --git a/org.eclipse.osee.client.ote.feature/pom.xml b/org.eclipse.osee.client.ote.feature/pom.xml
new file mode 100644
index 000000000..9c66205be
--- /dev/null
+++ b/org.eclipse.osee.client.ote.feature/pom.xml
@@ -0,0 +1,17 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.osee</groupId>
+ <artifactId>org.eclipse.osee.ote.parent</artifactId>
+ <version>0.25.3-SNAPSHOT</version>
+ <relativePath>../org.eclipse.osee.ote.parent</relativePath>
+ </parent>
+
+ <artifactId>org.eclipse.osee.client.ote.feature</artifactId>
+ <packaging>eclipse-feature</packaging>
+ <name>OSEE OTE Feature (Incubation)</name>
+
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.client.ote.feature/sourceTemplateFeature/feature.properties b/org.eclipse.osee.client.ote.feature/sourceTemplateFeature/feature.properties
new file mode 100644
index 000000000..f6cd6d473
--- /dev/null
+++ b/org.eclipse.osee.client.ote.feature/sourceTemplateFeature/feature.properties
@@ -0,0 +1,144 @@
+###############################################################################
+# Copyright (c) 2004, 2007 Boeing and others.
+# 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:
+# Boeing - initial API and implementation
+###############################################################################
+# feature.properties
+# contains externalized strings for feature.xml
+# "%foo" in feature.xml corresponds to the key "foo" in this file
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file should be translated.
+
+# "featureName" property - name of the feature
+featureName=Eclipse OSEE Test Environment Feature Source (Incubation)
+
+# "providerName" property - name of the company that provides the feature
+providerName=Eclipse.org
+
+# "updateSiteName" property - label for the update site
+updateSiteName=OSEE Update Site
+
+# "description" property - description of the feature
+description=Open System Engineering Environment
+
+# "copyright" property - text of the "Feature Update Copyright"
+copyright=\
+Copyright (c) 2004, 2009 Boeing and others.\n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License v1.0\n\
+which accompanies this distribution, and is available at\n\
+http://www.eclipse.org/legal/epl-v10.html\n\
+\n\
+Contributors:\n\
+ Boeing - initial API and implementation\n
+################ end of copyright property ####################################
+
+# "licenseURL" property - URL of the "Feature License"
+# do not translate value - just change to point to a locale-specific HTML page
+licenseURL=license.html
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+license=\
+ECLIPSE FOUNDATION SOFTWARE USER AGREEMENT\n\
+March 17, 2005\n\
+\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
+OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
+USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
+AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
+NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU\n\
+AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
+AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
+OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE\n\
+TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
+OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
+BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the Eclipse Foundation\n\
+is provided to you under the terms and conditions of the Eclipse Public\n\
+License Version 1.0 ("EPL"). A copy of the EPL is provided with this\n\
+Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code,\n\
+documentation and other files maintained in the Eclipse.org CVS\n\
+repository ("Repository") in CVS modules ("Modules") and made available\n\
+as downloadable archives ("Downloads").\n\
+\n\
+ - Content may be structured and packaged into modules to facilitate delivering,\n\
+ extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
+ plug-in fragments ("Fragments"), and features ("Features").\n\
+ - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java? ARchive)\n\
+ in a directory named "plugins".\n\
+ - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
+ Each Feature may be packaged as a sub-directory in a directory named "features".\n\
+ Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
+ numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+ - Features may also include other Features ("Included Features"). Within a Feature, files\n\
+ named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+Features may also include other Features ("Included Features"). Files named\n\
+"feature.xml" may contain a list of the names and version numbers of\n\
+Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be\n\
+contained in files named "about.html" ("Abouts"). The terms and\n\
+conditions governing Features and Included Features should be contained\n\
+in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
+Licenses may be located in any directory of a Download or Module\n\
+including, but not limited to the following locations:\n\
+\n\
+ - The top-level (root) directory\n\
+ - Plug-in and Fragment directories\n\
+ - Inside Plug-ins and Fragments packaged as JARs\n\
+ - Sub-directories of the directory named "src" of certain Plug-ins\n\
+ - Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
+Eclipse Update Manager, you must agree to a license ("Feature Update\n\
+License") during the installation process. If the Feature contains\n\
+Included Features, the Feature Update License should either provide you\n\
+with the terms and conditions governing the Included Features or inform\n\
+you where you can locate them. Feature Update Licenses may be found in\n\
+the "license" property of files named "feature.properties". Such Abouts,\n\
+Feature Licenses and Feature Update Licenses contain the terms and\n\
+conditions (or references to such terms and conditions) that govern your\n\
+use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES AND FEATURE UPDATE LICENSES MAY REFER\n\
+TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
+SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+ - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+ - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+ - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+ - IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html)\n\
+ - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+ - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
+TO USE OF THE CONTENT. If no About, Feature License or Feature Update License\n\
+is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
+govern that particular Content.\n\
+\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are\n\
+currently may have restrictions on the import, possession, and use,\n\
+and/or re-export to another country, of encryption software. BEFORE\n\
+using any encryption software, please check the country's laws,\n\
+regulations and policies concerning the import, possession, or use,\n\
+and re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.\n
+########### end of license property ##########################################
diff --git a/org.eclipse.osee.client.ote.feature/sourceTemplateFeature/license.html b/org.eclipse.osee.client.ote.feature/sourceTemplateFeature/license.html
new file mode 100644
index 000000000..c6af966b6
--- /dev/null
+++ b/org.eclipse.osee.client.ote.feature/sourceTemplateFeature/license.html
@@ -0,0 +1,79 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
+<title>Eclipse.org Software User Agreement</title>
+</head>
+
+<body lang="EN-US" link=blue vlink=purple>
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>March 17, 2005</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+ (COLLECTIVELY &quot;CONTENT&quot;). USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+ CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+ OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+ NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+ CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+ (&quot;EPL&quot;). A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+ For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository (&quot;Repository&quot;) in CVS
+ modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
+
+<ul>
+ <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content. Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+ <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
+ <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material. Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;. Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
+ and/or Fragments associated with that Feature.</li>
+ <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
+Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;). Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+ <li>The top-level (root) directory</li>
+ <li>Plug-in and Fragment directories</li>
+ <li>Inside Plug-ins and Fragments packaged as JARs</li>
+ <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
+ <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license (&quot;Feature Update License&quot;) during the
+installation process. If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them. Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS. SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+ <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+ <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+ <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+ <li>IBM Public License 1.0 (available at <a href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</a>)</li>
+ <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+ <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+ another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+ possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<small>Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.</small>
+</body>
+</html>
diff --git a/org.eclipse.osee.framework.ui.workspacebundleloader.test/.project b/org.eclipse.osee.framework.ui.workspacebundleloader.test/.project
new file mode 100644
index 000000000..7fc7fc7ad
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader.test/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.ui.workspacebundleloader.test</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.framework.ui.workspacebundleloader/.classpath b/org.eclipse.osee.framework.ui.workspacebundleloader/.classpath
new file mode 100644
index 000000000..1fa3e6803
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.framework.ui.workspacebundleloader/.pmd b/org.eclipse.osee.framework.ui.workspacebundleloader/.pmd
new file mode 100644
index 000000000..c7b0a9fb3
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/.pmd
@@ -0,0 +1,925 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<pmd>
+ <useProjectRuleSet>false</useProjectRuleSet>
+ <ruleSetFile>.ruleset</ruleSetFile>
+ <rules>
+ <rule>
+ <name>LooseCoupling</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneMethodMustImplementCloneable</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedImports</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SignatureDeclareThrowsException</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IfStmtsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>WhileLoopsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IfElseStmtsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ForLoopsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseSingleton</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanReturns</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanExpressions</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SwitchStmtsShouldHaveDefault</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDeeplyNestedIfStmts</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidReassigningParameters</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SwitchDensity</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConstructorCallsOverridableMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AccessorClassGeneration</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalFieldCouldBeStatic</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloseResource</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonStaticInitializer</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DefaultLabelNotLastInSwitchStmt</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonCaseLabelInSwitchStatement</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>OptimizableToArrayCall</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BadComparison</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EqualsNull</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConfusingTernary</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InstantiationToGetClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IdempotentOperations</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimpleDateFormatNeedsLocale</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ImmutableField</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseLocaleWithCaseConversions</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidProtectedFieldInFinalClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AssignmentToNonFinalStatic</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingStaticMethodInNonInstantiatableClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidSynchronizedAtMethodLevel</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingBreakInSwitch</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseNotifyAllInsteadOfNotify</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidInstanceofChecksInCatchClause</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractClassWithoutAbstractMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyConditional</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CompareObjectsWithEquals</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PositionLiteralsFirstInComparisons</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryLocalBeforeReturn</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonThreadSafeSingleton</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UncommentedEmptyMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UncommentedEmptyConstructor</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidConstantsInterface</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnsynchronizedStaticDateFormatter</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PreserveStackTrace</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseCollectionIsEmpty</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassWithOnlyPrivateConstructorsShouldBeFinal</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyMethodInAbstractClassShouldBeAbstract</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SingularField</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReturnEmptyArrayRatherThanNull</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractClassWithoutAnyMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooFewBranchesForASwitchStatement</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCatchingThrowable</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SignatureDeclareThrowsException</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExceptionAsFlowControl</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCatchingNPE</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingRawExceptionTypes</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingNullPointerException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidRethrowingException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotExtendJavaLangError</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotThrowExceptionInFinally</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingNewInstanceOfSameException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedPrivateField</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedLocalVariable</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedPrivateMethod</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedFormalParameter</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MoreThanOneLogger</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LoggerIsNotStaticFinal</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SystemPrintln</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidPrintStackTrace</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDuplicateLiterals</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringInstantiation</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringToString</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InefficientStringBuffering</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryCaseChange</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseStringBufferLength</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AppendCharacterWithChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConsecutiveLiteralAppends</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseIndexOfChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InefficientEmptyStringCheck</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InsufficientStringBufferDeclaration</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessStringValueOf</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringBufferInstantiationWithChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseEqualsToCompareStrings</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidStringBufferField</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceVectorWithList</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceHashtableWithMap</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceEnumerationWithIterator</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidEnumAsIdentifier</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidAssertAsIdentifier</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IntegerInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ByteInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ShortInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LongInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseBeforeAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseAfterAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseTestAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4SuitesShouldUseSuiteAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitUseExpected</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseProperClassLoader</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MDBAndSessionBeanNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>RemoteSessionInterfaceNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LocalInterfaceSessionNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LocalHomeNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>RemoteInterfaceNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotCallSystemExit</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StaticEJBFieldShouldBeFinal</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotUseThreads</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidInstantiatingObjectsInLoops</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseArrayListInsteadOfVector</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyStartsWith</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseStringBufferForStringAppends</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseArraysAsList</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidArrayLoops</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryWrapperObjectCreation</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AddEmptyString</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyCatchBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyIfStmt</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyWhileStmt</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyTryBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyFinallyBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptySwitchStatements</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JumbledIncrementer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ForLoopShouldBeWhileLoop</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryConversionTemporary</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>OverrideBothEqualsAndHashcode</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoubleCheckedLocking</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReturnFromFinallyBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptySynchronizedBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryReturn</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyStaticInitializer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnconditionalIfStatement</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyStatementNotInLoop</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanInstantiation</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryFinalModifier</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CollapsibleIfStatements</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessOverridingMethod</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassCastExceptionWithToArray</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDecimalLiteralsInBigDecimalConstructor</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessOperationOnImmutable</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MisplacedNullCheck</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedNullCheckInEquals</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThreadGroup</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BrokenNullCheck</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BigIntegerInstantiation</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingOctalValues</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingHardCodedIP</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CheckResultSet</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidMultipleUnaryOperators</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyInitializer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodReturnsInternalArray</name>
+ <ruleset>Security Code Guidelines</ruleset>
+ </rule>
+ <rule>
+ <name>ArrayIsStoredDirectly</name>
+ <ruleset>Security Code Guidelines</ruleset>
+ </rule>
+ <rule>
+ <name>CouplingBetweenObjects</name>
+ <ruleset>Coupling Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveImports</name>
+ <ruleset>Coupling Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LooseCoupling</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DuplicateImports</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DontImportJavaLang</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedImports</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ImportFromSamePackage</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyStaticImports</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitStaticSuite</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitSpelling</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitAssertionsShouldIncludeMessage</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitTestsShouldIncludeAssert</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TestClassWithoutTestCases</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryBooleanAssertion</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertEqualsInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertSameInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertNullInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanAssertion</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NullAssignment</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedModifier</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AssignmentInOperand</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AtLeastOneConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DontImportSun</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousOctalEscape</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CallSuperInConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryParentheses</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DefaultPackage</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanInversion</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DataflowAnomalyAnalysis</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFinalLocalVariable</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingShortType</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingVolatile</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingNativeCode</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidAccessibilityAlteration</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotCallGarbageCollectionExplicitly</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodNamingConventions</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassNamingConventions</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractNaming</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDollarSigns</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodWithSameNameAsEnclosingClass</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousHashcodeMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousConstantFieldName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousEqualsMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFieldNameMatchingTypeName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFieldNameMatchingMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NoPackage</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PackageCase</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MisleadingVariableName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanGetMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NPathComplexity</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveMethodLength</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveParameterList</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveClassLength</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CyclomaticComplexity</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessivePublicCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyFields</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssMethodCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssTypeCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssConstructorCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyMethods</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyFinalizer</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeOnlyCallsSuperFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeOverloaded</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeDoesNotCallSuperFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeShouldBeProtected</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCallingFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseCorrectExceptionLogging</name>
+ <ruleset>Jakarta Commons Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ProperLogger</name>
+ <ruleset>Jakarta Commons Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingSerialVersionUID</name>
+ <ruleset>JavaBean Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ProperCloneImplementation</name>
+ <ruleset>Clone Implementation Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneThrowsCloneNotSupportedException</name>
+ <ruleset>Clone Implementation Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneMethodMustImplementCloneable</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ </rules>
+ <includeDerivedFiles>false</includeDerivedFiles>
+ <violationsAsErrors>true</violationsAsErrors>
+</pmd>
diff --git a/org.eclipse.osee.framework.ui.workspacebundleloader/.project b/org.eclipse.osee.framework.ui.workspacebundleloader/.project
new file mode 100644
index 000000000..25afc8e84
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.framework.ui.workspacebundleloader</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.framework.ui.workspacebundleloader/META-INF/MANIFEST.MF b/org.eclipse.osee.framework.ui.workspacebundleloader/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..84e9a50fc
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/META-INF/MANIFEST.MF
@@ -0,0 +1,26 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Workspacebundlelodaer Plug-in
+Bundle-SymbolicName: org.eclipse.osee.framework.ui.workspacebundleloader;singleton:=true
+Bundle-Version: 0.25.3.qualifier
+Bundle-Activator: org.eclipse.osee.framework.ui.workspacebundleloader.internal.Activator
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Import-Package: org.eclipse.core.resources,
+ org.eclipse.core.runtime,
+ org.eclipse.core.runtime.jobs,
+ org.eclipse.osee.framework.core.operation,
+ org.eclipse.osee.framework.jdk.core.util,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.osee.framework.plugin.core.util,
+ org.eclipse.osee.framework.ui.plugin.util,
+ org.eclipse.osee.framework.ui.plugin.workspace,
+ org.eclipse.osee.framework.ui.swt,
+ org.eclipse.swt.widgets,
+ org.eclipse.ui,
+ org.eclipse.ui.views,
+ org.osgi.framework,
+ org.osgi.util.tracker
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.osee.framework.ui.workspacebundleloader
+Require-Bundle: org.eclipse.osgi
diff --git a/org.eclipse.osee.framework.ui.workspacebundleloader/build.properties b/org.eclipse.osee.framework.ui.workspacebundleloader/build.properties
new file mode 100644
index 000000000..e9863e281
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml
diff --git a/org.eclipse.osee.framework.ui.workspacebundleloader/plugin.xml b/org.eclipse.osee.framework.ui.workspacebundleloader/plugin.xml
new file mode 100644
index 000000000..65c9e06c1
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/plugin.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+
+ <extension
+ id="WorkspaceStarterNature"
+ name="Workspace Starter Nature"
+ point="org.eclipse.core.resources.natures">
+ <runtime>
+ <run
+ class="org.eclipse.osee.framework.ui.workspacebundleloader.WorkspaceStarterNature">
+ <parameter
+ name="org.eclipse.osee.benchWorkspaceStarter.parameter1"
+ value="org.eclipse.osee.benchWorkspaceStarter.parameter1">
+ </parameter>
+ </run>
+ </runtime>
+ </extension>
+
+
+ <extension
+ point="org.eclipse.ui.startup">
+ <startup
+ class="org.eclipse.osee.framework.ui.workspacebundleloader.EarlyStartup">
+ </startup>
+ </extension>
+</plugin>
diff --git a/org.eclipse.osee.framework.ui.workspacebundleloader/pom.xml b/org.eclipse.osee.framework.ui.workspacebundleloader/pom.xml
new file mode 100644
index 000000000..195fecf58
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/pom.xml
@@ -0,0 +1,17 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.osee</groupId>
+ <artifactId>org.eclipse.osee.ote.parent</artifactId>
+ <version>0.25.3-SNAPSHOT</version>
+ <relativePath>../org.eclipse.osee.ote.parent</relativePath>
+ </parent>
+
+ <artifactId>org.eclipse.osee.framework.ui.workspacebundleloader</artifactId>
+ <packaging>eclipse-plugin</packaging>
+ <name>OSEE UI Workspace Bundle Loader (Incubation)</name>
+
+</project>
diff --git a/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/BundleCollection.java b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/BundleCollection.java
new file mode 100644
index 000000000..98d730447
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/BundleCollection.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.framework.ui.workspacebundleloader;
+
+import java.io.File;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+public class BundleCollection {
+
+ Map<String, List<BundleInfoLite>> bundleByName = new HashMap<>();
+ Map<URL, BundleInfoLite> bundleByURL = new HashMap<>();
+
+ public BundleCollection(){
+
+ }
+
+ public void add(BundleInfoLite bundle){
+ List<BundleInfoLite> bundles = bundleByName.get(bundle.getSymbolicName());
+ if(bundles == null){
+ bundles = new ArrayList<>();
+ bundleByName.put(bundle.getSymbolicName(), bundles);
+ }
+ bundles.add(bundle);
+ bundleByURL.put(bundle.getSystemLocation(), bundle);
+ }
+
+ public List<BundleInfoLite> getByBundleName(String name){
+ return bundleByName.get(name);
+ }
+
+ public BundleInfoLite getByURL(URL url){
+ return bundleByURL.get(url);
+ }
+
+ public List<BundleInfoLite> getInstalledBundles() {
+ List<BundleInfoLite> bundles = new ArrayList<>();
+ for(BundleInfoLite info: bundleByURL.values()){
+ if(info.isInstalled()){
+ bundles.add(info);
+ }
+ }
+ return bundles;
+ }
+
+ public List<BundleInfoLite> getLatestBundles() {
+ List<BundleInfoLite> latest = new ArrayList<>();
+ for(List<BundleInfoLite> infolist:this.bundleByName.values()){
+ if(infolist.size() == 1){
+ latest.add(infolist.get(0));
+ } else {
+ long lastModified = 0;
+ BundleInfoLite newest = null;
+ for(BundleInfoLite lite:infolist){
+ long newLastModified = new File(lite.getSystemLocation().getFile()).lastModified();
+ if(newLastModified > lastModified){
+ lastModified = newLastModified;
+ newest = lite;
+ }
+ }
+ latest.add(newest);
+ }
+ }
+ return latest;
+ }
+
+
+
+}
diff --git a/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/BundleInfoLite.java b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/BundleInfoLite.java
new file mode 100644
index 000000000..9da280223
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/BundleInfoLite.java
@@ -0,0 +1,166 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.framework.ui.workspacebundleloader;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.security.NoSuchAlgorithmException;
+import java.util.jar.JarFile;
+import java.util.jar.Manifest;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.jdk.core.util.ChecksumUtil;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+
+public class BundleInfoLite {
+
+ private final String symbolicName;
+ private final String version;
+ private final URL systemLocation;
+ private final File file;
+ private final Manifest manifest;
+ private byte[] md5Digest;
+ private Bundle bundle;
+
+
+ public BundleInfoLite(URL systemLocation) throws IOException {
+ File tmpFile;
+ try {
+ tmpFile = new File(systemLocation.toURI());
+ } catch (URISyntaxException ex) {
+ tmpFile = new File(systemLocation.getPath());
+ }
+ this.file = tmpFile;
+
+ JarFile jarFile = new JarFile(file);
+ this.manifest = jarFile.getManifest();
+ this.symbolicName = generateBundleName(manifest);
+ this.version = manifest.getMainAttributes().getValue("Bundle-Version");
+
+ this.systemLocation = systemLocation;
+ this.md5Digest = null;
+ }
+
+ /**
+ * @return the name of the bundle
+ */
+ private String generateBundleName(Manifest jarManifest) {
+ String nameEntry = jarManifest.getMainAttributes().getValue("Bundle-SymbolicName");
+ if(nameEntry == null){
+ return "unknown";
+ }
+ // Sometimes there's a semicolon then extra info - ignore this
+ int index = nameEntry.indexOf(';');
+ if (index != -1) {
+ nameEntry = nameEntry.substring(0, index);
+ }
+
+ return nameEntry;
+ }
+
+ /**
+ * @return the symbolicName
+ */
+ public String getSymbolicName() {
+ return symbolicName;
+ }
+
+ /**
+ * @return the version
+ */
+ public String getVersion() {
+ return version;
+ }
+
+ /**
+ * @return the location
+ */
+ public URL getSystemLocation() {
+ return systemLocation;
+ }
+
+ @Override
+ public String toString() {
+ return getSymbolicName() + ":" + getVersion();
+ }
+
+ /**
+ * @return the md5Digest
+ */
+ public byte[] getMd5Digest() {
+ // Do lazy calculation of this since it can be costly
+ // and does not get read for all bundle info's
+ if (md5Digest == null) {
+ try {
+ InputStream in = systemLocation.openStream();
+
+ md5Digest = ChecksumUtil.createChecksum(in, "MD5");
+
+ in.close();
+ } catch (NoSuchAlgorithmException ex) {
+ throw new IllegalStateException("Always expect MD5 to be available", ex);
+ } catch (IOException ex) {
+ throw new IllegalStateException("Always expect local jar file to be available", ex);
+ }
+ }
+ return md5Digest;
+ }
+
+ public void install(BundleContext context) throws BundleException, IOException{
+ bundle = context.installBundle("reference:" + this.getSystemLocation().toExternalForm());
+ }
+
+ public Bundle uninstall() throws BundleException{
+ if(isInstalled()){
+ bundle.uninstall();
+ }
+ return bundle;
+ }
+
+ public boolean isInstalled() {
+ if(bundle == null){
+ return false;
+ } else {
+ int state = bundle.getState();
+ return state != Bundle.UNINSTALLED;
+ }
+ }
+
+ public boolean isStarted() {
+ if(isInstalled()){
+ int state = bundle.getState();
+ return state == Bundle.ACTIVE || state == Bundle.STARTING;
+ } else {
+ return false;
+ }
+ }
+
+ public void start(BundleContext context) throws BundleException{
+ if(bundle == null){
+ for(Bundle findit:context.getBundles()){
+ if(findit.getSymbolicName().equals(getSymbolicName())){
+ findit.start();
+ return;
+ }
+ }
+ OseeLog.log(BundleInfoLite.class, Level.WARNING, String.format("Tried to start bundle [%s] that is not installed.", getSymbolicName()));
+ } else if (bundle.getState() == Bundle.INSTALLED || bundle.getState() == Bundle.RESOLVED){
+ bundle.start();
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/EarlyStartup.java b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/EarlyStartup.java
new file mode 100644
index 000000000..27397add3
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/EarlyStartup.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.framework.ui.workspacebundleloader;
+
+import java.util.logging.Level;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.swt.Displays;
+import org.eclipse.osee.framework.ui.workspacebundleloader.internal.Activator;
+import org.eclipse.ui.IStartup;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleException;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class EarlyStartup implements IStartup {
+
+ private SafeWorkspaceTracker workspaceTracker;
+
+ @Override
+ public void earlyStartup() {
+ Displays.ensureInDisplayThread(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ Bundle bundle = Platform.getBundle("org.eclipse.osee.framework.ui.workspacebundleloader");
+ bundle.start();
+ workspaceTracker = new SafeWorkspaceTracker(bundle.getBundleContext());
+ workspaceTracker.open(true);
+ } catch (BundleException ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ }
+ });
+
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/FileChangeDetector.java b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/FileChangeDetector.java
new file mode 100644
index 000000000..976ebf786
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/FileChangeDetector.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.framework.ui.workspacebundleloader;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.security.NoSuchAlgorithmException;
+import java.util.Arrays;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.jdk.core.util.ChecksumUtil;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class FileChangeDetector {
+
+ private final ConcurrentHashMap<URL, byte[]> bundleNameToMd5Map;
+
+ public FileChangeDetector() {
+ bundleNameToMd5Map = new ConcurrentHashMap<>();
+ }
+
+ public boolean isChanged(URL url) {
+ byte[] digest = getMd5Checksum(url);
+ if (bundleNameToMd5Map.containsKey(url)) {
+ // check for bundle binary equality
+ if (!Arrays.equals(bundleNameToMd5Map.get(url), digest)) {
+ bundleNameToMd5Map.put(url, digest);
+ return true;
+ } else {
+ return false;
+ }
+ } else {
+ bundleNameToMd5Map.put(url, digest);
+ return true;
+ }
+ }
+
+ private byte[] getMd5Checksum(URL url) {
+ InputStream in = null;
+ byte[] digest = new byte[0];
+ try {
+ in = url.openStream();
+ digest = ChecksumUtil.createChecksum(url.openStream(), "MD5");
+ } catch (IOException ex) {
+ OseeLog.log(FileChangeDetector.class, Level.SEVERE, ex);
+ } catch (NoSuchAlgorithmException ex) {
+ OseeLog.log(FileChangeDetector.class, Level.SEVERE, ex);
+ } finally {
+ if (in != null) {
+ try {
+ in.close();
+ } catch (IOException ex) {
+ OseeLog.log(FileChangeDetector.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ return digest;
+ }
+
+ public boolean remove(URL url) {
+ bundleNameToMd5Map.remove(url);
+ return true;
+ }
+
+ public void clear() {
+ bundleNameToMd5Map.clear();
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/IJarChangeListener.java b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/IJarChangeListener.java
new file mode 100644
index 000000000..db159468a
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/IJarChangeListener.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.framework.ui.workspacebundleloader;
+
+import java.net.URL;
+
+/**
+ * @author Robert A. Fisher
+ */
+public interface IJarChangeListener<T extends JarCollectionNature> {
+
+ /**
+ * Called for each addition of bundle
+ */
+ public void handleBundleAdded(URL url);
+
+ /**
+ * Called for each change of bundle
+ */
+ public void handleBundleChanged(URL url);
+
+ /**
+ * Called for each removal of bundle
+ */
+ public void handleBundleRemoved(URL url);
+
+ /**
+ * Called after all add/change/remove methods have been invoked for a given delta.
+ */
+ public void handlePostChange();
+
+ /**
+ * Called just before a project with the nature is closed
+ */
+ public void handleNatureClosed(T nature);
+}
diff --git a/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/JarChangeResourceListener.java b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/JarChangeResourceListener.java
new file mode 100644
index 000000000..910ffab61
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/JarChangeResourceListener.java
@@ -0,0 +1,176 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.framework.ui.workspacebundleloader;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectNature;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceChangeListener;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+
+/**
+ * Handler for IResourceChangeEvent.POST_CHANGE and IResourceChangeEvent.PRE_CLOSE events for projects with a given
+ * nature ID that extends JarCollectionNature. POST_CHANGE events against the jars in projects with the nature, and
+ * close events on the projects with the nature are detected and offered to an IJarChangeListener.
+ *
+ * @author Robert A. Fisher
+ */
+public class JarChangeResourceListener<T extends JarCollectionNature> implements IResourceChangeListener {
+ private final String natureId;
+ private final IJarChangeListener<T> listener;
+
+ public JarChangeResourceListener(String natureId, IJarChangeListener<T> listener) {
+ if (natureId == null) {
+ throw new IllegalArgumentException("natureId must not be null");
+ }
+ if (listener == null) {
+ throw new IllegalArgumentException("listener must not be null");
+ }
+ this.natureId = natureId;
+ this.listener = listener;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void resourceChanged(IResourceChangeEvent event) {
+ try {
+ if (event.getType() == IResourceChangeEvent.POST_CHANGE) {
+ handleChangeEvent(event);
+ } else if (event.getType() == IResourceChangeEvent.PRE_CLOSE) {
+ IResource resource = event.getResource();
+ if (resource != null && resource instanceof IProject) {
+ IProject project = (IProject) resource;
+
+ IProjectNature nature = project.getNature(natureId);
+ if (nature != null) {
+ listener.handleNatureClosed((T) nature);
+ }
+ }
+ }
+ } catch (CoreException ex) {
+ } catch (MalformedURLException ex) {
+ }
+ }
+
+ private void handleChangeEvent(IResourceChangeEvent event) throws CoreException, MalformedURLException {
+ IResourceDelta rootDelta = event.getDelta();
+ if (rootDelta != null) {
+ boolean triggered = false;
+ for (IResourceDelta child : rootDelta.getAffectedChildren()) {
+ IResource resource = child.getResource();
+ if (resource != null && resource instanceof IProject) {
+ IProject project = (IProject) resource;
+
+ IProjectNature nature = project.getNature(natureId);
+ if (nature != null) {
+ JarCollectionNature starterNature = (JarCollectionNature) nature;
+ IPath[] paths = starterNature.getProjectRelativeBundlePaths();
+ for (IPath path : paths) {
+ IResourceDelta pluginDelta = child.findMember(path);
+ if (pluginDelta != null && isModifyingChange(pluginDelta)) {
+ handlePluginChanges(project.getLocation().removeLastSegments(1),
+ pluginDelta.getAffectedChildren());
+ triggered = true;
+ }
+ }
+ }
+ }
+ }
+
+ if (triggered) {
+ listener.handlePostChange();
+ }
+ }
+ }
+
+ private boolean isModifyingChange(IResourceDelta pluginDelta) {
+ boolean synch = (pluginDelta.getFlags() & IResourceDelta.SYNC) != 0;
+ // boolean content = (pluginDelta.getFlags() & IResourceDelta.CONTENT) != 0;
+ // boolean REPLACED = (pluginDelta.getFlags() & IResourceDelta.REPLACED) != 0;
+ // boolean MARKERS = (pluginDelta.getFlags() & IResourceDelta.MARKERS) != 0;
+ // boolean TYPE = (pluginDelta.getFlags() & IResourceDelta.TYPE) != 0;
+ // boolean MOVED_FROM = (pluginDelta.getFlags() & IResourceDelta.MOVED_FROM) != 0;
+ // boolean MOVED_TO = (pluginDelta.getFlags() & IResourceDelta.MOVED_TO) != 0;
+ // boolean OPEN = (pluginDelta.getFlags() & IResourceDelta.OPEN) != 0;
+ // boolean ENCODING = (pluginDelta.getFlags() & IResourceDelta.ENCODING) != 0;
+ // boolean DESCRIPTION = (pluginDelta.getFlags() & IResourceDelta.DESCRIPTION) != 0;
+
+ // boolean ADDED = (pluginDelta.getKind() & IResourceDelta.ADDED) != 0;
+ // boolean CHANGED = (pluginDelta.getKind() & IResourceDelta.CHANGED) != 0;
+ // boolean ADDED_PHANTOM = (pluginDelta.getKind() & IResourceDelta.ADDED_PHANTOM) != 0;
+ // boolean REMOVED_PHANTOM = (pluginDelta.getKind() & IResourceDelta.REMOVED_PHANTOM) != 0;
+ return !synch;
+ }
+
+ protected void handlePluginChanges(IPath workspacePath, IResourceDelta[] affectedChildren) throws MalformedURLException {
+ for (IResourceDelta affectedPluginDelta : affectedChildren) {
+ URL url = workspacePath.append(affectedPluginDelta.getFullPath()).toFile().toURI().toURL();
+ if (affectedPluginDelta.getFullPath().getFileExtension().equals("jar")) {
+ try {
+ switch (affectedPluginDelta.getKind()) {
+ case IResourceDelta.ADDED:
+ listener.handleBundleAdded(url);
+ break;
+ case IResourceDelta.CHANGED:
+ listener.handleBundleChanged(url);
+ break;
+ case IResourceDelta.REMOVED:
+ listener.handleBundleRemoved(url);
+ break;
+
+ default:
+ System.err.println("Do not expect change kind of " + generateKindString(affectedPluginDelta.getKind()));
+ }
+ } catch (RuntimeException ex) {
+ ex.printStackTrace();
+ throw ex;
+ }
+ }
+ }
+ }
+
+ private String generateKindString(int kind) {
+ switch (kind) {
+ case IResourceDelta.ADDED:
+ return "Added";
+ case IResourceDelta.CHANGED:
+ return "Changed";
+ case IResourceDelta.REMOVED:
+ return "Removed";
+ default:
+ return "Unexpected Kind: " + kind;
+ }
+ }
+
+ protected String generateEventString(int type) {
+ switch (type) {
+ case IResourceChangeEvent.POST_BUILD:
+ return "Post Build";
+ case IResourceChangeEvent.POST_CHANGE:
+ return "Post Change";
+ case IResourceChangeEvent.PRE_BUILD:
+ return "Pre Build";
+ case IResourceChangeEvent.PRE_CLOSE:
+ return "Pre Close";
+ case IResourceChangeEvent.PRE_DELETE:
+ return "Pre Delete";
+ case IResourceChangeEvent.PRE_REFRESH:
+ return "Pre Refresh";
+ default:
+ return "Unknown Code: " + type;
+ }
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/JarCollectionNature.java b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/JarCollectionNature.java
new file mode 100644
index 000000000..e6b694f5b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/JarCollectionNature.java
@@ -0,0 +1,171 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.framework.ui.workspacebundleloader;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FilenameFilter;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.jar.Attributes;
+import java.util.jar.Attributes.Name;
+import java.util.jar.Manifest;
+import java.util.logging.Level;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectNature;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class JarCollectionNature implements IProjectNature {
+
+ private final Name BUNDLE_PATH_ATTRIBUTE;
+ private boolean isClosing;
+
+ protected IProject project;
+
+ /**
+ * @param BUNDLE_PATH_ATTRIBUTE the name of the attribute in the MANIFEST.MF to look at when looking for the path to
+ * the jars being provided.
+ */
+ public JarCollectionNature(String BUNDLE_PATH_ATTRIBUTE) {
+ super();
+ this.BUNDLE_PATH_ATTRIBUTE = new Name(BUNDLE_PATH_ATTRIBUTE);
+ this.isClosing = false;
+ }
+
+ /**
+ * @return the isClosing
+ */
+ public boolean isClosing() {
+ return isClosing;
+ }
+
+ /**
+ * @param isClosing the isClosing to set
+ */
+ public void setClosing(boolean isClosing) {
+ this.isClosing = isClosing;
+ }
+
+ @Override
+ public void configure() {
+ }
+
+ @Override
+ public void deconfigure() {
+ }
+
+ @Override
+ public IProject getProject() {
+ return project;
+ }
+
+ @Override
+ public void setProject(IProject project) {
+ this.project = project;
+ }
+
+ public Collection<URL> getBundles() {
+ Collection<URL> urls = new ArrayList<>();
+
+ if (isClosing) {
+ return urls;
+ }
+
+ IPath[] paths = getProjectRelativeBundlePaths();
+ for (IPath path : paths) {
+ IPath pluginsPath = project.getLocation().append(path);
+ File pluginDir = pluginsPath.toFile();
+ File[] jars = pluginDir.listFiles(new FilenameFilter() {
+ @Override
+ public boolean accept(File dir, String name) {
+ return name.endsWith(".jar");
+ }
+ });
+
+ if (jars != null) {
+ for (File jar : jars) {
+ try {
+ urls.add(jar.toURI().toURL());
+ } catch (MalformedURLException ex) {
+ OseeLog.log(JarCollectionNature.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ }
+ return urls;
+ }
+
+ public IPath[] getProjectRelativeBundlePaths() {
+ Manifest manifest = getManifestFile();
+ Path[] paths;
+ Attributes mainAttributes = manifest.getMainAttributes();
+ String pathString;
+ if (mainAttributes.containsKey(BUNDLE_PATH_ATTRIBUTE)) {
+ pathString = mainAttributes.getValue(BUNDLE_PATH_ATTRIBUTE);
+ String[] tempPaths = pathString.split(",");
+ paths = new Path[tempPaths.length];
+ for (int i = 0; i < paths.length; i++) {
+ paths[i] = new Path(tempPaths[i].trim());
+ }
+ } else {
+ paths = new Path[1];
+ paths[0] = new Path("plugins");
+ }
+ return paths;
+ }
+
+ private Manifest getManifestFile() {
+ try {
+ File manifestFile = project.getLocation().append("META-INF").append("MANIFEST.MF").toFile();
+ if (manifestFile.exists()) {
+ return new Manifest(new FileInputStream(manifestFile));
+ } else {
+ return null;
+ }
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ return null;
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ protected static <T extends JarCollectionNature> Collection<T> getWorkspaceProjects(String natureId, Class<T> clazz) throws CoreException {
+ IWorkspace workspace = ResourcesPlugin.getWorkspace();
+ IWorkspaceRoot workspaceRoot = workspace.getRoot();
+ IProject[] projects = workspaceRoot.getProjects();
+
+ Collection<T> natures = new LinkedList<>();
+
+ for (IProject project : projects) {
+ if (project.isOpen()) {
+ IProjectNature nature = project.getNature(natureId);
+ if (nature != null) {
+ JarCollectionNature jarNature = (JarCollectionNature) nature;
+ natures.add((T) jarNature);
+ }
+ }
+ }
+
+ return natures;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/SafeWorkspaceTracker.java b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/SafeWorkspaceTracker.java
new file mode 100644
index 000000000..d966ce83f
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/SafeWorkspaceTracker.java
@@ -0,0 +1,152 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.framework.ui.workspacebundleloader;
+
+import java.io.File;
+import java.net.URL;
+import java.util.logging.Level;
+
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.core.operation.AbstractOperation;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.plugin.core.util.OseeData;
+import org.eclipse.osee.framework.ui.plugin.workspace.SafeWorkspaceAccess;
+import org.eclipse.osee.framework.ui.workspacebundleloader.internal.Activator;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchListener;
+import org.eclipse.ui.PlatformUI;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class SafeWorkspaceTracker extends ServiceTracker implements IJarChangeListener<WorkspaceStarterNature>, WorkspaceLoader, IWorkbenchListener {
+
+ private JarChangeResourceListener<WorkspaceStarterNature> workspaceListener;
+ private SafeWorkspaceAccess service;
+ private final WorkspaceBundleLoadCoordinator bundleCoordinator;
+
+ public SafeWorkspaceTracker(BundleContext context) {
+ super(context, SafeWorkspaceAccess.class.getName(), null);
+ bundleCoordinator = new WorkspaceBundleLoadCoordinator(new File(OseeData.getPath().toFile(), "loadedbundles"));
+ context.registerService(WorkspaceLoader.class.getName(), this, null);
+ PlatformUI.getWorkbench().addWorkbenchListener(this);
+ }
+
+ @Override
+ public Object addingService(ServiceReference reference) {
+ service = (SafeWorkspaceAccess) context.getService(reference);
+ setupWorkspaceBundleLoadingAfterBenchStartup();
+ return super.addingService(reference);
+ }
+
+ void setupWorkspaceBundleLoadingAfterBenchStartup() {
+ Jobs.runInJob(new PrecompileStartup("Loading Precompiled Libraries", Activator.BUNDLE_ID), false);
+ }
+
+ private class PrecompileStartup extends AbstractOperation {
+ public PrecompileStartup(String operationName, String pluginId) {
+ super(operationName, pluginId);
+ }
+
+ @Override
+ protected void doWork(IProgressMonitor monitor) throws Exception {
+ IWorkspace workspace = service.getWorkspace();
+ workspaceListener =
+ new JarChangeResourceListener<WorkspaceStarterNature>(WorkspaceStarterNature.NATURE_ID,
+ SafeWorkspaceTracker.this);
+ try {
+ loadBundles(monitor);
+ } catch (CoreException ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ workspace.addResourceChangeListener(workspaceListener);
+
+ }
+ }
+
+ @Override
+ public synchronized void close() {
+ IWorkspace workspace = service.getWorkspace();
+ workspace.removeResourceChangeListener(workspaceListener);
+ super.close();
+ }
+
+ @Override
+ public void handleBundleAdded(URL url) {
+ String urlString = url.toString();
+ bundleCoordinator.addBundleToCheck(urlString);
+ }
+
+ @Override
+ public void handleBundleChanged(URL url) {
+ String urlString = url.toString();
+ bundleCoordinator.addBundleToCheck(urlString);
+ }
+
+ @Override
+ public void handleBundleRemoved(URL url) {
+ String urlString = url.toString();
+ bundleCoordinator.addBundleToCheck(urlString);
+ }
+
+ @Override
+ public void handlePostChange() {
+ }
+
+ @Override
+ public void handleNatureClosed(WorkspaceStarterNature nature) {
+ for (URL url : nature.getBundles()) {
+ handleBundleRemoved(url);
+ }
+ }
+
+ @Override
+ public void loadBundles(IProgressMonitor monitor) throws CoreException {
+ for (WorkspaceStarterNature starterNature : WorkspaceStarterNature.getWorkspaceProjects()) {
+ for (URL url : starterNature.getBundles()) {
+ try {
+ handleBundleAdded(url);
+ } catch (Exception ex) {
+ OseeLog.log(SafeWorkspaceTracker.class, Level.INFO, ex);
+ ex.printStackTrace();
+ }
+ }
+ }
+ bundleCoordinator.updateBundles(monitor);
+ bundleCoordinator.installLatestBundles(monitor);
+ }
+
+ @Override
+ public void unloadBundles() {
+ bundleCoordinator.uninstallBundles();
+ }
+
+ @Override
+ public boolean preShutdown(IWorkbench workbench, boolean forced) {
+ try{
+ bundleCoordinator.uninstallBundles();
+ } catch (Throwable th){
+ th.printStackTrace();
+ }
+ return true;
+ }
+
+ @Override
+ public void postShutdown(IWorkbench workbench) {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/WorkspaceBundleLoadCoordinator.java b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/WorkspaceBundleLoadCoordinator.java
new file mode 100644
index 000000000..70b35f2fe
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/WorkspaceBundleLoadCoordinator.java
@@ -0,0 +1,649 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.framework.ui.workspacebundleloader;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.nio.channels.FileChannel;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Level;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.core.operation.AbstractOperation;
+import org.eclipse.osee.framework.core.operation.Operations;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.OseeData;
+import org.eclipse.osee.framework.ui.workspacebundleloader.internal.Activator;
+import org.eclipse.osee.framework.ui.workspacebundleloader.internal.ManagedFolderArea;
+import org.eclipse.ui.IMemento;
+import org.eclipse.ui.IPerspectiveDescriptor;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IViewReference;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.WorkbenchException;
+import org.eclipse.ui.XMLMemento;
+import org.eclipse.ui.views.IViewDescriptor;
+import org.eclipse.ui.views.IViewRegistry;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.FrameworkEvent;
+import org.osgi.framework.FrameworkListener;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.wiring.FrameworkWiring;
+
+public class WorkspaceBundleLoadCoordinator {
+
+ private static final String TAG_VIEW = "view";
+ private static final String TAG_PERSPECTIVE = "perspective";
+ private static final String TAG_OTE_PRECOMPILED = "OTEPrecompiled";
+ private static final String OTE_MEMENTO = "OTEMemento";
+
+ private ManagedFolderArea managedFolderArea;
+ private Set<String> bundlesToCheck;
+ private BundleCollection managedArea = new BundleCollection();
+ private FrameworkWiring wiring;
+
+ public WorkspaceBundleLoadCoordinator(File temporaryBundleLocationFolder) {
+ bundlesToCheck = new HashSet<>();
+ this.managedFolderArea = new ManagedFolderArea(temporaryBundleLocationFolder);
+ managedFolderArea.initialize();
+ this.wiring = getFrameworkWiring();
+
+ Thread th = new Thread(new Runnable() {
+ @Override
+ public void run() {
+ int lastSize = 0;
+ boolean extraWait = false;
+ while(true){
+ try {
+ if(extraWait){
+ Thread.sleep(15000);
+ extraWait = false;
+ } else {
+ Thread.sleep(5000);
+ }
+ } catch (InterruptedException e) {
+ }
+ if(lastSize == bundlesToCheck.size()){
+ if(lastSize != 0){
+ if(bundlesToCheck.size() > 0){
+ lastSize = 0;
+ Operations.executeAsJob(new RefreshWorkspaceBundles(), false);
+ try {
+ Thread.sleep(1000*60); //give time to load so we don't get called twice
+ } catch (InterruptedException e) {
+ }
+ }
+ }
+ } else {
+ if(bundlesToCheck.size() - lastSize > 5){
+ extraWait = true;//big import allow for extra time for file imports
+ }
+ lastSize = bundlesToCheck.size();
+ }
+ }
+ }
+ });
+ th.setName("OTE BundleLoad Check");
+ th.setDaemon(true);
+ th.start();
+ }
+
+ private FrameworkWiring getFrameworkWiring() {
+ FrameworkWiring frameworkWiring = null;
+ Bundle bundle = FrameworkUtil.getBundle(getClass());
+ for(Bundle findit:bundle.getBundleContext().getBundles()){
+ frameworkWiring = findit.adapt(FrameworkWiring.class);
+ if(frameworkWiring != null){
+ break;
+ }
+ }
+ return frameworkWiring;
+ }
+
+
+
+ private class RefreshWorkspaceBundles extends AbstractOperation {
+
+ public RefreshWorkspaceBundles() {
+ super("Update Precompiled", Activator.BUNDLE_ID);
+ }
+
+ @Override
+ protected void doWork(IProgressMonitor monitor) throws Exception {
+ updateBundles(monitor);
+ installLatestBundles(monitor);
+ }
+
+ }
+
+ public void saveAndCloseViews(){
+ PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable(){
+ @Override
+ public void run() {
+ saveAndCloseManagedViews(determineManagedViews(), true);
+ }
+ });
+ }
+
+ private void closeUpdatedViews(final List<BundleInfoLite> uninstallList){
+ PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable(){
+ @Override
+ public void run() {
+ saveAndCloseManagedViews(determineManagedViews(uninstallList), true);
+ }
+ });
+ }
+
+
+
+ public synchronized void uninstallBundles(){
+ if(managedArea.getInstalledBundles().size() > 0){
+ saveAndCloseViews();
+ for(BundleInfoLite info:managedArea.getInstalledBundles()){
+ try {
+ info.uninstall();
+ } catch (BundleException e) {
+ OseeLog.log(WorkspaceBundleLoadCoordinator.class, Level.WARNING, e);
+ }
+ }
+ if(wiring != null){
+ wiring.refreshBundles(null);
+ }
+ IWorkbench workbench = PlatformUI.getWorkbench();
+ if (workbench != null && workbench.getActiveWorkbenchWindow() != null){
+ IViewRegistry registry = workbench.getViewRegistry();
+ forceViewRegistryReload(workbench, registry);
+ }
+ waitForViewsToBeRegistered(null);
+ }
+ }
+
+
+ private void saveAndCloseManagedViews(Set<String> managedViewIds, boolean save) {
+
+ IWorkbench workbench = PlatformUI.getWorkbench();
+ if (managedArea.getInstalledBundles().size() > 0 && workbench != null){
+ IWorkbenchPage page = null;
+ if(PlatformUI.getWorkbench().getActiveWorkbenchWindow() == null){
+ IWorkbenchWindow[] windows = workbench.getWorkbenchWindows();
+ for(IWorkbenchWindow win :windows){
+ page = win.getActivePage();
+ if(page != null){
+ break;
+ }
+ }
+ } else {
+ page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ }
+ if(page == null){
+ return;
+ }
+ IPerspectiveDescriptor originalPerspective = page.getPerspective();
+ XMLMemento memento = XMLMemento.createWriteRoot(TAG_OTE_PRECOMPILED);
+ //find the view in other perspectives
+ IPerspectiveDescriptor[] pd = page.getOpenPerspectives();
+ for (int i = 0; i < pd.length; i++) {
+ try {
+ page.setPerspective(pd[i]);
+ } catch (Exception ex) {
+ // Ignore, this can get an NPE in Eclipse, see bug 4454
+ }
+ IMemento perspectiveMemento = null;
+ try{
+ perspectiveMemento = memento.createChild(TAG_PERSPECTIVE);
+ perspectiveMemento.putString("id", pd[i].getId());
+ } catch (Exception ex){
+ //Ignore, the perspective id is invalid xml
+ }
+ IViewReference[] activeReferences = page.getViewReferences();
+ for (IViewReference viewReference : activeReferences) {
+ int index = viewReference.getId().indexOf(":");
+ String id = null;
+ if(index>0){
+ id = viewReference.getId().substring(0, index);
+ } else {
+ id = viewReference.getId();
+ }
+ if (managedViewIds.contains(id)){
+ if(perspectiveMemento != null){
+ try{
+ IMemento viewMemento = perspectiveMemento.createChild(TAG_VIEW);
+ viewMemento.putString("id", id);
+ String secondaryId = viewReference.getSecondaryId();
+ if(secondaryId != null){
+ viewMemento.putString("secondId", secondaryId);
+ }
+ IWorkbenchPart part = viewReference.getPart(false);
+ if(part instanceof IViewPart){
+ IViewPart viewPart = (IViewPart)part;
+ viewPart.saveState(viewMemento);
+ }
+ } catch (Exception ex){
+ //Ignore, we failed during view save
+ }
+ }
+ try{
+ page.hideView(viewReference);
+ } catch (Throwable th){
+ }
+ }
+ }
+ }
+ if(save){
+ saveMementoToFile(memento);
+ }
+ page.setPerspective(originalPerspective);
+ }
+ }
+
+ private Set<String> determineManagedViews() {
+ return determineManagedViews(null);
+ }
+
+ private Set<String> determineManagedViews(List<BundleInfoLite> uninstallList){
+ Set<String> managedViewIds = new HashSet<>();
+ IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
+ IExtensionPoint extensionPoint = extensionRegistry.getExtensionPoint("org.eclipse.ui.views");
+ IExtension[] extensions = extensionPoint.getExtensions();
+ for(IExtension ex:extensions){
+ String name = ex.getContributor().getName();
+ if(managedArea.getByBundleName(name) != null){
+ IConfigurationElement[] elements = ex.getConfigurationElements();
+ for(IConfigurationElement el:elements){
+ if(el.getName().equals(TAG_VIEW)){
+ String id = el.getAttribute("id");
+ if(id != null){
+ if(uninstallList != null){
+ for(BundleInfoLite infoLite:uninstallList){
+ if(name.equals(infoLite.getSymbolicName())){
+ managedViewIds.add(id);
+ break;
+ }
+ }
+ } else {
+ managedViewIds.add(id);
+ }
+ }
+ }
+ }
+ }
+ }
+ return managedViewIds;
+ }
+
+ private boolean saveMementoToFile(XMLMemento memento) {
+ File stateFile = OseeData.getFile(OTE_MEMENTO);
+ if (stateFile == null) {
+ return false;
+ }
+ try {
+ FileOutputStream stream = new FileOutputStream(stateFile);
+ OutputStreamWriter writer = new OutputStreamWriter(stream, "utf-8"); //$NON-NLS-1$
+ memento.save(writer);
+ writer.close();
+ } catch (IOException e) {
+ stateFile.delete();
+ return false;
+ }
+ return true;
+ }
+
+ public static void copyFile(File source, File destination) throws IOException {
+ final FileChannel in = new FileInputStream(source).getChannel();
+ try {
+ final FileChannel out;
+ if (destination.isDirectory()) {
+ out = new FileOutputStream(new File(destination, source.getName())).getChannel();
+ } else {
+ if (destination.exists()) {
+ destination.delete(); // to work around some file permission problems
+ }
+ out = new FileOutputStream(destination).getChannel();
+ }
+ try {
+ long position = 0;
+ long size = in.size();
+ while (position < size) {
+ position += in.transferTo(position, size, out);
+ }
+ } finally {
+ Lib.close(out);
+ }
+ } finally {
+ Lib.close(in);
+ }
+ }
+
+
+
+ private List<BundleInfoLite> determineDeltasBetweenBundlesToLoad() {
+ List<BundleInfoLite> bundlesToOperateOn = new ArrayList<>();
+ for(String urlString:bundlesToCheck){
+ try {
+ URL newURL;
+ try{
+ newURL = new URL(urlString);
+ } catch(MalformedURLException ex){
+ newURL = new File(urlString).toURI().toURL();
+ }
+
+ BundleInfoLite bundleInfo = new BundleInfoLite(newURL);
+ List<BundleInfoLite> bundleList = managedArea.getByBundleName(bundleInfo.getSymbolicName());
+ if(bundleList == null){
+ bundlesToOperateOn.add(bundleInfo);
+ } else {
+ boolean newBundle=true;
+ if(bundleList != null && bundleList.size() > 0){
+ byte[] digest1 = bundleInfo.getMd5Digest();
+ for(BundleInfoLite bundle:bundleList){
+ byte[] digest2 = bundle.getMd5Digest();
+ if (Arrays.equals(digest1, digest2)) {
+ newBundle = false;
+ new File(bundle.getSystemLocation().getFile()).setLastModified(System.currentTimeMillis());
+ }
+ }
+ }
+ if(newBundle){
+ bundlesToOperateOn.add(bundleInfo);
+ }
+ }
+ } catch (MalformedURLException e) {
+ OseeLog.log(WorkspaceBundleLoadCoordinator.class, Level.WARNING, e);
+ } catch (IOException e) {
+ OseeLog.log(WorkspaceBundleLoadCoordinator.class, Level.WARNING, e);
+ }
+ }
+ bundlesToCheck.clear();
+ return bundlesToOperateOn;
+ }
+
+ public synchronized void addBundleToCheck(String urlString){
+ this.bundlesToCheck.add(urlString);
+ }
+
+ public synchronized void updateBundles(IProgressMonitor monitor){
+ List<BundleInfoLite> deltas = determineDeltasBetweenBundlesToLoad();
+ monitor.worked(Operations.calculateWork(Operations.TASK_WORK_RESOLUTION, 0.15));
+ List<BundleInfoLite> bundlesToAdd = managedFolderArea.copyDeltasToManagedFolder(deltas);
+ monitor.worked(Operations.calculateWork(Operations.TASK_WORK_RESOLUTION, 0.30));
+ for(BundleInfoLite bundle:bundlesToAdd){
+ managedArea.add(bundle);
+ }
+ monitor.worked(Operations.calculateWork(Operations.TASK_WORK_RESOLUTION, 0.05));
+ }
+
+ public synchronized void installLatestBundles(final IProgressMonitor subMonitor){
+ final List<BundleInfoLite> bundles = managedArea.getLatestBundles();
+ Collection<Bundle> bundlesToRefresh = new ArrayList<>();
+ List<BundleInfoLite> uninstallListAll = new ArrayList<>();
+ for(BundleInfoLite info:bundles){
+ if(!info.isInstalled()){
+ List<BundleInfoLite> uninstallList = managedArea.getByBundleName(info.getSymbolicName());
+ if(uninstallList.size() > 1){
+ for(BundleInfoLite toUninstall:uninstallList){
+ if(toUninstall.isInstalled()){
+ uninstallListAll.add(toUninstall);
+ }
+ }
+ }
+ }
+ }
+
+ closeUpdatedViews(uninstallListAll);
+ for(BundleInfoLite toUninstall:uninstallListAll){
+ try {
+ Bundle bundle = toUninstall.uninstall();
+ bundlesToRefresh.add(bundle);
+ } catch (BundleException e) {
+ OseeLog.log(WorkspaceBundleLoadCoordinator.class, Level.WARNING, e);
+ }
+ }
+
+ if(wiring != null && bundlesToRefresh.size() > 0){
+ final Object waitForLoad = new Object();
+ wiring.refreshBundles(bundlesToRefresh, new FrameworkListener(){
+ @Override
+ public void frameworkEvent(FrameworkEvent event) {
+ if(FrameworkEvent.PACKAGES_REFRESHED == event.getType()){
+ startBundles(bundles, subMonitor);
+ waitForViewsToBeRegistered(subMonitor);
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable(){
+ @Override
+ public void run() {
+ restoreStateFromMemento(subMonitor);
+ }
+ });
+ synchronized (waitForLoad) {
+ waitForLoad.notifyAll();
+ }
+ }
+ }
+ });
+ synchronized (waitForLoad) {
+ try {
+ waitForLoad.wait(20000);
+ } catch (InterruptedException e) {
+ }
+ }
+ } else {
+ startBundles(bundles, subMonitor);
+ waitForViewsToBeRegistered(subMonitor);
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable(){
+ @Override
+ public void run() {
+ restoreStateFromMemento(subMonitor);
+ }
+ });
+ }
+ }
+
+ private boolean waitForViewsToBeRegistered(IProgressMonitor monitor){
+ if(monitor != null)
+ monitor.setTaskName("Waiting for views to register.");
+ for(int i = 0; i < 10; i++){
+ if(monitor != null)
+ monitor.worked(1);
+ CheckViewsRegistered check = new CheckViewsRegistered();
+ PlatformUI.getWorkbench().getDisplay().syncExec(check);
+ if(check.isLoaded()){
+ return true;
+ } else {
+ try {
+ Thread.sleep(5000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ return false;
+ }
+
+ private class CheckViewsRegistered implements Runnable {
+
+ private volatile boolean isLoaded = false;
+
+ @Override
+ public void run() {
+ IWorkbench workbench = PlatformUI.getWorkbench();
+ if (managedArea.getInstalledBundles().size() > 0 && workbench != null && workbench.getActiveWorkbenchWindow() != null){
+ IViewRegistry registry = workbench.getViewRegistry();
+ forceViewRegistryReload(workbench, registry);
+ Set<String> managedViews = determineManagedViews();
+ for(String viewId:managedViews){
+ try{
+ IViewDescriptor desc = registry.find(viewId);
+ if(desc == null){
+ return;
+ }
+ } catch (Exception ex){
+ return;
+ }
+ }
+ isLoaded = true;
+ } else { //no workspace bundles to load, so don't wait
+ isLoaded = true;
+ }
+
+ }
+
+ public boolean isLoaded(){
+ return isLoaded;
+ }
+ }
+
+ @SuppressWarnings({ "rawtypes" })
+ private void forceViewRegistryReload(IWorkbench workbench, IViewRegistry registry){
+ try{
+ Field field1 = registry.getClass().getDeclaredField("descriptors");
+ Field field2 = registry.getClass().getDeclaredField("stickyDescriptors");
+ Field field3 = registry.getClass().getDeclaredField("categories");
+
+ field1.setAccessible(true);
+ field2.setAccessible(true);
+ field3.setAccessible(true);
+
+ ((Map)field1.get(registry)).clear();
+ ((List)field2.get(registry)).clear();
+ ((Map)field3.get(registry)).clear();
+
+ field1.setAccessible(false);
+ field2.setAccessible(false);
+ field3.setAccessible(false);
+
+ Method[] methods = registry.getClass().getDeclaredMethods();
+ Method method = null;
+ for(Method m:methods){
+ if(m.getName().equals("postConstruct")){
+ method = m;
+ break;
+ }
+ }
+ if(method != null){
+ boolean access = method.isAccessible();
+ method.setAccessible(true);
+ try{
+ method.invoke(registry);
+ } finally {
+ method.setAccessible(access);
+ }
+ }
+ } catch (Throwable th){
+ OseeLog.log(this.getClass(), Level.SEVERE, th);
+ }
+ }
+
+
+ private void restoreStateFromMemento(IProgressMonitor restore) {
+ File mementoFile = OseeData.getFile(OTE_MEMENTO);
+ if(mementoFile.exists()){
+ try {
+ IWorkbench workbench = PlatformUI.getWorkbench();
+ if (managedArea.getInstalledBundles().size() > 0 && workbench != null && workbench.getActiveWorkbenchWindow() != null){
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ IPerspectiveDescriptor originalPerspective = page.getPerspective();
+ IPerspectiveDescriptor[] pds = page.getOpenPerspectives();
+
+ XMLMemento memento = XMLMemento.createReadRoot(new FileReader(mementoFile));
+ IMemento[] perspectives = memento.getChildren(TAG_PERSPECTIVE);
+ if(perspectives != null){
+ for(IMemento perspective:perspectives){
+ IMemento[] views = perspective.getChildren(TAG_VIEW);
+ if(views != null && views.length > 0){
+ String perspectiveId = perspective.getString("id");
+ for(IPerspectiveDescriptor pd:pds){
+ if(pd.getId().equals(perspectiveId)){
+ page.setPerspective(pd);
+ for(IMemento view:views){
+ String viewId = view.getString("id");
+ String secondId = view.getString("secondId");
+ if(viewId != null){
+ //show view
+ try {
+ page.showView(viewId, secondId, IWorkbenchPage.VIEW_ACTIVATE);
+ } catch (PartInitException ex) {
+ System.err.println("COULD NOT FIND " + viewId + ", with ID # = " + secondId);
+ ex.printStackTrace();
+ }
+ }
+ }
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ page.setPerspective(originalPerspective);
+ }
+
+ } catch (WorkbenchException e) {
+ e.printStackTrace();
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ private void startBundles(Collection<BundleInfoLite> bundles, IProgressMonitor subMonitor){
+ BundleContext context = FrameworkUtil.getBundle(this.getClass()).getBundleContext();
+ subMonitor.setTaskName("Installing Bundles");
+ double workPercentage = 0.50 / (bundles.size()*2);
+ int workAmount = Operations.calculateWork(Operations.TASK_WORK_RESOLUTION, workPercentage);
+ for(BundleInfoLite info:bundles){
+ if(!info.isInstalled()){
+ try {
+ info.install(context);
+ } catch (BundleException e) {
+ } catch (IOException e) {
+ }
+ }
+ subMonitor.worked(workAmount*2);
+ }
+ for(BundleInfoLite info:bundles){
+ if(!info.isStarted()){
+ try {
+ info.start(context);
+ } catch (BundleException e) {
+ }
+ }
+ subMonitor.worked(workAmount);
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/WorkspaceLoader.java b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/WorkspaceLoader.java
new file mode 100644
index 000000000..3bebf605b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/WorkspaceLoader.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.framework.ui.workspacebundleloader;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.osgi.framework.BundleException;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface WorkspaceLoader {
+ public void loadBundles(IProgressMonitor monitor) throws CoreException, BundleException;
+
+ public void unloadBundles();
+}
diff --git a/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/WorkspaceStarterNature.java b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/WorkspaceStarterNature.java
new file mode 100644
index 000000000..eeb2cd220
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/WorkspaceStarterNature.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.framework.ui.workspacebundleloader;
+
+import java.util.Collection;
+import org.eclipse.core.runtime.CoreException;
+
+/**
+ * @author Robert A. Fisher
+ * @author Andrew M. Finkbeiner
+ */
+public class WorkspaceStarterNature extends JarCollectionNature {
+ public static final String NATURE_ID = "org.eclipse.osee.framework.ui.workspacebundleloader.WorkspaceStarterNature";
+ static final String BUNDLE_PATH_ATTRIBUTE = "WorkspaceBundlePath";
+
+ public WorkspaceStarterNature() {
+ super(BUNDLE_PATH_ATTRIBUTE);
+ }
+
+ public static Collection<WorkspaceStarterNature> getWorkspaceProjects() throws CoreException {
+ return getWorkspaceProjects(NATURE_ID, WorkspaceStarterNature.class);
+ }
+}
diff --git a/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/internal/Activator.java b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/internal/Activator.java
new file mode 100644
index 000000000..ed427d42b
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/internal/Activator.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.framework.ui.workspacebundleloader.internal;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class Activator implements BundleActivator {
+
+ public static final String BUNDLE_ID = "org.eclipse.osee.framework.ui.workspacebundleloader";
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ }
+
+}
diff --git a/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/internal/ManagedFolderArea.java b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/internal/ManagedFolderArea.java
new file mode 100644
index 000000000..5e0c83ab5
--- /dev/null
+++ b/org.eclipse.osee.framework.ui.workspacebundleloader/src/org/eclipse/osee/framework/ui/workspacebundleloader/internal/ManagedFolderArea.java
@@ -0,0 +1,113 @@
+package org.eclipse.osee.framework.ui.workspacebundleloader.internal;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.nio.channels.FileChannel;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.workspacebundleloader.BundleInfoLite;
+import org.eclipse.osee.framework.ui.workspacebundleloader.WorkspaceBundleLoadCoordinator;
+
+public class ManagedFolderArea {
+
+ private File bundleLocationFolder;
+
+ public ManagedFolderArea(File temporaryBundleLocationFolder) {
+ this.bundleLocationFolder = temporaryBundleLocationFolder;
+ }
+
+ public void initialize(){
+ bundleLocationFolder = setupTemporaryBundle(this.bundleLocationFolder);
+ }
+
+ private File setupTemporaryBundle(final File folder){
+ File folderToReturn = folder;
+ if(!folderToReturn.exists()){
+ if(!folderToReturn.mkdirs()){
+ folderToReturn = makeTempFolder();
+ }
+ } else if(folderToReturn.exists() && !folderToReturn.isDirectory()){
+ folderToReturn = makeTempFolder();
+ } else if(folderToReturn.exists()){
+ cleanOutDirectory(folderToReturn);
+ }
+ return folderToReturn;
+ }
+
+ /**
+ * should be a flat list of folders with the symbolic name of the bundle and then a version for each jar underneath each folder.
+ * @param folderToReturn
+ */
+ private void cleanOutDirectory(File folderRoot) {
+ File[] symbolicNameFolders = folderRoot.listFiles();
+ for(File folder:symbolicNameFolders){
+ if(folder.isDirectory()){
+ for(File file :folder.listFiles()){
+ file.delete();
+ }
+ folder.delete();
+ }
+ }
+ }
+
+ private File makeTempFolder(){
+ File folder = new File(System.getProperty("java.io.tmpdir"));
+ File oteFolder = new File(folder, "otebundleload");
+ if(!oteFolder.exists()){
+ oteFolder.mkdirs();
+ }
+ return oteFolder;
+ }
+
+ public List<BundleInfoLite> copyDeltasToManagedFolder(List<BundleInfoLite> copies) {
+ List<BundleInfoLite> bundlesAdded = new ArrayList<>();
+ for(BundleInfoLite info: copies){
+ File folder = new File(bundleLocationFolder, info.getSymbolicName());
+ folder.mkdirs();
+ File newFile = new File(folder, info.getVersion() + ".jar");
+ if(newFile.exists()){
+ newFile.delete();
+ }
+ FileChannel out = null;
+ FileChannel in = null;
+ try {
+ out = new FileOutputStream(newFile).getChannel();
+ String path = info.getSystemLocation().toURI().getPath();
+ in = new FileInputStream(new File(path)).getChannel();
+
+ long position = 0;
+ long size = in.size();
+ while (position < size) {
+ position += in.transferTo(position, size, out);
+ }
+ BundleInfoLite newBundle = new BundleInfoLite(newFile.toURI().toURL());
+ bundlesAdded.add(newBundle);
+ } catch (IOException e) {
+ OseeLog.log(WorkspaceBundleLoadCoordinator.class, Level.WARNING, e);
+ } catch (URISyntaxException e) {
+ OseeLog.log(WorkspaceBundleLoadCoordinator.class, Level.WARNING, e);
+ } finally {
+ try {
+ if(in != null){
+ in.close();
+ }
+ } catch (IOException e) {
+ }
+ try {
+ if(out != null){
+ out.close();
+ }
+ } catch (IOException e) {
+ }
+ }
+ }
+ return bundlesAdded;
+ }
+
+}
diff --git a/org.eclipse.osee.logback.config/.classpath b/org.eclipse.osee.logback.config/.classpath
new file mode 100644
index 000000000..acad1c227
--- /dev/null
+++ b/org.eclipse.osee.logback.config/.classpath
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.logback.config/.project b/org.eclipse.osee.logback.config/.project
new file mode 100644
index 000000000..8e304fde6
--- /dev/null
+++ b/org.eclipse.osee.logback.config/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.logback.config</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.logback.config/META-INF/MANIFEST.MF b/org.eclipse.osee.logback.config/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..204c7f707
--- /dev/null
+++ b/org.eclipse.osee.logback.config/META-INF/MANIFEST.MF
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OSEE Logback Config (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.logback.config
+Bundle-Version: 0.25.3.qualifier
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Fragment-Host: ch.qos.logback.classic;bundle-version="0.9.27"
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
diff --git a/org.eclipse.osee.logback.config/build.properties b/org.eclipse.osee.logback.config/build.properties
new file mode 100644
index 000000000..72bcc2a17
--- /dev/null
+++ b/org.eclipse.osee.logback.config/build.properties
@@ -0,0 +1,3 @@
+bin.includes = META-INF/,\
+ .,\
+ logback.xml
diff --git a/org.eclipse.osee.logback.config/logback-test.xml b/org.eclipse.osee.logback.config/logback-test.xml
new file mode 100644
index 000000000..f0425fbcd
--- /dev/null
+++ b/org.eclipse.osee.logback.config/logback-test.xml
@@ -0,0 +1,29 @@
+<configuration debug="true">
+ <!-- See documentation at http://logback.qos.ch/manual/joran.html -->
+
+ <!-- To select this configuration add -Dlogback.configurationFile=logback-dev.xml -->
+ <!-- Set attribute debug="true" to configuration xml element to trace logback configuration -->
+
+ <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+ <!-- encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
+ <encoder>
+ <pattern>%-40(%d{HH:mm:ss.SSS} [%-25.25logger{26}] %-5level) - %msg%n</pattern>
+ <outputPatternAsHeader>true</outputPatternAsHeader>
+ </encoder>
+ </appender>
+
+ <!-- Configure OSEE log messages -->
+ <logger name="org.eclipse.osee.jdbc" level="TRACE" />
+
+ <logger name="org.eclipse.osee.orcs.db" level="TRACE" />
+ <logger name="org.eclipse.osee.database" level="TRACE" />
+ <!-- <logger name="org.eclipse.osee.orcs.core" level="TRACE" /> -->
+ <logger name="org.eclipse.osee.framework.core.server" level="INFO" />
+
+ <!-- <logger name="org.apache.cxf" level="INFO" /> -->
+ <!-- <logger name="org.eclipse.osee.hsqldb" level="DEBUG" /> -->
+
+ <root level="WARN">
+ <appender-ref ref="STDOUT" />
+ </root>
+</configuration> \ No newline at end of file
diff --git a/org.eclipse.osee.logback.config/logback.xml b/org.eclipse.osee.logback.config/logback.xml
new file mode 100644
index 000000000..dff7317bb
--- /dev/null
+++ b/org.eclipse.osee.logback.config/logback.xml
@@ -0,0 +1,23 @@
+<configuration debug="true">
+ <!-- See documentation at http://logback.qos.ch/manual/joran.html -->
+
+ <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+ <!-- encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder
+ by default -->
+ <encoder>
+ <pattern>%-50(%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-25.25logger{26}] %-5level) - %msg%n</pattern>
+ <outputPatternAsHeader>true</outputPatternAsHeader>
+ </encoder>
+ </appender>
+
+ <!-- Configure OSEE log messages -->
+ <logger name="org.eclipse.osee" level="WARN" />
+ <logger name="org.eclipse.osee.framework.core.server" level="INFO" />
+
+ <!-- <logger name="org.eclipse.osee.orcs.db" level="DEBUG" /> -->
+ <!-- <logger name="org.apache.cxf" level="INFO" />-->
+
+ <root level="WARN">
+ <appender-ref ref="STDOUT" />
+ </root>
+</configuration> \ No newline at end of file
diff --git a/org.eclipse.osee.logback.config/pom.xml b/org.eclipse.osee.logback.config/pom.xml
new file mode 100644
index 000000000..0ed3c10b1
--- /dev/null
+++ b/org.eclipse.osee.logback.config/pom.xml
@@ -0,0 +1,17 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.osee</groupId>
+ <artifactId>org.eclipse.osee.x.server.parent</artifactId>
+ <version>0.25.3-SNAPSHOT</version>
+ <relativePath>../../plugins/org.eclipse.osee.x.server.parent</relativePath>
+ </parent>
+
+ <artifactId>org.eclipse.osee.logback.config</artifactId>
+ <packaging>eclipse-plugin</packaging>
+ <name>OSEE Logback Config - (Incubation)</name>
+
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.logger.slf4j/.classpath b/org.eclipse.osee.logger.slf4j/.classpath
new file mode 100644
index 000000000..1fa3e6803
--- /dev/null
+++ b/org.eclipse.osee.logger.slf4j/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.logger.slf4j/.project b/org.eclipse.osee.logger.slf4j/.project
new file mode 100644
index 000000000..af3299e9f
--- /dev/null
+++ b/org.eclipse.osee.logger.slf4j/.project
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.logger.slf4j</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ds.core.builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.logger.slf4j/META-INF/MANIFEST.MF b/org.eclipse.osee.logger.slf4j/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..1081f5b85
--- /dev/null
+++ b/org.eclipse.osee.logger.slf4j/META-INF/MANIFEST.MF
@@ -0,0 +1,15 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Osee Logger Slf4j (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.logger.slf4j
+Bundle-Version: 0.25.3.qualifier
+Import-Package: org.eclipse.osee.framework.jdk.core.util,
+ org.eclipse.osee.logger,
+ org.osgi.framework,
+ org.osgi.service.component,
+ org.osgi.service.log,
+ org.slf4j
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Service-Component: OSGI-INF/*.xml
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Bundle-ActivationPolicy: lazy
diff --git a/org.eclipse.osee.logger.slf4j/OSGI-INF/log.impl.provider.xml b/org.eclipse.osee.logger.slf4j/OSGI-INF/log.impl.provider.xml
new file mode 100644
index 000000000..72fdbd6c4
--- /dev/null
+++ b/org.eclipse.osee.logger.slf4j/OSGI-INF/log.impl.provider.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="start" deactivate="stop" immediate="false" name="org.eclipse.osee.logger.slf4j.internal.Sfl4jLogImpl">
+ <implementation class="org.eclipse.osee.logger.slf4j.internal.Sfl4jLogImpl"/>
+
+ <service servicefactory="true">
+ <provide interface="org.eclipse.osee.logger.Log"/>
+ </service>
+
+</scr:component>
diff --git a/org.eclipse.osee.logger.slf4j/OSGI-INF/log.service.reader.xml b/org.eclipse.osee.logger.slf4j/OSGI-INF/log.service.reader.xml
new file mode 100644
index 000000000..065107400
--- /dev/null
+++ b/org.eclipse.osee.logger.slf4j/OSGI-INF/log.service.reader.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" enabled="true" immediate="true" name="org.eclipse.osee.logger.slf4j.internal.OsgiSlf4jLogger">
+ <implementation class="org.eclipse.osee.logger.slf4j.internal.OsgiSlf4jLogger"/>
+
+ <reference bind="setLoggingService"
+ cardinality="1..1"
+ interface="org.osgi.service.log.LogReaderService"
+ name="LogReaderService"
+ policy="static"
+ target="(objectClass=org.osgi.service.log.LogReaderService)"/>
+
+
+</scr:component>
diff --git a/org.eclipse.osee.logger.slf4j/build.properties b/org.eclipse.osee.logger.slf4j/build.properties
new file mode 100644
index 000000000..c58ea2178
--- /dev/null
+++ b/org.eclipse.osee.logger.slf4j/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ OSGI-INF/
diff --git a/org.eclipse.osee.logger.slf4j/pom.xml b/org.eclipse.osee.logger.slf4j/pom.xml
new file mode 100644
index 000000000..e8b9a8af1
--- /dev/null
+++ b/org.eclipse.osee.logger.slf4j/pom.xml
@@ -0,0 +1,34 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.osee</groupId>
+ <artifactId>org.eclipse.osee.x.core.parent</artifactId>
+ <version>0.25.3-SNAPSHOT</version>
+ <relativePath>../../plugins/org.eclipse.osee.x.core.parent</relativePath>
+ </parent>
+
+ <artifactId>org.eclipse.osee.logger.slf4j</artifactId>
+ <packaging>eclipse-plugin</packaging>
+ <name>OSEE Logger SLF4J - (Incubation)</name>
+
+ <build>
+ <!-- workaround for https://issues.sonatype.org/browse/TYCHO-168 -->
+ <resources>
+ <resource>
+ <directory>src</directory>
+ <excludes>
+ <exclude>**/*.java</exclude>
+ </excludes>
+ </resource>
+ </resources>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-source-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.logger.slf4j/src/org/eclipse/osee/logger/slf4j/internal/OsgiSlf4jLogger.java b/org.eclipse.osee.logger.slf4j/src/org/eclipse/osee/logger/slf4j/internal/OsgiSlf4jLogger.java
new file mode 100644
index 000000000..e37ebdb34
--- /dev/null
+++ b/org.eclipse.osee.logger.slf4j/src/org/eclipse/osee/logger/slf4j/internal/OsgiSlf4jLogger.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.logger.slf4j.internal;
+
+import org.osgi.service.log.LogListener;
+import org.osgi.service.log.LogReaderService;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OsgiSlf4jLogger {
+
+ private LogListener listener;
+ private LogReaderService logService;
+
+ public void setLoggingService(LogReaderService logService) {
+ this.logService = logService;
+ }
+
+ public synchronized void activate() {
+ listener = new Slf4jLogListener();
+ logService.addLogListener(listener);
+ }
+
+ public synchronized void deactivate() {
+ logService.removeLogListener(listener);
+ listener = null;
+ logService = null;
+ }
+}
diff --git a/org.eclipse.osee.logger.slf4j/src/org/eclipse/osee/logger/slf4j/internal/Sfl4jLogImpl.java b/org.eclipse.osee.logger.slf4j/src/org/eclipse/osee/logger/slf4j/internal/Sfl4jLogImpl.java
new file mode 100644
index 000000000..2795e86a6
--- /dev/null
+++ b/org.eclipse.osee.logger.slf4j/src/org/eclipse/osee/logger/slf4j/internal/Sfl4jLogImpl.java
@@ -0,0 +1,207 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.logger.slf4j.internal;
+
+import org.eclipse.osee.logger.Log;
+import org.osgi.framework.Bundle;
+import org.osgi.service.component.ComponentContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.slf4j.Marker;
+import org.slf4j.MarkerFactory;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class Sfl4jLogImpl implements Log {
+
+ private static final int LOG_ERROR = 1;
+ private static final int LOG_WARNING = 2;
+ private static final int LOG_INFO = 3;
+ private static final int LOG_DEBUG = 4;
+ private static final int LOG_TRACE = 5;
+
+ private Logger logger;
+ private Marker marker;
+
+ public void start(ComponentContext context) {
+ if (logger == null) {
+ Bundle usingBundle = context.getUsingBundle();
+ String symbolicName = null;
+ if (usingBundle != null) {
+ symbolicName = usingBundle.getSymbolicName();
+ } else {
+ symbolicName = "Osee Log";
+ }
+ logger = LoggerFactory.getLogger(symbolicName);
+ marker = MarkerFactory.getMarker(symbolicName);
+ debug("Logger setup for [%s]", logger.getName());
+ }
+ }
+
+ public void stop() {
+ logger = null;
+ marker = null;
+ }
+
+ private Logger getLogger() {
+ return logger;
+ }
+
+ @Override
+ public boolean isTraceEnabled() {
+ return isEnabled(LOG_TRACE);
+ }
+
+ @Override
+ public void trace(String format, Object... args) {
+ trace(null, format, args);
+ }
+
+ @Override
+ public void trace(Throwable th, String format, Object... args) {
+ logHelper(LOG_TRACE, th, format, args);
+ }
+
+ @Override
+ public boolean isDebugEnabled() {
+ return isEnabled(LOG_DEBUG);
+ }
+
+ @Override
+ public void debug(String format, Object... args) {
+ debug(null, format, args);
+ }
+
+ @Override
+ public void debug(Throwable th, String format, Object... args) {
+ logHelper(LOG_DEBUG, th, format, args);
+ }
+
+ @Override
+ public boolean isInfoEnabled() {
+ return isEnabled(LOG_INFO);
+ }
+
+ @Override
+ public void info(String format, Object... args) {
+ info(null, format, args);
+ }
+
+ @Override
+ public void info(Throwable th, String format, Object... args) {
+ logHelper(LOG_INFO, th, format, args);
+ }
+
+ @Override
+ public boolean isWarnEnabled() {
+ return isEnabled(LOG_WARNING);
+ }
+
+ @Override
+ public void warn(String format, Object... args) {
+ warn(null, format, args);
+ }
+
+ @Override
+ public void warn(Throwable th, String format, Object... args) {
+ logHelper(LOG_WARNING, th, format, args);
+ }
+
+ @Override
+ public boolean isErrorEnabled() {
+ return isEnabled(LOG_ERROR);
+ }
+
+ @Override
+ public void error(String format, Object... args) {
+ error(null, format, args);
+ }
+
+ @Override
+ public void error(Throwable th, String format, Object... args) {
+ logHelper(LOG_ERROR, th, format, args);
+ }
+
+ private boolean isEnabled(int level) {
+ boolean result = false;
+ final Logger logger = getLogger();
+ if (logger != null) {
+ switch (level) {
+ case LOG_DEBUG:
+ result = logger.isDebugEnabled();
+ break;
+ case LOG_ERROR:
+ result = logger.isErrorEnabled();
+ break;
+ case LOG_WARNING:
+ result = logger.isWarnEnabled();
+ break;
+ case LOG_INFO:
+ result = logger.isInfoEnabled();
+ break;
+ default:
+ result = logger.isTraceEnabled();
+ break;
+ }
+ }
+ return result;
+ }
+
+ private void logHelper(int level, Throwable th, String format, Object... args) {
+ logHelper(null, level, th, format, args);
+ }
+
+ private void logHelper(Object context, int level, Throwable th, String format, Object... args) {
+ final Logger logger = getLogger();
+ if (isEnabled(level)) {
+ String message = safeFormat(format, args);
+ if (message != null) {
+ switch (level) {
+ case LOG_DEBUG:
+ logger.debug(marker, message, th);
+ break;
+ case LOG_ERROR:
+ logger.error(marker, message, th);
+ break;
+ case LOG_WARNING:
+ logger.warn(marker, message, th);
+ break;
+ case LOG_INFO:
+ logger.info(marker, message, th);
+ break;
+ default:
+ logger.trace(marker, message, th);
+ break;
+ }
+ }
+ }
+ }
+
+ private static String safeFormat(String message, Object... args) {
+ String toReturn;
+ try {
+ toReturn = String.format(message, args);
+ } catch (RuntimeException ex) {
+ StringBuilder builder = new StringBuilder();
+ builder.append("Log message could not be formatted:");
+ builder.append(message);
+ builder.append(" with the following arguments [");
+ builder.append(org.eclipse.osee.framework.jdk.core.util.Collections.toString(",", args));
+ builder.append("]. Cause [");
+ builder.append(ex.toString());
+ builder.append("]");
+ toReturn = builder.toString();
+ }
+ return toReturn;
+ }
+
+}
diff --git a/org.eclipse.osee.logger.slf4j/src/org/eclipse/osee/logger/slf4j/internal/Slf4jLogListener.java b/org.eclipse.osee.logger.slf4j/src/org/eclipse/osee/logger/slf4j/internal/Slf4jLogListener.java
new file mode 100644
index 000000000..8b72c7c68
--- /dev/null
+++ b/org.eclipse.osee.logger.slf4j/src/org/eclipse/osee/logger/slf4j/internal/Slf4jLogListener.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.logger.slf4j.internal;
+
+import org.osgi.service.log.LogEntry;
+import org.osgi.service.log.LogListener;
+import org.osgi.service.log.LogService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.slf4j.Marker;
+import org.slf4j.MarkerFactory;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class Slf4jLogListener implements LogListener {
+ private static final Logger logger = LoggerFactory.getLogger(Slf4jLogListener.class);
+ private static final String[] remapMessages = new String[] {"Bundle Event", "Service Event"};
+
+ @Override
+ public void logged(LogEntry entry) {
+ try {
+ String symbolicName = entry.getBundle().getSymbolicName();
+ Logger logger = LoggerFactory.getLogger(symbolicName);
+ Marker marker = MarkerFactory.getMarker(symbolicName);
+ logLogEntry(logger, entry.getLevel(), marker, entry.getMessage(), entry.getException());
+ } catch (Exception ex) {
+ logger.error("Error during log listening", ex);
+ }
+ }
+
+ private void logLogEntry(Logger logger, int level, Marker marker, String message, Throwable throwable) {
+ int theLevel = level;
+ if (throwable == null || isOSGIMessage(message)) {
+ theLevel = LogService.LOG_DEBUG;
+ }
+ String originalName = Thread.currentThread().getName();
+ try {
+ Thread.currentThread().setName("Osgi Log Service");
+ switch (theLevel) {
+ case LogService.LOG_DEBUG:
+ logger.debug(marker, message, throwable);
+ break;
+ case LogService.LOG_ERROR:
+ logger.error(marker, message, throwable);
+ break;
+ case LogService.LOG_WARNING:
+ logger.warn(marker, message, throwable);
+ break;
+ case LogService.LOG_INFO:
+ logger.info(marker, message, throwable);
+ break;
+ default:
+ logger.trace(marker, message, throwable);
+ break;
+ }
+ } finally {
+ Thread.currentThread().setName(originalName);
+ }
+ }
+
+ private boolean isOSGIMessage(String message) {
+ for (String toCheck : remapMessages) {
+ if (message.startsWith(toCheck)) {
+ return true;
+ }
+ }
+ return false;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.logger/.classpath b/org.eclipse.osee.logger/.classpath
new file mode 100644
index 000000000..1fa3e6803
--- /dev/null
+++ b/org.eclipse.osee.logger/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.logger/.project b/org.eclipse.osee.logger/.project
new file mode 100644
index 000000000..d629e9ffb
--- /dev/null
+++ b/org.eclipse.osee.logger/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.logger</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.logger/META-INF/MANIFEST.MF b/org.eclipse.osee.logger/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..b297e49c6
--- /dev/null
+++ b/org.eclipse.osee.logger/META-INF/MANIFEST.MF
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Osee Logger (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.logger
+Bundle-Version: 0.25.3.qualifier
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: org.eclipse.osee.logger
diff --git a/org.eclipse.osee.logger/build.properties b/org.eclipse.osee.logger/build.properties
new file mode 100644
index 000000000..34d2e4d2d
--- /dev/null
+++ b/org.eclipse.osee.logger/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .
diff --git a/org.eclipse.osee.logger/pom.xml b/org.eclipse.osee.logger/pom.xml
new file mode 100644
index 000000000..f29c1723e
--- /dev/null
+++ b/org.eclipse.osee.logger/pom.xml
@@ -0,0 +1,34 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.osee</groupId>
+ <artifactId>org.eclipse.osee.x.core.parent</artifactId>
+ <version>0.25.3-SNAPSHOT</version>
+ <relativePath>../../plugins/org.eclipse.osee.x.core.parent</relativePath>
+ </parent>
+
+ <artifactId>org.eclipse.osee.logger</artifactId>
+ <packaging>eclipse-plugin</packaging>
+ <name>OSEE Logger - (Incubation)</name>
+
+ <build>
+ <!-- workaround for https://issues.sonatype.org/browse/TYCHO-168 -->
+ <resources>
+ <resource>
+ <directory>src</directory>
+ <excludes>
+ <exclude>**/*.java</exclude>
+ </excludes>
+ </resource>
+ </resources>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-source-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.logger/src/org/eclipse/osee/logger/Log.java b/org.eclipse.osee.logger/src/org/eclipse/osee/logger/Log.java
new file mode 100644
index 000000000..8ff212409
--- /dev/null
+++ b/org.eclipse.osee.logger/src/org/eclipse/osee/logger/Log.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.logger;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface Log {
+
+ boolean isTraceEnabled();
+
+ void trace(String format, Object... args);
+
+ void trace(Throwable th, String format, Object... args);
+
+ boolean isDebugEnabled();
+
+ void debug(String format, Object... args);
+
+ void debug(Throwable th, String format, Object... args);
+
+ boolean isInfoEnabled();
+
+ void info(String format, Object... args);
+
+ void info(Throwable th, String format, Object... args);
+
+ boolean isWarnEnabled();
+
+ void warn(String format, Object... args);
+
+ void warn(Throwable th, String format, Object... args);
+
+ boolean isErrorEnabled();
+
+ void error(String format, Object... args);
+
+ void error(Throwable th, String format, Object... args);
+}
diff --git a/org.eclipse.osee.ote.client.msg/.classpath b/org.eclipse.osee.ote.client.msg/.classpath
new file mode 100644
index 000000000..1fa3e6803
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.ote.client.msg/.pmd b/org.eclipse.osee.ote.client.msg/.pmd
new file mode 100644
index 000000000..c7b0a9fb3
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/.pmd
@@ -0,0 +1,925 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<pmd>
+ <useProjectRuleSet>false</useProjectRuleSet>
+ <ruleSetFile>.ruleset</ruleSetFile>
+ <rules>
+ <rule>
+ <name>LooseCoupling</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneMethodMustImplementCloneable</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedImports</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SignatureDeclareThrowsException</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IfStmtsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>WhileLoopsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IfElseStmtsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ForLoopsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseSingleton</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanReturns</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanExpressions</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SwitchStmtsShouldHaveDefault</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDeeplyNestedIfStmts</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidReassigningParameters</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SwitchDensity</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConstructorCallsOverridableMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AccessorClassGeneration</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalFieldCouldBeStatic</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloseResource</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonStaticInitializer</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DefaultLabelNotLastInSwitchStmt</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonCaseLabelInSwitchStatement</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>OptimizableToArrayCall</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BadComparison</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EqualsNull</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConfusingTernary</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InstantiationToGetClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IdempotentOperations</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimpleDateFormatNeedsLocale</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ImmutableField</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseLocaleWithCaseConversions</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidProtectedFieldInFinalClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AssignmentToNonFinalStatic</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingStaticMethodInNonInstantiatableClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidSynchronizedAtMethodLevel</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingBreakInSwitch</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseNotifyAllInsteadOfNotify</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidInstanceofChecksInCatchClause</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractClassWithoutAbstractMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyConditional</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CompareObjectsWithEquals</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PositionLiteralsFirstInComparisons</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryLocalBeforeReturn</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonThreadSafeSingleton</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UncommentedEmptyMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UncommentedEmptyConstructor</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidConstantsInterface</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnsynchronizedStaticDateFormatter</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PreserveStackTrace</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseCollectionIsEmpty</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassWithOnlyPrivateConstructorsShouldBeFinal</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyMethodInAbstractClassShouldBeAbstract</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SingularField</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReturnEmptyArrayRatherThanNull</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractClassWithoutAnyMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooFewBranchesForASwitchStatement</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCatchingThrowable</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SignatureDeclareThrowsException</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExceptionAsFlowControl</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCatchingNPE</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingRawExceptionTypes</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingNullPointerException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidRethrowingException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotExtendJavaLangError</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotThrowExceptionInFinally</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingNewInstanceOfSameException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedPrivateField</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedLocalVariable</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedPrivateMethod</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedFormalParameter</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MoreThanOneLogger</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LoggerIsNotStaticFinal</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SystemPrintln</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidPrintStackTrace</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDuplicateLiterals</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringInstantiation</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringToString</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InefficientStringBuffering</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryCaseChange</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseStringBufferLength</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AppendCharacterWithChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConsecutiveLiteralAppends</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseIndexOfChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InefficientEmptyStringCheck</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InsufficientStringBufferDeclaration</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessStringValueOf</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringBufferInstantiationWithChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseEqualsToCompareStrings</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidStringBufferField</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceVectorWithList</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceHashtableWithMap</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceEnumerationWithIterator</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidEnumAsIdentifier</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidAssertAsIdentifier</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IntegerInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ByteInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ShortInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LongInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseBeforeAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseAfterAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseTestAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4SuitesShouldUseSuiteAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitUseExpected</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseProperClassLoader</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MDBAndSessionBeanNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>RemoteSessionInterfaceNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LocalInterfaceSessionNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LocalHomeNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>RemoteInterfaceNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotCallSystemExit</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StaticEJBFieldShouldBeFinal</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotUseThreads</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidInstantiatingObjectsInLoops</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseArrayListInsteadOfVector</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyStartsWith</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseStringBufferForStringAppends</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseArraysAsList</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidArrayLoops</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryWrapperObjectCreation</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AddEmptyString</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyCatchBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyIfStmt</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyWhileStmt</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyTryBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyFinallyBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptySwitchStatements</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JumbledIncrementer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ForLoopShouldBeWhileLoop</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryConversionTemporary</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>OverrideBothEqualsAndHashcode</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoubleCheckedLocking</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReturnFromFinallyBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptySynchronizedBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryReturn</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyStaticInitializer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnconditionalIfStatement</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyStatementNotInLoop</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanInstantiation</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryFinalModifier</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CollapsibleIfStatements</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessOverridingMethod</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassCastExceptionWithToArray</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDecimalLiteralsInBigDecimalConstructor</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessOperationOnImmutable</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MisplacedNullCheck</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedNullCheckInEquals</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThreadGroup</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BrokenNullCheck</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BigIntegerInstantiation</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingOctalValues</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingHardCodedIP</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CheckResultSet</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidMultipleUnaryOperators</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyInitializer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodReturnsInternalArray</name>
+ <ruleset>Security Code Guidelines</ruleset>
+ </rule>
+ <rule>
+ <name>ArrayIsStoredDirectly</name>
+ <ruleset>Security Code Guidelines</ruleset>
+ </rule>
+ <rule>
+ <name>CouplingBetweenObjects</name>
+ <ruleset>Coupling Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveImports</name>
+ <ruleset>Coupling Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LooseCoupling</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DuplicateImports</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DontImportJavaLang</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedImports</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ImportFromSamePackage</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyStaticImports</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitStaticSuite</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitSpelling</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitAssertionsShouldIncludeMessage</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitTestsShouldIncludeAssert</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TestClassWithoutTestCases</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryBooleanAssertion</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertEqualsInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertSameInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertNullInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanAssertion</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NullAssignment</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedModifier</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AssignmentInOperand</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AtLeastOneConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DontImportSun</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousOctalEscape</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CallSuperInConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryParentheses</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DefaultPackage</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanInversion</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DataflowAnomalyAnalysis</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFinalLocalVariable</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingShortType</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingVolatile</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingNativeCode</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidAccessibilityAlteration</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotCallGarbageCollectionExplicitly</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodNamingConventions</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassNamingConventions</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractNaming</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDollarSigns</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodWithSameNameAsEnclosingClass</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousHashcodeMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousConstantFieldName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousEqualsMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFieldNameMatchingTypeName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFieldNameMatchingMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NoPackage</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PackageCase</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MisleadingVariableName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanGetMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NPathComplexity</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveMethodLength</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveParameterList</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveClassLength</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CyclomaticComplexity</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessivePublicCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyFields</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssMethodCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssTypeCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssConstructorCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyMethods</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyFinalizer</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeOnlyCallsSuperFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeOverloaded</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeDoesNotCallSuperFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeShouldBeProtected</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCallingFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseCorrectExceptionLogging</name>
+ <ruleset>Jakarta Commons Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ProperLogger</name>
+ <ruleset>Jakarta Commons Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingSerialVersionUID</name>
+ <ruleset>JavaBean Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ProperCloneImplementation</name>
+ <ruleset>Clone Implementation Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneThrowsCloneNotSupportedException</name>
+ <ruleset>Clone Implementation Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneMethodMustImplementCloneable</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ </rules>
+ <includeDerivedFiles>false</includeDerivedFiles>
+ <violationsAsErrors>true</violationsAsErrors>
+</pmd>
diff --git a/org.eclipse.osee.ote.client.msg/.project b/org.eclipse.osee.ote.client.msg/.project
new file mode 100644
index 000000000..f678ca87b
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/.project
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ote.client.msg</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ds.core.builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.client.msg/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.client.msg/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..0c530f75f
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/META-INF/MANIFEST.MF
@@ -0,0 +1,22 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Msg Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.client.msg;singleton:=true
+Bundle-Version: 0.25.3.qualifier
+Bundle-Activator: org.eclipse.osee.ote.client.msg.core.internal.Activator
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.osee.ote.core,
+ org.eclipse.osee.ote.client,
+ org.eclipse.osee.ote.connection.service,
+ org.eclipse.osee.framework.jdk.core,
+ org.eclipse.osee.ote.messaging.dds,
+ org.eclipse.osee.framework.plugin.core
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: org.eclipse.osee.ote.client.msg,
+ org.eclipse.osee.ote.client.msg.core,
+ org.eclipse.osee.ote.client.msg.core.db
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Service-Component: OSGI-INF/*.xml
+Import-Package: org.osgi.service.event
diff --git a/org.eclipse.osee.ote.client.msg/OSGI-INF/MessageSubscriptionServiceComponent.xml b/org.eclipse.osee.ote.client.msg/OSGI-INF/MessageSubscriptionServiceComponent.xml
new file mode 100644
index 000000000..948f5371d
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/OSGI-INF/MessageSubscriptionServiceComponent.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="start" deactivate="stop" name="org.eclipse.osee.ote.client.msg">
+ <implementation class="org.eclipse.osee.ote.client.msg.core.internal.MessageSubscriptionService"/>
+ <reference bind="addMessageDefinitionProvider" cardinality="0..n" interface="org.eclipse.osee.ote.message.MessageDefinitionProvider" name="MessageDefinitionProvider" policy="dynamic" unbind="removeMessageDefinitionProvider"/>
+ <reference bind="bindOteClientService" cardinality="1..1" interface="org.eclipse.osee.ote.service.IOteClientService" name="IOteClientService" policy="static" unbind="unbindOteClientService"/>
+ <service>
+ <provide interface="org.eclipse.osee.ote.client.msg.IOteMessageService"/>
+ <provide interface="org.eclipse.osee.ote.message.interfaces.IMsgToolServiceClient"/>
+ <provide interface="org.osgi.service.event.EventHandler"/>
+ </service>
+ <property name="event.topics" type="String" value="ote/message/recordingComplete"/>
+</scr:component>
diff --git a/org.eclipse.osee.ote.client.msg/build.properties b/org.eclipse.osee.ote.client.msg/build.properties
new file mode 100644
index 000000000..6210e849b
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/build.properties
@@ -0,0 +1,5 @@
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ OSGI-INF/
+source.. = src/
diff --git a/org.eclipse.osee.ote.client.msg/pom.xml b/org.eclipse.osee.ote.client.msg/pom.xml
new file mode 100644
index 000000000..fe2ba6e5e
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/pom.xml
@@ -0,0 +1,35 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.osee</groupId>
+ <artifactId>org.eclipse.osee.ote.parent</artifactId>
+ <version>0.25.3-SNAPSHOT</version>
+ <relativePath>../org.eclipse.osee.ote.parent</relativePath>
+ </parent>
+
+ <artifactId>org.eclipse.osee.ote.client.msg</artifactId>
+ <packaging>eclipse-plugin</packaging>
+ <name>OTE Client Message (Incubation)</name>
+
+ <build>
+ <!-- workaround for https://issues.sonatype.org/browse/TYCHO-168 -->
+ <resources>
+ <resource>
+ <directory>src</directory>
+ <excludes>
+ <exclude>**/*.java</exclude>
+ </excludes>
+ </resource>
+ </resources>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-source-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/IOteMessageService.java b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/IOteMessageService.java
new file mode 100644
index 000000000..8ba1114b9
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/IOteMessageService.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.client.msg;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.List;
+
+import org.eclipse.osee.ote.client.msg.core.IMessageSubscription;
+import org.eclipse.osee.ote.message.commands.RecordCommand;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.tool.IFileTransferHandle;
+import org.eclipse.osee.ote.message.tool.MessageMode;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IOteMessageService {
+ IMessageSubscription subscribe(String name);
+
+ IMessageSubscription subscribe(String name, MessageMode mode);
+
+ IMessageSubscription subscribe(String name, DataType dataType, MessageMode mode);
+
+ IMessageSubscription subscribe(String name, String dataType, MessageMode mode);
+
+ IFileTransferHandle startRecording(String fileName, List<RecordCommand.MessageRecordDetails> list) throws FileNotFoundException, IOException;
+
+ void stopRecording() throws Exception;
+}
diff --git a/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/AbstractMessageListener.java b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/AbstractMessageListener.java
new file mode 100644
index 000000000..bfbc1c187
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/AbstractMessageListener.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.client.msg.core;
+
+import org.eclipse.osee.ote.message.MessageSystemException;
+import org.eclipse.osee.ote.message.listener.IOSEEMessageListener;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public abstract class AbstractMessageListener implements ISubscriptionListener, IOSEEMessageListener {
+
+ private final IMessageSubscription subscription;
+
+ protected AbstractMessageListener(IMessageSubscription subscription) {
+ this.subscription = subscription;
+ }
+
+ @Override
+ public void subscriptionCanceled(IMessageSubscription subscription) {
+ if (subscription.isResolved()) {
+ subscription.getMessage().removeListener(this);
+ }
+ }
+
+ @Override
+ public void subscriptionResolved(IMessageSubscription subscription) {
+ if (subscription.isResolved()) {
+ subscription.getMessage().addListener(this);
+ }
+ }
+
+ @Override
+ public void subscriptionUnresolved(IMessageSubscription subscription) {
+ }
+
+ @Override
+ public void onInitListener() throws MessageSystemException {
+ }
+
+ public IMessageSubscription getSubscription() {
+ return subscription;
+ }
+}
diff --git a/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/IMessageDbFactory.java b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/IMessageDbFactory.java
new file mode 100644
index 000000000..d6954f6f9
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/IMessageDbFactory.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.client.msg.core;
+
+import org.eclipse.osee.ote.client.msg.core.db.AbstractMessageDataBase;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IMessageDbFactory {
+
+ AbstractMessageDataBase createMessageDataBase();
+}
diff --git a/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/IMessageSubscription.java b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/IMessageSubscription.java
new file mode 100644
index 000000000..cfd34421a
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/IMessageSubscription.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.client.msg.core;
+
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.tool.MessageMode;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IMessageSubscription {
+ Message getMessage();
+
+ void cancel();
+
+ String getMessageClassName();
+
+ MessageMode getMessageMode();
+
+ DataType getMemType();
+
+ /**
+ * returns whether or not the subscription has been activated. A subscription is considered activated if and only if
+ * a proper connection to a test server has been established and a successful registration of the subscription is
+ * made. A subscription is not bound to any instance of a test server. A subscription is honored even when switching
+ * between different test servers.
+ */
+ boolean isActive();
+
+ boolean isResolved();
+
+ void changeMemType(DataType type);
+
+ void send() throws Exception;
+
+ void setElementValue(List<Object> path, String value) throws Exception;
+ void setElementValueNoSend(List<Object> path, String value) throws Exception;
+ void zeroize(List<Object> path) throws Exception;
+
+ void changeMessageMode(MessageMode mode);
+
+ Set<DataType> getAvailableTypes();
+
+ boolean addSubscriptionListener(ISubscriptionListener listener);
+
+ boolean removeSubscriptionListener(ISubscriptionListener listener);
+}
diff --git a/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/ISubscriptionListener.java b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/ISubscriptionListener.java
new file mode 100644
index 000000000..1d3afd64b
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/ISubscriptionListener.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.client.msg.core;
+
+import org.eclipse.osee.ote.message.Message;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface ISubscriptionListener {
+ /**
+ * called when a subscription can no longer be fulfilled by the message service. this occurs when runtime libraries
+ * are changed and the message does not exist. Can be called when a message exist in the libraries but is not
+ * supported by the test environment. all references and event listeners must be removed
+ */
+ void subscriptionInvalidated(IMessageSubscription subscription);
+
+ /**
+ * called upon a successful acquisition of a {@link Message} instance. At this point, no message traffic is being
+ * transmitted but operations on the message are allowed. Subclasses should register any event listeners on
+ * {@link Message} upon this method being invoked.
+ */
+ void subscriptionResolved(IMessageSubscription subscription);
+
+ /**
+ * called when the message library has been unloaded. The subscription will still be honored by the system and can be
+ * reactivated upon a reload of a library assuming the library has a definition for the message. Subclasses should
+ * <B>must no longer reference</B> the ({@link Message} related to the subscription. Subclasses do not need to
+ * de-register any event listeners since all listeners will be cleared. The message is still in a valid state during
+ * this method invocation but not after.
+ */
+ void subscriptionUnresolved(IMessageSubscription subscription);
+
+ /**
+ * called upon successful registration with the test server. Message traffic is now possible
+ */
+ void subscriptionActivated(IMessageSubscription subscription);
+
+ /**
+ * called when the {@link IMessageSubscription#cancel()} method is called. Any references and event listeners must be
+ * removed.
+ */
+ void subscriptionCanceled(IMessageSubscription subscription);
+
+ /**
+ * called when the subscription is resolved but a connected environment does not support this type of message. The
+ * message can still be referenced but no updates will be delivered.
+ */
+ void subscriptionNotSupported(IMessageSubscription subscription);
+}
diff --git a/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/db/AbstractMessageDataBase.java b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/db/AbstractMessageDataBase.java
new file mode 100644
index 000000000..da18e02e2
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/db/AbstractMessageDataBase.java
@@ -0,0 +1,204 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.client.msg.core.db;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.ExportClassLoader;
+import org.eclipse.osee.ote.client.msg.core.internal.MessageReference;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.interfaces.IMsgToolServiceClient;
+import org.eclipse.osee.ote.message.tool.MessageMode;
+import org.eclipse.osee.ote.messaging.dds.entity.DataReader;
+import org.eclipse.osee.ote.messaging.dds.entity.EntityFactory;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public abstract class AbstractMessageDataBase {
+
+ private final HashMap<MessageReference, MessageInstance> referenceToMsgMap =
+ new HashMap<MessageReference, MessageInstance>();
+ private final ConcurrentHashMap<Integer, MessageInstance> idToMsgMap =
+ new ConcurrentHashMap<Integer, MessageInstance>();
+
+ private Executor worker = Executors.newSingleThreadExecutor();
+
+ private IMsgToolServiceClient client;
+ private volatile boolean connected = false;
+ private final DataReader reader = new DataReader(null, null, true, null, new EntityFactory() {
+
+ @Override
+ public boolean isEnabled() {
+ return true;
+ }
+
+ });
+
+ protected AbstractMessageDataBase(IMsgToolServiceClient service) {
+ client = service;
+ }
+
+ public MessageInstance findInstance(String name, MessageMode mode, DataType type) {
+ MessageReference reference = new MessageReference(type, mode, name);
+ return referenceToMsgMap.get(reference);
+ }
+
+ public MessageInstance acquireInstance(String name) throws Exception {
+ return acquireInstance(name, MessageMode.READER, (DataType) null);
+ }
+
+ public MessageInstance acquireInstance(String name, MessageMode mode, DataType type) throws Exception {
+ if (type == null) {
+ Class<? extends Message> msgClass = ExportClassLoader.getInstance().loadClass(name).asSubclass(Message.class);
+
+ type = msgClass.newInstance().getDefaultMessageData().getType();
+ }
+ MessageReference reference = new MessageReference(type, mode, name);
+ MessageInstance instance = referenceToMsgMap.get(reference);
+ if (instance == null) {
+ Class<? extends Message> msgClass = ExportClassLoader.getInstance().loadClass(name).asSubclass(Message.class);
+ Message msg = createMessage(msgClass);
+ for (ArrayList<MessageData> dataList : (Collection<ArrayList<MessageData>>) msg.getAllData()) {
+ for (MessageData data : dataList) {
+ data.setReader(reader);
+ }
+ }
+ msg.setMemSource(type);
+ instance = new MessageInstance(msg, mode, type);
+ referenceToMsgMap.put(reference, instance);
+ }
+ instance.incrementReferenceCount();
+ if (connected && !instance.isAttached()) {
+ doInstanceAttach(instance);
+ }
+ return instance;
+ }
+
+ public MessageInstance acquireInstance(String name, MessageMode mode, String dataType) throws Exception {
+ Class<? extends Message> msgClass = ExportClassLoader.getInstance().loadClass(name).asSubclass(Message.class);
+ Message msg = msgClass.newInstance();
+
+ //Set<DataType> available = msg.getAvailableMemTypes();
+ Set<DataType> available = msg.getAssociatedMessages().keySet();
+ DataType requestDataType = msg.getDefaultMessageData().getType();
+ for (DataType type : available) {
+ if (type.name().equals(dataType)) {
+ requestDataType = type;
+ break;
+ }
+
+ }
+ MessageReference reference = new MessageReference(requestDataType, mode, name);
+ MessageInstance instance = referenceToMsgMap.get(reference);
+ if (instance == null) {
+ msg = createMessage(msgClass);
+ msg.setMemSource(requestDataType);
+ for (ArrayList<MessageData> dataList : (Collection<ArrayList<MessageData>>) msg.getAllData()) {
+ for (MessageData data : dataList) {
+ data.setReader(reader);
+ }
+ }
+ instance = new MessageInstance(msg, mode, requestDataType);
+ referenceToMsgMap.put(reference, instance);
+ }
+ instance.incrementReferenceCount();
+ if (connected && !instance.isAttached()) {
+ doInstanceAttach(instance);
+ }
+ return instance;
+ }
+
+
+ public void releaseInstance(MessageInstance instance) throws Exception {
+ instance.decrementReferenceCount();
+ if (!instance.hasReferences()) {
+ if (instance.isAttached()) {
+ doInstanceDetach(instance);
+ }
+ MessageReference reference =
+ new MessageReference(instance.getType(), instance.getMode(), instance.getMessage().getClass().getName());
+ referenceToMsgMap.remove(reference);
+ destroyMessage(instance.getMessage());
+ }
+
+ }
+
+ protected abstract Message createMessage(Class<? extends Message> msgClass) throws Exception;
+
+ protected abstract void destroyMessage(Message message) throws Exception;
+
+ public void attachToService(IMsgToolServiceClient client) {
+ connected = true;
+ this.client = client;
+ for (MessageInstance instance : referenceToMsgMap.values()) {
+ try {
+ doInstanceAttach(instance);
+ } catch (Exception e) {
+ OseeLog.log(AbstractMessageDataBase.class, Level.SEVERE,
+ "could not attach instance for " + instance.toString(), e);
+ }
+ }
+ }
+
+ public void detachService() {
+ for (MessageInstance instance : referenceToMsgMap.values()) {
+ doInstanceDetach(instance);
+ }
+ connected = false;
+ this.client = null;
+ }
+
+ public MessageInstance findById(int id) {
+ return idToMsgMap.get(id);
+ }
+
+ private boolean doInstanceAttach(MessageInstance instance) throws Exception {
+ worker.execute(new Runnable() {
+ @Override
+ public void run() {
+ Integer id;
+ try {
+ id = instance.attachToService(client);
+ if (id != null) {
+ idToMsgMap.put(id, instance);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ });
+ return true;
+ }
+
+ private void doInstanceDetach(MessageInstance instance) {
+ try {
+ Integer id = instance.getId();
+ if (id != null) {
+ idToMsgMap.remove(id);
+ }
+ instance.detachService(client);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/db/MessageInstance.java b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/db/MessageInstance.java
new file mode 100644
index 000000000..4800f403a
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/db/MessageInstance.java
@@ -0,0 +1,140 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.client.msg.core.db;
+
+import java.net.InetSocketAddress;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.osee.ote.client.msg.core.internal.MessageServiceSupport;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.commands.SubscribeToMessage;
+import org.eclipse.osee.ote.message.commands.UnSubscribeToMessage;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.interfaces.IMsgToolServiceClient;
+import org.eclipse.osee.ote.message.tool.MessageMode;
+import org.eclipse.osee.ote.message.tool.SubscriptionDetails;
+import org.eclipse.osee.ote.message.tool.SubscriptionKey;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class MessageInstance {
+
+ private final DataType type;
+ private final MessageMode mode;
+ private final Message msg;
+ private SubscriptionKey serverSubscriptionKey = null;
+ private int refcount = 0;
+ private boolean supported = true;
+ private volatile boolean connected = false;
+ private HashSet<DataType> availableTypes = new HashSet<>();
+
+ public MessageInstance(Message msg, MessageMode mode, DataType type) {
+ this.msg = msg;
+ this.mode = mode;
+ this.type = type;
+ }
+
+ public Message getMessage() {
+ return msg;
+ }
+
+ public SubscriptionKey getServerSubscriptionKey() {
+ return serverSubscriptionKey;
+ }
+
+ public void setServerSubscriptionKey(SubscriptionKey serverSubscriptionKey) {
+ this.serverSubscriptionKey = serverSubscriptionKey;
+ }
+
+ public boolean isAttached() {
+ return serverSubscriptionKey != null;
+ }
+
+ public Integer attachToService(IMsgToolServiceClient client) throws Exception {
+ InetSocketAddress address = client.getAddressByType(msg.getClass().getName(), type);
+ SubscriptionDetails details;
+ if(address == null){
+ details = null;
+ } else {
+ details = MessageServiceSupport.subscribeToMessage(new SubscribeToMessage(msg.getClass().getName(), type, mode,
+ client.getAddressByType(msg.getClass().getName(), type), client.getTestSessionKey()));
+
+ }
+ if (details == null) {
+ supported = false;
+ return null;
+ }
+ supported = true;
+ msg.setData(details.getCurrentData());
+ connected = true;
+ //determine types for message
+ Set<? extends DataType> envSet = MessageServiceSupport.getAvailablePhysicalTypes();
+ Set<DataType> available = msg.getAssociatedMessages().keySet();
+ for(DataType type : available.toArray(new DataType[available.size()])){
+ if(envSet.contains(type)){
+ availableTypes.add(type);
+ }
+ }
+
+ serverSubscriptionKey = details.getKey();
+ return serverSubscriptionKey.getId();
+ }
+
+ public void detachService(IMsgToolServiceClient client) throws Exception {
+ if (supported) {
+ MessageServiceSupport.unsubscribeToMessage(new UnSubscribeToMessage(msg.getClass().getName(), mode, type,
+ client.getAddressByType(msg.getClass().getName(), type)));
+ }
+ availableTypes.clear();
+ connected = false;
+ serverSubscriptionKey = null;
+ }
+
+ public Integer getId() {
+ return serverSubscriptionKey != null ? serverSubscriptionKey.getId() : null;
+ }
+
+ public void incrementReferenceCount() {
+ refcount++;
+ }
+
+ public void decrementReferenceCount() {
+ refcount--;
+ }
+
+ public boolean hasReferences() {
+ return refcount > 0;
+ }
+
+ public DataType getType() {
+ return type;
+ }
+
+ public MessageMode getMode() {
+ return mode;
+ }
+
+ public Set<DataType> getAvailableTypes() {
+ return availableTypes;
+ }
+
+ public boolean isSupported() {
+ return supported;
+ }
+
+ @Override
+ public String toString() {
+ return String.format("Message Instance(type=%s, mode=%s, ref=%d, supported=%b)", type.name(), mode.name(),
+ refcount, supported);
+ }
+}
diff --git a/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/Activator.java b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/Activator.java
new file mode 100644
index 000000000..80c312030
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/Activator.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.client.msg.core.internal;
+
+import org.eclipse.core.runtime.Plugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends Plugin {
+
+ // The plug-in ID
+ public static final String PLUGIN_ID = "org.eclipse.ote.client.msg";
+
+ // The shared instance
+ private static Activator plugin;
+
+ private BundleContext context;
+
+// private OteClientServiceTracker tracker;
+
+ /**
+ * The constructor
+ */
+ public Activator() {
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ this.context = context;
+ plugin = this;
+
+// ExtensionDefinedObjects<IMessageDbFactory> definedObjects =
+// new ExtensionDefinedObjects<IMessageDbFactory>("org.eclipse.osee.ote.client.msg.dBFactory", "DatabaseFactory",
+// "className");
+// try {
+// List<IMessageDbFactory> providers = definedObjects.getObjects();
+// if (!providers.isEmpty()) {
+// tracker = new OteClientServiceTracker(providers.get(0));
+// tracker.open(true);
+// } else {
+// OseeLog.log(Activator.class, Level.WARNING,
+// "No message database factory (IMessageDbFactory) found. Message Subscription Service not started");
+// }
+// } catch (Exception ex) {
+// OseeLog.log(Activator.class, Level.SEVERE, "failed to process message database factory extensions", ex);
+// }
+
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+// tracker.close();
+ super.stop(context);
+ this.context = null;
+ }
+
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static Activator getDefault() {
+ return plugin;
+ }
+
+ BundleContext getBundleContext() {
+ return context;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/ChannelProcessor.java b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/ChannelProcessor.java
new file mode 100644
index 000000000..a09f096ff
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/ChannelProcessor.java
@@ -0,0 +1,136 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.client.msg.core.internal;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.channels.ReadableByteChannel;
+import java.util.Arrays;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.ExecutorService;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.client.msg.core.db.AbstractMessageDataBase;
+import org.eclipse.osee.ote.client.msg.core.db.MessageInstance;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.enums.DataType;
+
+/**
+ * Handles processing of updates from a channel. The channel processor maintains an internal queue whose max size
+ * dictates the maximum number of concurrent updates. All updates are submitted to the given thread pool for execution.
+ *
+ * @author Ken J. Aguilar
+ */
+final public class ChannelProcessor {
+ private final ArrayBlockingQueue<Task> queue;
+ private final ExecutorService threadPool;
+ private final AbstractMessageDataBase msgDb;
+ private final DataType memType;
+
+ /**
+ * A task allows each channel to have multiple updates processed concurrently. Each task has its own buffers.
+ *
+ * @author Ken J. Aguilar
+ */
+ private final class Task implements Runnable {
+ private final ByteBuffer buffer;
+
+ public Task(ByteBuffer buffer) {
+ this.buffer = buffer;
+ }
+
+ public void prepTask(ReadableByteChannel channel) throws IOException {
+ buffer.clear();
+ // read the data from the channel into the buffer
+ channel.read(buffer);
+ buffer.flip();
+ }
+
+ @Override
+ public void run() {
+ try {
+ final int id = buffer.getInt();
+ final long time = buffer.getLong();
+ final MessageInstance instance = msgDb.findById(id);
+ if (instance != null) {
+ onUpdate(instance, buffer, time);
+ }
+ // return to the queue
+ queue.put(this);
+ } catch (InterruptedException e) {
+ // do nothing
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, "failed to process message update", ex);
+ }
+ }
+ }
+
+ public ChannelProcessor(int depth, int bufferSize, ExecutorService threadPool, AbstractMessageDataBase msgDb, DataType memType) {
+ this.queue = new ArrayBlockingQueue<>(depth);
+ try {
+ // fill the queue with pre-allocated tasks
+ for (int i = 0; i < depth; i++) {
+ queue.put(new Task(ByteBuffer.allocateDirect(bufferSize)));
+ }
+ } catch (InterruptedException ex) {
+ throw new Error("should never happen", ex);
+ }
+ this.threadPool = threadPool;
+ this.msgDb = msgDb;
+ this.memType = memType;
+ }
+
+ public final void process(final ReadableByteChannel channel) throws InterruptedException, IOException {
+ // get a free task
+ final Task task = queue.take();
+
+ // prep the task
+ task.prepTask(channel);
+
+ // the task is now ready for execution, submit it to the thread pool
+ threadPool.submit(task);
+ }
+
+ /**
+ * called when there is data to be processed from a channel. Can be called by one or more threads for the same data
+ * concurrently to so implementors need to be thread safe
+ */
+ protected void onUpdate(MessageInstance instance, ByteBuffer buffer, long time) {
+ MessageData msgData = instance.getMessage().getActiveDataSource(memType);
+ if (msgData != null) {
+ msgData.setTime(time);
+ byte[] data = msgData.getMem().getData();
+ int remaining = buffer.remaining();
+ if (data.length < remaining) {
+ OseeLog.logf(Activator.class, Level.WARNING,
+ "Message [%s] changed it's backing data size from [%d] to [%d].", instance.getMessage().getName(),
+ data.length, remaining);
+ data = new byte[remaining];
+ buffer.get(data, 0, remaining);
+ msgData.setNewBackingBuffer(data);
+ msgData.incrementActivityCount();
+ msgData.notifyListeners();
+ return;
+ }
+
+ if (remaining < data.length) {
+ Arrays.fill(data, remaining, data.length, (byte) 0);
+ // msg.getActiveDataSource().setCurrentLength(remaining);
+ }
+ buffer.get(data, 0, remaining);
+ msgData.setCurrentLength(remaining);
+ msgData.incrementActivityCount();
+ msgData.notifyListeners();
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/MessageDatabase.java b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/MessageDatabase.java
new file mode 100644
index 000000000..0bc23d357
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/MessageDatabase.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.client.msg.core.internal;
+
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import org.eclipse.osee.ote.client.msg.core.db.AbstractMessageDataBase;
+import org.eclipse.osee.ote.client.msg.core.db.MessageInstance;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.interfaces.IMsgToolServiceClient;
+import org.eclipse.osee.ote.message.tool.MessageMode;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class MessageDatabase extends AbstractMessageDataBase {
+
+ public MessageDatabase(IMsgToolServiceClient service) {
+ super(service);
+ }
+
+ @Override
+ protected Message createMessage(Class<? extends Message> msgClass) throws Exception {
+ Message msg = msgClass.newInstance();
+ LinkedList<MessageData> source = new LinkedList<>();
+ Map<DataType, Class<? extends Message>[]> messages = msg.getAssociatedMessages();
+ Set<Entry<DataType, Class<? extends Message>[]>> entrySet = messages.entrySet();
+ for (Entry<DataType, Class<? extends Message>[]> entry : entrySet) {
+ for (Class<? extends Message> clazz : entry.getValue()) {
+ MessageInstance instance = acquireInstance(clazz.getName());
+ Message newMsg = instance.getMessage();
+ source.add(newMsg.getActiveDataSource());
+ msg.addMessageTypeAssociation(entry.getKey(), newMsg);
+ }
+ }
+ if (!source.isEmpty()) {
+ msg.addMessageDataSource(source);
+ }
+ return msg;
+ }
+
+ @Override
+ protected void destroyMessage(Message message) throws Exception {
+ try {
+ Map<DataType, Class<? extends Message>[]> messages = message.getAssociatedMessages();
+ Set<Entry<DataType, Class<? extends Message>[]>> entrySet = messages.entrySet();
+ for (Entry<DataType, Class<? extends Message>[]> entry : entrySet) {
+ for (Class<? extends Message> clazz : entry.getValue()) {
+ MessageInstance instance = findInstance(clazz.getName(), MessageMode.READER, entry.getKey());
+ if (instance != null) {
+ releaseInstance(instance);
+ }
+ }
+ }
+ } finally {
+ message.destroy();
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/MessageReference.java b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/MessageReference.java
new file mode 100644
index 000000000..5f78dfcdf
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/MessageReference.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.client.msg.core.internal;
+
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.tool.MessageMode;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class MessageReference {
+
+ private final DataType type;
+ private final MessageMode mode;
+ private final String msgClassName;
+
+ public MessageReference(DataType type, MessageMode mode, String msgClassName) {
+ this.type = type;
+ this.mode = mode;
+ this.msgClassName = msgClassName;
+ }
+
+ public MessageReference(Message msg) {
+ this.type = msg.getDefaultMessageData().getType();
+ this.mode = MessageMode.READER;
+ this.msgClassName = msg.getMessageName();
+ }
+
+ public String getMsgClass() {
+ return msgClassName;
+ }
+
+ public DataType getType() {
+ return type;
+ }
+
+ public MessageMode getMode() {
+ return mode;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == null) {
+ return false;
+ }
+ MessageReference otherRef = (MessageReference) obj;
+ return msgClassName.equals(otherRef.msgClassName) && type == otherRef.type && mode == otherRef.mode;
+ }
+
+ @Override
+ public int hashCode() {
+ return msgClassName.hashCode() ^ mode.hashCode() ^ type.hashCode();
+ }
+
+}
diff --git a/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/MessageServiceSupport.java b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/MessageServiceSupport.java
new file mode 100644
index 000000000..325afa785
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/MessageServiceSupport.java
@@ -0,0 +1,191 @@
+package org.eclipse.osee.ote.client.msg.core.internal;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.net.UnknownHostException;
+import java.util.Set;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+
+import org.eclipse.osee.ote.OTEException;
+import org.eclipse.osee.ote.core.ServiceUtility;
+import org.eclipse.osee.ote.message.commands.RecordCommand;
+import org.eclipse.osee.ote.message.commands.SetElementValue;
+import org.eclipse.osee.ote.message.commands.SubscribeToMessage;
+import org.eclipse.osee.ote.message.commands.UnSubscribeToMessage;
+import org.eclipse.osee.ote.message.commands.ZeroizeElement;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.message.event.send.OteSendEventMessage;
+import org.eclipse.osee.ote.message.tool.SubscriptionDetails;
+import org.eclipse.osee.ote.remote.messages.AVAILABLE_PHYSICAL_TYPES_REQ;
+import org.eclipse.osee.ote.remote.messages.GET_INET_ADDRESS_REQ;
+import org.eclipse.osee.ote.remote.messages.GET_INET_ADDRESS_RESP;
+import org.eclipse.osee.ote.remote.messages.SOCKET_ID;
+import org.eclipse.osee.ote.remote.messages.STOP_RECORDING_CMD;
+import org.eclipse.osee.ote.remote.messages.SerializedAvailablePhysicalTypesMessage;
+import org.eclipse.osee.ote.remote.messages.SerializedRecordCommandMessage;
+import org.eclipse.osee.ote.remote.messages.SerializedSetElementMessage;
+import org.eclipse.osee.ote.remote.messages.SerializedSubscribeToMessage;
+import org.eclipse.osee.ote.remote.messages.SerializedSubscriptionDetailsMessage;
+import org.eclipse.osee.ote.remote.messages.SerializedUnSubscribeMessage;
+import org.eclipse.osee.ote.remote.messages.SerializedZeroizeElementMessage;
+import org.osgi.service.event.EventAdmin;
+
+public class MessageServiceSupport {
+
+ private static EventAdmin admin;
+ private static OteSendEventMessage send;
+ private static Executor worker = Executors.newSingleThreadExecutor();
+
+ private static EventAdmin getEventAdmin(){
+ if(admin == null){
+ admin = ServiceUtility.getService(EventAdmin.class);
+ }
+ return admin;
+ }
+
+ private static OteSendEventMessage get(){
+ if(send == null){
+ send = new OteSendEventMessage(getEventAdmin());
+ }
+ return send;
+ }
+
+ /**
+ * @deprecated use {@link #subscribeToMessage(SubscribeToMessage, SubscriptionHandler)}
+ * @param subscribeToMessage
+ * @return
+ */
+ @Deprecated
+ public static SubscriptionDetails subscribeToMessage(SubscribeToMessage subscribeToMessage) {
+ SerializedSubscriptionDetailsMessage resp = new SerializedSubscriptionDetailsMessage();
+ try{
+ SerializedSubscribeToMessage cmd = new SerializedSubscribeToMessage(subscribeToMessage);
+ resp = get().synchSendAndResponse(resp, cmd, 10000);
+ if(resp == null){
+ throw new OTEException("Timed out waiting for message response");
+ }
+ SubscriptionDetails details = resp.getObject();
+ return details;
+ } catch (IOException ex){
+ throw new OTEException("Serialization Error", ex);
+ } catch (ClassNotFoundException e) {
+ throw new OTEException("Serialization Error", e);
+ }
+ }
+
+ /**
+ * Subscribes to a message and notifies the user in a callback so that we do not block any UI threads.
+ *
+ * @param subscribeToMessage
+ * @param handler
+ */
+ public static void subscribeToMessage(SubscribeToMessage subscribeToMessage, SubscriptionHandler handler) {
+ worker.execute(new Runnable(){
+ @Override
+ public void run() {
+ SerializedSubscriptionDetailsMessage resp = new SerializedSubscriptionDetailsMessage();
+ try{
+ SerializedSubscribeToMessage cmd = new SerializedSubscribeToMessage(subscribeToMessage);
+ resp = get().synchSendAndResponse(resp, cmd, 10000);
+ if(resp == null){
+ throw new OTEException("Timed out waiting for message response");
+ }
+ SubscriptionDetails details = resp.getObject();
+ handler.onSubscriptionComplete(details);
+ } catch (IOException ex){
+ throw new OTEException("Serialization Error", ex);
+ } catch (ClassNotFoundException e) {
+ throw new OTEException("Serialization Error", e);
+ }
+ }
+
+ });
+
+ }
+
+ public static void unsubscribeToMessage(UnSubscribeToMessage unSubscribeToMessage) {
+ SerializedUnSubscribeMessage cmd;
+ try {
+ cmd = new SerializedUnSubscribeMessage(unSubscribeToMessage);
+ OteEventMessageUtil.postEvent(cmd);
+ } catch (IOException e) {
+ throw new OTEException("Serialization Error", e);
+ }
+ }
+
+ public static Set<? extends DataType> getAvailablePhysicalTypes() throws OTEException {
+ AVAILABLE_PHYSICAL_TYPES_REQ req = new AVAILABLE_PHYSICAL_TYPES_REQ();
+ try{
+ SerializedAvailablePhysicalTypesMessage types = new SerializedAvailablePhysicalTypesMessage();
+ types = get().synchSendAndResponse(types, req, 10000);
+ if(types == null){
+ throw new OTEException("Timed out waiting for message response");
+ }
+ return types.getObject();
+ } catch (IOException ex){
+ throw new OTEException("Serialization Error", ex);
+ } catch (ClassNotFoundException e) {
+ throw new OTEException("Serialization Error", e);
+ }
+ }
+
+ public static InetSocketAddress getMsgUpdateSocketAddress() throws OTEException {
+ return getCommonAddress(SOCKET_ID.MSG_UPDATES);
+ }
+
+ public static InetSocketAddress getRecorderSocketAddress() throws OTEException {
+ return getCommonAddress(SOCKET_ID.RECORDER);
+ }
+
+ private static InetSocketAddress getCommonAddress(SOCKET_ID id){
+ GET_INET_ADDRESS_REQ req = new GET_INET_ADDRESS_REQ();
+ req.SOCKET_ID.setValue(id);
+ GET_INET_ADDRESS_RESP resp = get().synchSendAndResponse(GET_INET_ADDRESS_RESP.class, GET_INET_ADDRESS_RESP.TOPIC, req, 10000);//todo retry?
+ InetSocketAddress address;
+ if(resp == null){
+ throw new OTEException("Timed out waiting for message response");
+ } else {
+ try {
+ address = new InetSocketAddress(resp.ADDRESS.getAddress(), resp.ADDRESS.getPort());
+ } catch (UnknownHostException e) {
+ throw new OTEException(e);
+ }
+ }
+ return address;
+ }
+
+ public static void startRecording(RecordCommand cmd) {
+ try {
+ SerializedRecordCommandMessage msg = new SerializedRecordCommandMessage(cmd);
+ OteEventMessageUtil.postEvent(msg);
+ } catch (IOException e) {
+ throw new OTEException("Error starting recording", e);
+ }
+ }
+
+ public static void stopRecording() {
+ STOP_RECORDING_CMD cmd = new STOP_RECORDING_CMD();
+ OteEventMessageUtil.postEvent(cmd);
+ }
+
+ public static void setElementValue(SetElementValue cmd) {
+ try {
+ SerializedSetElementMessage msg = new SerializedSetElementMessage(cmd);
+ OteEventMessageUtil.postEvent(msg);
+ } catch (IOException e) {
+ throw new OTEException(e);
+ }
+ }
+
+ public static void zeroizeElement(ZeroizeElement cmd) {
+ try {
+ SerializedZeroizeElementMessage msg = new SerializedZeroizeElementMessage(cmd);
+ OteEventMessageUtil.postEvent(msg);
+ } catch (IOException e) {
+ throw new OTEException(e);
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/MessageSubscription.java b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/MessageSubscription.java
new file mode 100644
index 000000000..8b5793973
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/MessageSubscription.java
@@ -0,0 +1,257 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.client.msg.core.internal;
+
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArraySet;
+
+import org.eclipse.osee.ote.client.msg.core.IMessageSubscription;
+import org.eclipse.osee.ote.client.msg.core.ISubscriptionListener;
+import org.eclipse.osee.ote.client.msg.core.db.AbstractMessageDataBase;
+import org.eclipse.osee.ote.client.msg.core.internal.state.ISubscriptionState;
+import org.eclipse.osee.ote.client.msg.core.internal.state.UnresolvedState;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.commands.SetElementValue;
+import org.eclipse.osee.ote.message.commands.ZeroizeElement;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.tool.MessageMode;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class MessageSubscription implements IMessageSubscription {
+
+ private ISubscriptionState currentState = null;
+ private final MessageSubscriptionService msgService;
+ private final CopyOnWriteArraySet<ISubscriptionListener> listeners = new CopyOnWriteArraySet<>();
+
+ private String requestedDataType;
+
+
+ /**
+ * creates a subscription with no reference to a message
+ */
+ public MessageSubscription(MessageSubscriptionService msgService) {
+ this.msgService = msgService;
+ }
+
+ public synchronized void bind(String name) {
+ bind(name, (DataType)null, MessageMode.READER);
+ }
+
+ public synchronized void bind(String name, DataType type, MessageMode mode) {
+ currentState = new UnresolvedState(name, this, type, mode);
+ }
+
+ public synchronized void bind(String name, String type, MessageMode mode) {
+ requestedDataType = type;
+ currentState = new UnresolvedState(name, this, null, mode);
+ }
+
+ @Override
+ public synchronized boolean isActive() {
+ return currentState != null ? currentState.isActive() : false;
+ }
+
+ @Override
+ public synchronized boolean isResolved() {
+ return currentState != null ? currentState.isResolved() : false;
+ }
+
+ @Override
+ public synchronized DataType getMemType() {
+ return currentState.getMemType();
+ }
+
+ @Override
+ public synchronized MessageMode getMessageMode() {
+ return currentState.getMode();
+ }
+
+ @Override
+ public synchronized String getMessageClassName() {
+ return currentState.getMsgClassName();
+ }
+
+ @Override
+ public synchronized Message getMessage() {
+ return currentState.getMessage();
+ }
+
+ public synchronized void attachMessageDb(AbstractMessageDataBase msgDb) {
+ currentState = currentState.onMessageDbFound(msgDb);
+ }
+
+ public synchronized void detachMessageDb(AbstractMessageDataBase msgDb) {
+ currentState = currentState.onMessageDbClosing(msgDb);
+ }
+
+ public synchronized void attachService() {
+ currentState = currentState.onActivated();
+ }
+
+ public synchronized void detachService() {
+ currentState = currentState.onDeactivated();
+ }
+
+ private void doCancel() {
+ if (currentState != null) {
+ currentState.onCanceled();
+ currentState = null;
+ }
+ }
+
+ @Override
+ public synchronized Set<DataType> getAvailableTypes() {
+ return currentState.getAvailableTypes();
+ }
+
+ @Override
+ public synchronized void changeMessageMode(MessageMode mode) {
+ if (mode == getMessageMode()) {
+ return;
+ }
+ String name = getMessageClassName();
+ DataType type = getMemType();
+ notifyCanceled();
+ doCancel();
+ bind(name, type, mode);
+ progressState();
+ }
+
+ @Override
+ public synchronized void cancel() {
+ if (currentState == null) {
+ return;
+ }
+ try {
+ notifyCanceled();
+ } finally {
+ doCancel();
+ msgService.removeSubscription(this);
+ }
+ }
+
+ @Override
+ public synchronized void changeMemType(DataType type) {
+ if (type == getMemType()) {
+ return;
+ }
+ String name = getMessageClassName();
+ MessageMode mode = getMessageMode();
+ doCancel();
+ bind(name, type, mode);
+ progressState();
+ }
+
+ private void progressState() {
+ if (msgService.getMsgDatabase() != null) {
+ attachMessageDb(msgService.getMsgDatabase());
+ if(msgService.isConnected()){
+ attachService();
+ }
+ }
+ }
+
+ @Override
+ public void setElementValue(List<Object> path, String value) throws Exception {
+ final SetElementValue cmd = new SetElementValue(getMessageClassName(), getMemType(), path, value, true);
+ MessageServiceSupport.setElementValue(cmd);
+ }
+
+ @Override
+ public void setElementValueNoSend(List<Object> path, String value)
+ throws Exception {
+ final SetElementValue cmd = new SetElementValue(getMessageClassName(), getMemType(), path, value, false);
+ MessageServiceSupport.setElementValue(cmd);
+ }
+
+ @Override
+ public void send() throws Exception {
+ final SetElementValue cmd = new SetElementValue(getMessageClassName(), getMemType(), null, null, true);
+ MessageServiceSupport.setElementValue(cmd);
+ }
+
+ @Override
+ public void zeroize(List<Object> path) throws Exception {
+ final ZeroizeElement cmd = new ZeroizeElement(getMessageClassName(), getMemType(), path);
+ MessageServiceSupport.zeroizeElement(cmd);
+ }
+
+ public void notifyCanceled() {
+ for (ISubscriptionListener listener : listeners) {
+ listener.subscriptionCanceled(MessageSubscription.this);
+ }
+ }
+
+ public void notifyActivated() {
+ for (ISubscriptionListener listener : listeners) {
+ listener.subscriptionActivated(MessageSubscription.this);
+ }
+ }
+
+ public void notifyInvalidated() {
+ for (ISubscriptionListener listener : listeners) {
+ listener.subscriptionInvalidated(MessageSubscription.this);
+ }
+ }
+
+ public void notifyResolved() {
+ for (ISubscriptionListener listener : listeners) {
+ listener.subscriptionResolved(MessageSubscription.this);
+ }
+ }
+
+ public void notifyUnresolved() {
+ for (ISubscriptionListener listener : listeners) {
+ listener.subscriptionUnresolved(MessageSubscription.this);
+ }
+ }
+
+ @Override
+ public synchronized boolean addSubscriptionListener(ISubscriptionListener listener) {
+ boolean result = listeners.add(listener);
+ if (currentState == null) {
+ listener.subscriptionCanceled(this);
+ } else {
+ if (msgService.getMsgDatabase() != null) {
+ // a database is available
+ if (currentState.isResolved()) {
+ listener.subscriptionResolved(this);
+ } else {
+ listener.subscriptionInvalidated(this);
+ }
+ if (currentState.isActive()) {
+ listener.subscriptionActivated(this);
+ }
+ }
+
+ }
+
+ return result;
+ }
+
+ @Override
+ public boolean removeSubscriptionListener(ISubscriptionListener listener) {
+ return listeners.remove(listener);
+ }
+
+ public String getRequestedDataType() {
+ return requestedDataType;
+ }
+
+ public void setRequestedDataType(String requestedDataType) {
+ this.requestedDataType = requestedDataType;
+ }
+
+
+}
diff --git a/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/MessageSubscriptionService.java b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/MessageSubscriptionService.java
new file mode 100644
index 000000000..8b2018ffc
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/MessageSubscriptionService.java
@@ -0,0 +1,371 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.client.msg.core.internal;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.nio.channels.DatagramChannel;
+import java.rmi.RemoteException;
+import java.util.List;
+import java.util.Set;
+import java.util.UUID;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeUnit;
+import java.util.logging.Level;
+
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.framework.jdk.core.util.network.PortUtil;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.ExportClassLoader;
+import org.eclipse.osee.ote.client.msg.IOteMessageService;
+import org.eclipse.osee.ote.client.msg.core.IMessageSubscription;
+import org.eclipse.osee.ote.client.msg.core.db.AbstractMessageDataBase;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.MessageDefinitionProvider;
+import org.eclipse.osee.ote.message.commands.RecordCommand;
+import org.eclipse.osee.ote.message.commands.RecordCommand.MessageRecordDetails;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.interfaces.IMsgToolServiceClient;
+import org.eclipse.osee.ote.message.interfaces.ITestEnvironmentMessageSystem;
+import org.eclipse.osee.ote.message.tool.IFileTransferHandle;
+import org.eclipse.osee.ote.message.tool.MessageMode;
+import org.eclipse.osee.ote.message.tool.TransferConfig;
+import org.eclipse.osee.ote.message.tool.UdpFileTransferHandler;
+import org.eclipse.osee.ote.remote.messages.RECORDING_COMPLETE;
+import org.eclipse.osee.ote.service.ConnectionEvent;
+import org.eclipse.osee.ote.service.IOteClientService;
+import org.eclipse.osee.ote.service.ITestConnectionListener;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventHandler;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class MessageSubscriptionService implements IOteMessageService, ITestConnectionListener, IMsgToolServiceClient, EventHandler {
+
+ /** * Static Fields ** */
+ private static final int MAX_CONCURRENT_WORKER_THREADS = Math.min(Runtime.getRuntime().availableProcessors() + 1, 4);
+
+ private final InetAddress localAddress;
+ private final List<MessageSubscription> subscriptions = new CopyOnWriteArrayList<>();
+ private volatile AbstractMessageDataBase msgDatabase;
+ private UdpFileTransferHandler fileTransferHandler;
+ private volatile boolean connected = false;
+
+ private final ExecutorService threadPool = Executors.newFixedThreadPool(MAX_CONCURRENT_WORKER_THREADS,
+ new ThreadFactory() {
+ private final ThreadGroup group =
+ new ThreadGroup(Thread.currentThread().getThreadGroup(), "Msg Watch Workers");
+ private int count = 1;
+
+ @Override
+ public Thread newThread(Runnable arg0) {
+ Thread thread = new Thread(group, arg0, "Msg Watch Wrkr - " + count++);
+ thread.setDaemon(false);
+ return thread;
+ }
+ });
+
+ /**
+ * Monitors a set of channels for message updates and dispatches the updates to worker threads
+ */
+ private UpdateDispatcher dispatcher = null;
+// private volatile IRemoteMessageService service;
+
+ private volatile IOteClientService clientService;
+
+ public void start(){
+ clientService.addConnectionListener(this);
+ }
+
+ public void stop(){
+ clientService.removeConnectionListener(this);
+ }
+
+ public void bindOteClientService(IOteClientService clientService){
+ this.clientService = clientService;
+ }
+
+ public void unbindOteClientService(IOteClientService clientService){
+ this.clientService = null;
+ }
+
+ public MessageSubscriptionService() throws IOException {
+ localAddress = InetAddress.getLocalHost();
+ msgDatabase = new MessageDatabase(this);
+ OseeLog.log(Activator.class, Level.INFO,
+ "OTE client message service started on: " + localAddress.getHostAddress());
+ }
+
+ @Override
+ public synchronized IMessageSubscription subscribe(String name) {
+ MessageSubscription subscription = new MessageSubscription(this);
+ subscription.bind(name);
+ if (msgDatabase != null) {
+ subscription.attachMessageDb(msgDatabase);
+ if(connected){
+ subscription.attachService();
+ }
+ }
+ subscriptions.add(subscription);
+ return subscription;
+ }
+
+ @Override
+ public IMessageSubscription subscribe(String name, MessageMode mode) {
+ return subscribe(name, (DataType)null, mode);
+ }
+
+ @Override
+ public IMessageSubscription subscribe(String name, DataType dataType,
+ MessageMode mode) {
+ MessageSubscription subscription = new MessageSubscription(this);
+ subscription.bind(name, dataType, mode);
+ if (msgDatabase != null) {
+ subscription.attachMessageDb(msgDatabase);
+ if(connected){
+ subscription.attachService();
+ }
+ }
+ subscriptions.add(subscription);
+ return subscription;
+ }
+
+ @Override
+ public IMessageSubscription subscribe(String name, String dataType,
+ MessageMode mode) {
+ MessageSubscription subscription = new MessageSubscription(this);
+ subscription.bind(name, dataType, mode);
+ if (msgDatabase != null) {
+ subscription.attachMessageDb(msgDatabase);
+ if(connected) {
+ subscription.attachService();
+ }
+ }
+ subscriptions.add(subscription);
+ return subscription;
+ }
+
+ /**
+ * Shuts down the client message service. All worker threads will be terminated and all IO resources will be closed.
+ */
+ public void shutdown() {
+ OseeLog.log(MessageSubscriptionService.class, Level.INFO, "shutting down subscription service");
+ clientService.removeConnectionListener(this);
+ shutdownDispatcher();
+ threadPool.shutdown();
+ try {
+ threadPool.awaitTermination(5, TimeUnit.SECONDS);
+ } catch (InterruptedException ex1) {
+ OseeLog.log(Activator.class, Level.WARNING, ex1.toString(), ex1);
+ }
+ }
+
+ @Override
+ public synchronized void onConnectionLost(IServiceConnector connector) {
+ OseeLog.log(Activator.class, Level.INFO, "connection lost: ote client message service halted");
+ shutdownDispatcher();
+ msgDatabase.detachService();
+ for (MessageSubscription subscription : subscriptions) {
+ subscription.detachService();
+ }
+ connected = false;
+ }
+
+ @Override
+ public synchronized void onPostConnect(ConnectionEvent event) {
+ assert msgDatabase != null;
+ connected = true;
+ OseeLog.log(Activator.class, Level.INFO, "connecting OTE client message service");
+ if (event.getEnvironment() instanceof ITestEnvironmentMessageSystem) {
+ ITestEnvironmentMessageSystem env = (ITestEnvironmentMessageSystem) event.getEnvironment();
+ try{
+ dispatcher = new UpdateDispatcher(MessageServiceSupport.getMsgUpdateSocketAddress());
+ try {
+ createProccessors();
+ } catch (Exception e) {
+ OseeLog.log(MessageSubscriptionService.class, Level.SEVERE, "failed to create update processors", e);
+ return;
+ }
+
+ msgDatabase.attachToService(this);
+ for (MessageSubscription subscription : subscriptions) {
+ subscription.attachService();
+ }
+ dispatcher.start();
+ } catch (IOException ex){
+ OseeLog.log(MessageSubscriptionService.class, Level.SEVERE, "failed to create update processors", ex);
+ }
+ }
+ }
+
+ private void createProccessors() throws IOException {
+ Set<? extends DataType> availableTypes = MessageServiceSupport.getAvailablePhysicalTypes();
+
+ for (DataType type : availableTypes) {
+ final ChannelProcessor handler =
+ new ChannelProcessor(1, type.getToolingBufferSize(), threadPool, msgDatabase, type);
+ dispatcher.addChannel(localAddress, 0, type, handler);
+ }
+ }
+
+ private void shutdownDispatcher() {
+ if (dispatcher != null && dispatcher.isRunning()) {
+ try {
+ dispatcher.close();
+ } catch (Throwable ex) {
+ OseeLog.log(MessageSubscriptionService.class, Level.WARNING, "exception while closing down dispatcher", ex);
+ } finally {
+ dispatcher = null;
+ }
+ }
+ }
+
+ @Override
+ public synchronized void onPreDisconnect(ConnectionEvent event) {
+ msgDatabase.detachService();
+ for (MessageSubscription subscription : subscriptions) {
+ subscription.detachService();
+ }
+ shutdownDispatcher();
+ connected = false;
+ }
+
+ @Override
+ public void changeIsScheduled(String msgName, boolean isScheduled) throws RemoteException {
+
+ }
+
+ @Override
+ public void changeRate(String msgName, double rate) throws RemoteException {
+
+ }
+
+ @Override
+ public InetSocketAddress getAddressByType(String messageName, DataType dataType) throws RemoteException {
+ if(dispatcher == null){
+ return null;
+ }
+ final DatagramChannel channel = dispatcher.getChannel(dataType);
+ if(channel == null){
+ return null;
+ }
+ return new InetSocketAddress(localAddress, channel.socket().getLocalPort());
+ }
+
+ @Override
+ public UUID getTestSessionKey() throws RemoteException {
+ return clientService.getSessionKey();
+ }
+
+ public void addMessageDefinitionProvider(MessageDefinitionProvider provider){
+ for (MessageSubscription subscription : subscriptions) {
+ if(!subscription.isResolved()){
+ subscription.attachMessageDb(msgDatabase);
+ }
+ }
+ }
+
+ public void removeMessageDefinitionProvider(MessageDefinitionProvider provider){
+ for (MessageSubscription subscription : subscriptions) {
+ if(subscription.isResolved()){
+ Class<? extends Message> msg = null;
+ Bundle hostBundle = null;
+ try {
+ msg = ExportClassLoader.getInstance().loadClass(subscription.getMessageClassName()).asSubclass(Message.class);
+ hostBundle = FrameworkUtil.getBundle(msg.getClass());
+ } catch (ClassNotFoundException e) {
+ } finally{
+ if(msg == null || hostBundle == null){
+ subscription.detachMessageDb(msgDatabase);
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public synchronized IFileTransferHandle startRecording(String fileName, List<MessageRecordDetails> list) throws FileNotFoundException, IOException {
+ if(!connected){
+ throw new IllegalStateException("can't record: not connected to test server");
+ }
+ if (fileTransferHandler == null) {
+ fileTransferHandler = new UdpFileTransferHandler();
+ fileTransferHandler.start();
+ }
+ int port = PortUtil.getInstance().getValidPort();
+ // get the address of the socket the message recorder is going to write
+ // data to
+ InetSocketAddress recorderOutputAddress = MessageServiceSupport.getRecorderSocketAddress();
+
+ // setup a transfer from a socket to a file
+ TransferConfig config =
+ new TransferConfig(fileName, recorderOutputAddress, new InetSocketAddress(InetAddress.getLocalHost(), port),
+ TransferConfig.Direction.SOCKET_TO_FILE, 128000);
+ IFileTransferHandle handle = fileTransferHandler.registerTransfer(config);
+
+ // send the command to start recording
+ RecordCommand cmd =
+ new RecordCommand(this.getTestSessionKey(), new InetSocketAddress(InetAddress.getLocalHost(), port), list);
+ MessageServiceSupport.startRecording(cmd);
+ OseeLog.log(
+ Activator.class,
+ Level.INFO,
+ "recording started with " + list.size() + " entries, recorder output socket=" + recorderOutputAddress.toString());
+ return handle;
+ }
+
+ @Override
+ public synchronized void stopRecording() throws RemoteException, IOException {
+ MessageServiceSupport.stopRecording();
+ }
+
+ /* (non-Javadoc)
+ * @see org.osgi.service.event.EventHandler#handleEvent(org.osgi.service.event.Event)
+ */
+ @Override
+ public void handleEvent(Event event) {
+ if(event.getTopic().equals(RECORDING_COMPLETE.TOPIC)) {
+
+ if (fileTransferHandler != null && fileTransferHandler.hasActiveTransfers()) {
+ try {
+ fileTransferHandler.stopAllTransfers();
+ }
+ catch (IOException ex) {
+ System.err.println(ex.getMessage());
+ ex.printStackTrace(System.err);
+ }
+ }
+ fileTransferHandler = null;
+ }
+
+ }
+
+ public AbstractMessageDataBase getMsgDatabase() {
+ return msgDatabase;
+ }
+
+ public void removeSubscription(MessageSubscription subscription) {
+ subscriptions.remove(subscription);
+ }
+
+ public boolean isConnected() {
+ return connected;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/OteClientServiceTracker.java b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/OteClientServiceTracker.java
new file mode 100644
index 000000000..b7843101c
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/OteClientServiceTracker.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.client.msg.core.internal;
+
+import org.eclipse.osee.ote.client.msg.core.IMessageDbFactory;
+import org.eclipse.osee.ote.service.IOteClientService;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.util.tracker.ServiceTracker;
+
+public class OteClientServiceTracker extends ServiceTracker {
+
+ private final IMessageDbFactory factory;
+
+ private MessageSubscriptionService messageSubscriptionService;
+
+ private ServiceRegistration registration;
+
+ OteClientServiceTracker(IMessageDbFactory factory) {
+ super(Activator.getDefault().getBundleContext(), IOteClientService.class.getName(), null);
+ this.factory = factory;
+ }
+
+ @Override
+ public Object addingService(ServiceReference reference) {
+ IOteClientService service = (IOteClientService) super.addingService(reference);
+// try {
+// messageSubscriptionService = new MessageSubscriptionService(service, factory);
+// registration = context.registerService(IOteMessageService.class.getName(), messageSubscriptionService, null);
+// } catch (IOException e) {
+// OseeLog.log(OteClientServiceTracker.class, Level.SEVERE, "could not start Message Service", e);
+// }
+ return service;
+ }
+
+ @Override
+ public void removedService(ServiceReference reference, Object service) {
+ shutdownMessageService();
+ super.removedService(reference, service);
+ }
+
+ private void shutdownMessageService() {
+ if (registration != null) {
+ registration.unregister();
+ registration = null;
+ }
+ if (messageSubscriptionService != null) {
+ messageSubscriptionService.shutdown();
+ messageSubscriptionService = null;
+ }
+ }
+
+ @Override
+ public void close() {
+ shutdownMessageService();
+ super.close();
+ }
+
+}
diff --git a/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/SubscriptionHandler.java b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/SubscriptionHandler.java
new file mode 100644
index 000000000..a9ddc6440
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/SubscriptionHandler.java
@@ -0,0 +1,9 @@
+package org.eclipse.osee.ote.client.msg.core.internal;
+
+import org.eclipse.osee.ote.message.tool.SubscriptionDetails;
+
+public interface SubscriptionHandler {
+
+ void onSubscriptionComplete(SubscriptionDetails details);
+
+}
diff --git a/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/UpdateDispatcher.java b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/UpdateDispatcher.java
new file mode 100644
index 000000000..489dda19b
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/UpdateDispatcher.java
@@ -0,0 +1,173 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.client.msg.core.internal;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.nio.channels.DatagramChannel;
+import java.nio.channels.SelectionKey;
+import java.nio.channels.Selector;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.message.enums.DataType;
+
+/**
+ * A thread that listens for activity on a set of channels and then dispatches any recieved UDP packets to the
+ * appropriate worker threads
+ *
+ * @author Ken J. Aguilar
+ */
+public final class UpdateDispatcher {
+ private static final int RECEIVE_BUFFER_SIZE = 1024 * 512;
+
+ /** * Class Instance Fields ** */
+ private final Map<DataType, DatagramChannel> channelMap = new HashMap<>();
+
+ private final InetSocketAddress remoteAddress;
+ private final Object gate = new Object();
+ private final Selector channelSelector;
+ private volatile boolean running = false;
+
+ private final Runnable runner = new Runnable() {
+
+ @Override
+ public void run() {
+
+ running = true;
+ try {
+ while (running) {
+ /* check to see if something has interrupted this thread */
+ if (Thread.interrupted()) {
+ OseeLog.log(Activator.class, Level.FINE, "Channel Listener Thread interrupted");
+ running = false;
+ } else {
+ /*
+ * wait for channel activity on all channels registered with this selector
+ */
+ final int readyCount = channelSelector.select();
+ if (readyCount != 0) {
+ /* get the set of readable channels */
+ final Set<SelectionKey> readyChannels = channelSelector.selectedKeys();
+
+ /* iterate through the set of readable channels */
+ final Iterator<SelectionKey> keys = readyChannels.iterator();
+ while (keys.hasNext()) {
+ final SelectionKey key = keys.next();
+ /* make sure the channel is still valid */
+ if (key.isValid() && key.isReadable()) {
+ ((ChannelProcessor) key.attachment()).process((DatagramChannel) key.channel());
+ }
+ keys.remove();
+ }
+ }
+ synchronized (gate) {
+ /*
+ * do this to prevent the current thread from entering the channelSelector.select() method during
+ * registration of channels with the selector. Not doing this will cause deadlock
+ */
+ }
+ }
+ }
+ } catch (InterruptedException ie) {
+ /*
+ * something has interrupted us, most likely we need to shut down. Catching the exception clears the
+ * interrupted flag
+ */
+ OseeLog.log(Activator.class, Level.INFO, "Channel Listener Interrupted... Shutting down");
+ } catch (IOException ioe) {
+ OseeLog.log(Activator.class, Level.INFO,
+ "IOException occurred in channel listening thread... shutting down ", ioe);
+ } catch (Throwable t) {
+ OseeLog.log(Activator.class, Level.SEVERE,
+ "Unusual exception occurred in channel listening thread... shutting down ", t);
+ }
+ running = false;
+ OseeLog.log(Activator.class, Level.INFO, "Channel Listener thread has terminated");
+ }
+
+ };
+
+ private final Thread thread = new Thread(runner, "Message Update Dispatcher Thread");
+
+ public UpdateDispatcher(InetSocketAddress remoteAddress) throws IOException {
+ this.remoteAddress = remoteAddress;
+ thread.setDaemon(false);
+ channelSelector = Selector.open();
+ }
+
+ public void start() {
+ thread.start();
+ }
+
+ public boolean isRunning() {
+ return running;
+ }
+
+ public DatagramChannel getChannel(DataType type) {
+ return channelMap.get(type);
+ }
+
+ public SelectionKey addChannel(InetAddress localAddress, int port, DataType type, ChannelProcessor processor) throws IOException {
+ final DatagramChannel channel = DatagramChannel.open();
+ channel.configureBlocking(false);
+ channel.socket().bind(new InetSocketAddress(localAddress, port));
+ if (channel.socket().getReceiveBufferSize() < RECEIVE_BUFFER_SIZE) {
+ channel.socket().setReceiveBufferSize(RECEIVE_BUFFER_SIZE);
+ }
+ channel.connect(remoteAddress);
+ if (channelMap.put(type, channel) != null) {
+ OseeLog.log(UpdateDispatcher.class, Level.WARNING, "A previous channel was replaced");
+ }
+ synchronized (gate) {
+ channelSelector.wakeup();
+ return channel.register(channelSelector, SelectionKey.OP_READ, processor);
+ }
+ }
+
+ /**
+ * terminates this thread in a graceful manner and attempts to release resources
+ */
+ public void close() {
+ thread.interrupt();
+ try {
+ thread.join();
+ } catch (InterruptedException ex) {
+ OseeLog.log(Activator.class, Level.WARNING, "Interrupted while joining", ex);
+ } finally {
+ OseeLog.log(Activator.class, Level.INFO, "clearing pool");
+ /* release IO resources */
+ try {
+ channelSelector.close();
+ } catch (Exception ex) {
+ OseeLog.log(Activator.class, Level.WARNING, "Exception closing selector", ex);
+ } finally {
+ for (final DataType type : channelMap.keySet()) {
+ try {
+ final DatagramChannel channel = channelMap.get(type);
+ if (channel != null) {
+ channel.close();
+ }
+
+ } catch (Throwable ex) {
+ OseeLog.log(Activator.class, Level.WARNING, "could not close channel for " + type, ex);
+ }
+ }
+ channelMap.clear();
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/AbstractSubscriptionState.java b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/AbstractSubscriptionState.java
new file mode 100644
index 000000000..45fe82b32
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/AbstractSubscriptionState.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.client.msg.core.internal.state;
+
+import org.eclipse.osee.ote.client.msg.core.internal.MessageSubscription;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.tool.MessageMode;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public abstract class AbstractSubscriptionState implements ISubscriptionState {
+
+ private final DataType type;
+ private final MessageMode mode;
+ private final MessageSubscription subscription;
+
+ protected AbstractSubscriptionState(MessageSubscription subscription, DataType type, MessageMode mode) {
+ this.subscription = subscription;
+ this.type = type;
+ this.mode = mode;
+ }
+
+ protected AbstractSubscriptionState(AbstractSubscriptionState otherState) {
+ this.subscription = otherState.getSubscription();
+ this.type = otherState.getMemType();
+ this.mode = otherState.getMode();
+ }
+
+ @Override
+ public DataType getMemType() {
+ return type;
+ }
+
+ @Override
+ public MessageMode getMode() {
+ return mode;
+ }
+
+ protected MessageSubscription getSubscription() {
+ return subscription;
+ }
+
+ @Override
+ public void onCanceled() {
+ }
+
+}
diff --git a/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/ActivateState.java b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/ActivateState.java
new file mode 100644
index 000000000..a5939b695
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/ActivateState.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.client.msg.core.internal.state;
+
+import java.util.Set;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.client.msg.core.db.AbstractMessageDataBase;
+import org.eclipse.osee.ote.client.msg.core.db.MessageInstance;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.enums.DataType;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class ActivateState extends AbstractSubscriptionState {
+
+ private final MessageInstance instance;
+ private final AbstractMessageDataBase msgDb;
+
+ public ActivateState(MessageInstance instance, AbstractMessageDataBase msgDb, AbstractSubscriptionState otherState) {
+ super(otherState);
+ this.instance = instance;
+ this.msgDb = msgDb;
+ }
+
+ @Override
+ public Message getMessage() {
+ return instance.getMessage();
+ }
+
+ @Override
+ public String getMsgClassName() {
+ return instance.getMessage().getClass().getName();
+ }
+
+ @Override
+ public ISubscriptionState onMessageDbClosing(AbstractMessageDataBase msgDb) {
+ getSubscription().notifyUnresolved();
+ try {
+ msgDb.releaseInstance(instance);
+ } catch (Exception e) {
+ OseeLog.log(ActivateState.class, Level.SEVERE, "problem releasing instance of " + getMsgClassName());
+ }
+ return new UnresolvedState(getMsgClassName(), this);
+ }
+
+ @Override
+ public ISubscriptionState onMessageDbFound(AbstractMessageDataBase msgDB) {
+ throw new Error("Unexpected input for this state");
+ }
+
+ @Override
+ public ISubscriptionState onActivated() {
+ throw new Error("Unexpected input for this state");
+ }
+
+ @Override
+ public ISubscriptionState onDeactivated() {
+ return new InactiveState(instance, msgDb, this);
+ }
+
+ @Override
+ public void onCanceled() {
+ super.onCanceled();
+ try {
+ msgDb.releaseInstance(instance);
+ } catch (Exception e) {
+ OseeLog.log(ActivateState.class, Level.SEVERE, "problem releasing instance of " + getMsgClassName());
+ }
+ }
+
+ @Override
+ public Set<DataType> getAvailableTypes() {
+ return instance.getAvailableTypes();
+ }
+
+ @Override
+ public boolean isActive() {
+ return true;
+ }
+
+ @Override
+ public boolean isResolved() {
+ return true;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/ISubscriptionState.java b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/ISubscriptionState.java
new file mode 100644
index 000000000..19b6a4358
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/ISubscriptionState.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.client.msg.core.internal.state;
+
+import java.util.Set;
+import org.eclipse.osee.ote.client.msg.core.db.AbstractMessageDataBase;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.tool.MessageMode;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface ISubscriptionState {
+ DataType getMemType();
+
+ MessageMode getMode();
+
+ String getMsgClassName();
+
+ Message getMessage();
+
+ Set<DataType> getAvailableTypes();
+
+ ISubscriptionState onMessageDbFound(AbstractMessageDataBase msgDB);
+
+ ISubscriptionState onMessageDbClosing(AbstractMessageDataBase msgDb);
+
+ ISubscriptionState onActivated();
+
+ ISubscriptionState onDeactivated();
+
+ void onCanceled();
+
+ boolean isActive();
+
+ boolean isResolved();
+
+}
diff --git a/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/InactiveState.java b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/InactiveState.java
new file mode 100644
index 000000000..4f87f6dee
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/InactiveState.java
@@ -0,0 +1,104 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.client.msg.core.internal.state;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.client.msg.core.db.AbstractMessageDataBase;
+import org.eclipse.osee.ote.client.msg.core.db.MessageInstance;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.enums.DataType;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class InactiveState extends AbstractSubscriptionState {
+
+ private final MessageInstance instance;
+ private final AbstractMessageDataBase msgDb;
+
+ public InactiveState(MessageInstance instance, AbstractMessageDataBase msgDb, AbstractSubscriptionState previousState) {
+ super(previousState);
+ this.instance = instance;
+ this.msgDb = msgDb;
+ }
+
+ @Override
+ public Message getMessage() {
+ return instance.getMessage();
+ }
+
+ @Override
+ public String getMsgClassName() {
+ return instance.getMessage().getClass().getName();
+ }
+
+ @Override
+ public ISubscriptionState onMessageDbFound(AbstractMessageDataBase msgDB) {
+ throw new Error("Unexpected input for this state");
+ }
+
+ @Override
+ public ISubscriptionState onMessageDbClosing(AbstractMessageDataBase msgDb) {
+ assert this.msgDb == msgDb;
+ getSubscription().notifyUnresolved();
+ try {
+ msgDb.releaseInstance(instance);
+ } catch (Exception e) {
+ OseeLog.log(ActivateState.class, Level.SEVERE, "problem releasing instance of " + getMsgClassName());
+ }
+ return new UnresolvedState(getMsgClassName(), this);
+ }
+
+ @Override
+ public void onCanceled() {
+ super.onCanceled();
+ try {
+ msgDb.releaseInstance(instance);
+ } catch (Exception e) {
+ OseeLog.log(ActivateState.class, Level.SEVERE, "problem releasing instance of " + getMsgClassName());
+ }
+ }
+
+ @Override
+ public ISubscriptionState onActivated() {
+ if (instance.isSupported()) {
+ getSubscription().notifyActivated();
+ return new ActivateState(instance, msgDb, this);
+ } else {
+ return this;
+ }
+
+ }
+
+ @Override
+ public ISubscriptionState onDeactivated() {
+ return this;
+ }
+
+ @Override
+ public Set<DataType> getAvailableTypes() {
+ return new HashSet<DataType>();
+ }
+
+ @Override
+ public boolean isActive() {
+ return false;
+ }
+
+ @Override
+ public boolean isResolved() {
+ return true;
+ }
+}
diff --git a/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/UnresolvedState.java b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/UnresolvedState.java
new file mode 100644
index 000000000..dc99a6b3c
--- /dev/null
+++ b/org.eclipse.osee.ote.client.msg/src/org/eclipse/osee/ote/client/msg/core/internal/state/UnresolvedState.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.client.msg.core.internal.state;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.client.msg.core.db.AbstractMessageDataBase;
+import org.eclipse.osee.ote.client.msg.core.db.MessageInstance;
+import org.eclipse.osee.ote.client.msg.core.internal.MessageSubscription;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.tool.MessageMode;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class UnresolvedState extends AbstractSubscriptionState {
+
+ private DataType type;
+
+ private final String msgClassName;
+ private MessageInstance instance = null;
+
+ public UnresolvedState(String msgClassName, MessageSubscription subscription, DataType type, MessageMode mode) {
+ super(subscription, type, mode);
+ this.type = type;
+ this.msgClassName = msgClassName;
+ }
+
+ public UnresolvedState(String msgClassName, AbstractSubscriptionState previousState) {
+ super(previousState);
+ this.msgClassName = msgClassName;
+ }
+
+ @Override
+ public Message getMessage() {
+ return instance != null ? instance.getMessage() : null;
+ }
+
+ @Override
+ public String getMsgClassName() {
+ return msgClassName;
+ }
+
+ @Override
+ public ISubscriptionState onMessageDbFound(AbstractMessageDataBase msgDB) {
+ try {
+ DataType requestedType = getMemType();
+ if (requestedType == null && getSubscription().getRequestedDataType() != null) {
+ instance = msgDB.acquireInstance(msgClassName, getMode(), getSubscription().getRequestedDataType());
+ } else {
+ instance = msgDB.acquireInstance(msgClassName, getMode(), requestedType);
+ }
+
+ this.type = instance.getType();
+ getSubscription().notifyResolved();
+ return new InactiveState(instance, msgDB, this);
+ } catch (Exception e) {
+ // Yes we do need to log this
+ OseeLog.log(UnresolvedState.class, Level.SEVERE, "problems acquring instance for " + getMsgClassName());
+ getSubscription().notifyInvalidated();
+ return this;
+ }
+
+ }
+
+ @Override
+ public DataType getMemType() {
+ return type;
+ }
+
+ @Override
+ public ISubscriptionState onMessageDbClosing(AbstractMessageDataBase msgDb) {
+ return this;
+ }
+
+ @Override
+ public ISubscriptionState onActivated() {
+ return this;
+ }
+
+ @Override
+ public ISubscriptionState onDeactivated() {
+ return this;
+ }
+
+ @Override
+ public Set<DataType> getAvailableTypes() {
+ return new HashSet<DataType>();
+ }
+
+ @Override
+ public boolean isActive() {
+ return false;
+ }
+
+ @Override
+ public boolean isResolved() {
+ return instance != null;
+ }
+}
diff --git a/org.eclipse.osee.ote.client/.classpath b/org.eclipse.osee.ote.client/.classpath
new file mode 100644
index 000000000..1fa3e6803
--- /dev/null
+++ b/org.eclipse.osee.ote.client/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.ote.client/.pmd b/org.eclipse.osee.ote.client/.pmd
new file mode 100644
index 000000000..c7b0a9fb3
--- /dev/null
+++ b/org.eclipse.osee.ote.client/.pmd
@@ -0,0 +1,925 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<pmd>
+ <useProjectRuleSet>false</useProjectRuleSet>
+ <ruleSetFile>.ruleset</ruleSetFile>
+ <rules>
+ <rule>
+ <name>LooseCoupling</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneMethodMustImplementCloneable</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedImports</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SignatureDeclareThrowsException</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IfStmtsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>WhileLoopsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IfElseStmtsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ForLoopsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseSingleton</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanReturns</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanExpressions</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SwitchStmtsShouldHaveDefault</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDeeplyNestedIfStmts</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidReassigningParameters</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SwitchDensity</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConstructorCallsOverridableMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AccessorClassGeneration</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalFieldCouldBeStatic</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloseResource</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonStaticInitializer</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DefaultLabelNotLastInSwitchStmt</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonCaseLabelInSwitchStatement</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>OptimizableToArrayCall</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BadComparison</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EqualsNull</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConfusingTernary</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InstantiationToGetClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IdempotentOperations</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimpleDateFormatNeedsLocale</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ImmutableField</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseLocaleWithCaseConversions</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidProtectedFieldInFinalClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AssignmentToNonFinalStatic</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingStaticMethodInNonInstantiatableClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidSynchronizedAtMethodLevel</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingBreakInSwitch</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseNotifyAllInsteadOfNotify</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidInstanceofChecksInCatchClause</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractClassWithoutAbstractMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyConditional</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CompareObjectsWithEquals</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PositionLiteralsFirstInComparisons</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryLocalBeforeReturn</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonThreadSafeSingleton</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UncommentedEmptyMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UncommentedEmptyConstructor</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidConstantsInterface</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnsynchronizedStaticDateFormatter</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PreserveStackTrace</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseCollectionIsEmpty</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassWithOnlyPrivateConstructorsShouldBeFinal</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyMethodInAbstractClassShouldBeAbstract</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SingularField</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReturnEmptyArrayRatherThanNull</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractClassWithoutAnyMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooFewBranchesForASwitchStatement</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCatchingThrowable</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SignatureDeclareThrowsException</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExceptionAsFlowControl</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCatchingNPE</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingRawExceptionTypes</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingNullPointerException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidRethrowingException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotExtendJavaLangError</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotThrowExceptionInFinally</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingNewInstanceOfSameException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedPrivateField</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedLocalVariable</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedPrivateMethod</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedFormalParameter</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MoreThanOneLogger</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LoggerIsNotStaticFinal</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SystemPrintln</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidPrintStackTrace</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDuplicateLiterals</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringInstantiation</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringToString</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InefficientStringBuffering</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryCaseChange</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseStringBufferLength</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AppendCharacterWithChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConsecutiveLiteralAppends</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseIndexOfChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InefficientEmptyStringCheck</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InsufficientStringBufferDeclaration</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessStringValueOf</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringBufferInstantiationWithChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseEqualsToCompareStrings</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidStringBufferField</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceVectorWithList</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceHashtableWithMap</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceEnumerationWithIterator</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidEnumAsIdentifier</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidAssertAsIdentifier</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IntegerInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ByteInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ShortInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LongInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseBeforeAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseAfterAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseTestAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4SuitesShouldUseSuiteAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitUseExpected</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseProperClassLoader</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MDBAndSessionBeanNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>RemoteSessionInterfaceNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LocalInterfaceSessionNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LocalHomeNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>RemoteInterfaceNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotCallSystemExit</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StaticEJBFieldShouldBeFinal</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotUseThreads</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidInstantiatingObjectsInLoops</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseArrayListInsteadOfVector</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyStartsWith</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseStringBufferForStringAppends</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseArraysAsList</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidArrayLoops</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryWrapperObjectCreation</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AddEmptyString</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyCatchBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyIfStmt</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyWhileStmt</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyTryBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyFinallyBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptySwitchStatements</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JumbledIncrementer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ForLoopShouldBeWhileLoop</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryConversionTemporary</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>OverrideBothEqualsAndHashcode</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoubleCheckedLocking</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReturnFromFinallyBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptySynchronizedBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryReturn</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyStaticInitializer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnconditionalIfStatement</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyStatementNotInLoop</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanInstantiation</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryFinalModifier</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CollapsibleIfStatements</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessOverridingMethod</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassCastExceptionWithToArray</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDecimalLiteralsInBigDecimalConstructor</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessOperationOnImmutable</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MisplacedNullCheck</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedNullCheckInEquals</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThreadGroup</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BrokenNullCheck</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BigIntegerInstantiation</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingOctalValues</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingHardCodedIP</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CheckResultSet</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidMultipleUnaryOperators</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyInitializer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodReturnsInternalArray</name>
+ <ruleset>Security Code Guidelines</ruleset>
+ </rule>
+ <rule>
+ <name>ArrayIsStoredDirectly</name>
+ <ruleset>Security Code Guidelines</ruleset>
+ </rule>
+ <rule>
+ <name>CouplingBetweenObjects</name>
+ <ruleset>Coupling Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveImports</name>
+ <ruleset>Coupling Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LooseCoupling</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DuplicateImports</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DontImportJavaLang</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedImports</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ImportFromSamePackage</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyStaticImports</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitStaticSuite</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitSpelling</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitAssertionsShouldIncludeMessage</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitTestsShouldIncludeAssert</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TestClassWithoutTestCases</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryBooleanAssertion</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertEqualsInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertSameInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertNullInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanAssertion</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NullAssignment</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedModifier</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AssignmentInOperand</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AtLeastOneConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DontImportSun</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousOctalEscape</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CallSuperInConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryParentheses</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DefaultPackage</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanInversion</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DataflowAnomalyAnalysis</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFinalLocalVariable</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingShortType</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingVolatile</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingNativeCode</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidAccessibilityAlteration</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotCallGarbageCollectionExplicitly</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodNamingConventions</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassNamingConventions</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractNaming</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDollarSigns</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodWithSameNameAsEnclosingClass</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousHashcodeMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousConstantFieldName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousEqualsMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFieldNameMatchingTypeName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFieldNameMatchingMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NoPackage</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PackageCase</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MisleadingVariableName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanGetMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NPathComplexity</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveMethodLength</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveParameterList</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveClassLength</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CyclomaticComplexity</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessivePublicCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyFields</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssMethodCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssTypeCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssConstructorCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyMethods</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyFinalizer</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeOnlyCallsSuperFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeOverloaded</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeDoesNotCallSuperFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeShouldBeProtected</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCallingFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseCorrectExceptionLogging</name>
+ <ruleset>Jakarta Commons Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ProperLogger</name>
+ <ruleset>Jakarta Commons Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingSerialVersionUID</name>
+ <ruleset>JavaBean Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ProperCloneImplementation</name>
+ <ruleset>Clone Implementation Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneThrowsCloneNotSupportedException</name>
+ <ruleset>Clone Implementation Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneMethodMustImplementCloneable</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ </rules>
+ <includeDerivedFiles>false</includeDerivedFiles>
+ <violationsAsErrors>true</violationsAsErrors>
+</pmd>
diff --git a/org.eclipse.osee.ote.client/.project b/org.eclipse.osee.ote.client/.project
new file mode 100644
index 000000000..582419a17
--- /dev/null
+++ b/org.eclipse.osee.ote.client/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ote.client</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.client/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.client/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..0668fa5d0
--- /dev/null
+++ b/org.eclipse.osee.ote.client/META-INF/MANIFEST.MF
@@ -0,0 +1,71 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OTE Service (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.client;singleton:=true
+Bundle-Version: 0.25.3.qualifier
+Bundle-Activator: org.eclipse.osee.ote.service.Activator
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Bundle-ActivationPolicy: lazy
+Import-Package: net.jini.activation,
+ net.jini.admin,
+ net.jini.config,
+ net.jini.constraint,
+ net.jini.core.constraint,
+ net.jini.core.discovery,
+ net.jini.core.entry,
+ net.jini.core.event,
+ net.jini.core.lease,
+ net.jini.core.lookup,
+ net.jini.core.transaction,
+ net.jini.core.transaction.server,
+ net.jini.discovery,
+ net.jini.entry,
+ net.jini.event,
+ net.jini.export,
+ net.jini.id,
+ net.jini.iiop,
+ net.jini.io,
+ net.jini.io.context,
+ net.jini.jeri,
+ net.jini.jeri.connection,
+ net.jini.jeri.http,
+ net.jini.jeri.kerberos,
+ net.jini.jeri.ssl,
+ net.jini.jeri.tcp,
+ net.jini.jrmp,
+ net.jini.lease,
+ net.jini.loader,
+ net.jini.loader.pref,
+ net.jini.lookup,
+ net.jini.lookup.entry,
+ net.jini.security,
+ net.jini.security.policy,
+ net.jini.security.proxytrust,
+ net.jini.space,
+ net.jini.url.file,
+ net.jini.url.httpmd,
+ net.jini.url.https,
+ org.eclipse.core.runtime,
+ org.eclipse.osee.connection.service,
+ org.eclipse.osee.framework.core.exception,
+ org.eclipse.osee.framework.jdk.core.type,
+ org.eclipse.osee.framework.jdk.core.util,
+ org.eclipse.osee.framework.plugin.core.util,
+ org.eclipse.osee.ote,
+ org.eclipse.osee.ote.connection.jini,
+ org.eclipse.osee.ote.core,
+ org.eclipse.osee.ote.core.enums,
+ org.eclipse.osee.ote.core.environment,
+ org.eclipse.osee.ote.core.environment.interfaces,
+ org.eclipse.osee.ote.core.environment.status,
+ org.eclipse.osee.ote.core.framework,
+ org.eclipse.osee.ote.core.framework.prompt,
+ org.eclipse.osee.ote.endpoint,
+ org.eclipse.osee.ote.message,
+ org.osgi.framework,
+ org.osgi.service.packageadmin,
+ org.osgi.util.tracker
+Export-Package: org.eclipse.osee.ote.service,
+ org.eclipse.osee.ote.service.core
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Require-Bundle: org.eclipse.osee.framework.logging
diff --git a/org.eclipse.osee.ote.client/build.properties b/org.eclipse.osee.ote.client/build.properties
new file mode 100644
index 000000000..34d2e4d2d
--- /dev/null
+++ b/org.eclipse.osee.ote.client/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .
diff --git a/org.eclipse.osee.ote.client/pom.xml b/org.eclipse.osee.ote.client/pom.xml
new file mode 100644
index 000000000..b2a0606fe
--- /dev/null
+++ b/org.eclipse.osee.ote.client/pom.xml
@@ -0,0 +1,35 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.osee</groupId>
+ <artifactId>org.eclipse.osee.ote.parent</artifactId>
+ <version>0.25.3-SNAPSHOT</version>
+ <relativePath>../org.eclipse.osee.ote.parent</relativePath>
+ </parent>
+
+ <artifactId>org.eclipse.osee.ote.client</artifactId>
+ <packaging>eclipse-plugin</packaging>
+ <name>OTE Client (Incubation)</name>
+
+ <build>
+ <!-- workaround for https://issues.sonatype.org/browse/TYCHO-168 -->
+ <resources>
+ <resource>
+ <directory>src</directory>
+ <excludes>
+ <exclude>**/*.java</exclude>
+ </excludes>
+ </resource>
+ </resources>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-source-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/Activator.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/Activator.java
new file mode 100644
index 000000000..9da6206e3
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/Activator.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.service;
+
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.service.core.ConnectionServiceTracker;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+public class Activator implements BundleActivator {
+
+ private ConnectionServiceTracker connectionServiceTracker;
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ connectionServiceTracker = new ConnectionServiceTracker(context);
+ connectionServiceTracker.open(true);
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+
+ // close the service tracker
+ connectionServiceTracker.close();
+ connectionServiceTracker = null;
+
+ }
+
+ public static void log(Level level, String message, Throwable t) {
+ OseeLog.log(Activator.class, level, message, t);
+ }
+
+ public static void log(Level level, String message) {
+ log(level, message, null);
+ }
+}
diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/ConnectionEvent.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/ConnectionEvent.java
new file mode 100644
index 000000000..f9f2f179e
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/ConnectionEvent.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.service;
+
+import java.util.UUID;
+
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironment;
+
+/**
+ * This event contains information regarding a change in connectivity between a client and a test host
+ *
+ * @author Ken J. Aguilar
+ */
+public final class ConnectionEvent {
+
+ private final ITestEnvironment environment;
+ private final IServiceConnector connector;
+ private final UUID sessionKey;
+ private final OteServiceProperties props;
+ private final IHostTestEnvironment hostTestEnvironment;
+
+ public ConnectionEvent(IHostTestEnvironment hostTestEnvironment, IServiceConnector connector, ITestEnvironment environment, UUID sessionKey) {
+ if (connector == null) {
+ throw new NullPointerException("connector cannot be null");
+ }
+ this.environment = environment;
+ this.connector = connector;
+ this.sessionKey = sessionKey;
+ this.hostTestEnvironment = hostTestEnvironment;
+ props = new OteServiceProperties(connector);
+ }
+
+ /**
+ * returns the test environment in which the connection event applies to
+ *
+ * @return the environment
+ */
+ public ITestEnvironment getEnvironment() {
+ return environment;
+ }
+
+ /**
+ * returns the {@link IServiceConnector} that provides the communication interface to the remote service
+ *
+ * @return the connector
+ */
+ public IServiceConnector getConnector() {
+ return connector;
+ }
+
+ /**
+ * gets the test environment session key
+ *
+ * @return the sessionKey
+ */
+ public UUID getSessionKey() {
+ return sessionKey;
+ }
+
+ public OteServiceProperties getProperties() {
+ return props;
+ }
+
+ public IHostTestEnvironment getHostEnvironment() {
+ return hostTestEnvironment;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/IEnvironmentConfigurer.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/IEnvironmentConfigurer.java
new file mode 100644
index 000000000..5950b1611
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/IEnvironmentConfigurer.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.service;
+
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IEnvironmentConfigurer {
+ boolean configure(IHostTestEnvironment event, SubProgressMonitor subProgressMonitor) throws Exception;
+}
diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/IOteClientService.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/IOteClientService.java
new file mode 100644
index 000000000..d29a224c2
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/IOteClientService.java
@@ -0,0 +1,110 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.service;
+
+import java.net.InetAddress;
+import java.util.List;
+import java.util.UUID;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.ote.core.OSEEPerson1_4;
+import org.eclipse.osee.ote.core.environment.TestEnvironmentConfig;
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironment;
+
+/**
+ * This service provides the means to find all available test servers and connect to them.
+ *
+ * @author Ken J. Aguilar
+ */
+public interface IOteClientService {
+ /**
+ * registers a {@link ITestEnvironmentAvailibilityListener} that will be notified whenever a test host changes its
+ * availability status. <BR>
+ * <B>NOTE: </B>The newly registered listener's
+ * {@link ITestEnvironmentAvailibilityListener#environmentAvailable(IHostTestEnvironment, org.eclipse.osee.connection.service.IServiceConnector, ServiceProperty)}
+ * method will be called immediately for each test host currently available
+ */
+ void addEnvironmentAvailibiltyListener(ITestEnvironmentAvailibilityListener listener);
+
+ void removeEnvironmentAvailibiltyListener(ITestEnvironmentAvailibilityListener listener);
+
+ /**
+ * adds the {@link ITestConnectionListener} that will be notified of connection events. <B>NOTE:</B> that if a
+ * connection has already been made prior to calling this method then the listener's
+ * {@link ITestConnectionListener#onPostConnect(ITestEnvironment)} method will be immediately called.
+ */
+ void addConnectionListener(ITestConnectionListener listener);
+
+ void removeConnectionListener(ITestConnectionListener listener);
+
+ /**
+ * sets the user that will logged into the OTE client service. A user must be set prior to connecting to an OTE test
+ * environment. If a connection is already established it will be broken prior to setting the new user.
+ */
+ void setUser(OSEEPerson1_4 user, InetAddress address) throws TestSessionException;
+
+ /**
+ * gets the current user as set by the {@link #setUser(OSEEPerson1_4, InetAddress)} method
+ *
+ * @return the current user or null if no user has been set
+ */
+ OSEEPerson1_4 getUser();
+
+ /**
+ * creates a connection to a test server. <B>NOTE: </B><I>A user must be logged in prior to calling this method.>/I>
+ * @param monitor
+ *
+ * @see #setUser(OSEEPerson1_4, InetAddress)
+ */
+ ConnectionEvent connect(IHostTestEnvironment env, IEnvironmentConfigurer configurer, TestEnvironmentConfig config, IProgressMonitor monitor) throws TestSessionException;
+
+ /**
+ * breaks the current connection to a test server. This will call the
+ * {@link ITestConnectionListener#onPreDisconnect(ConnectionEvent)} method for each registered
+ * {@link ITestConnectionListener} before the connection is actually broken.
+ */
+ void disconnect() throws TestSessionException;
+
+ /**
+ * gets the currently connected test environment
+ *
+ * @return returns the connected {@link ITestEnvironment} or null if no connection exists
+ */
+ ITestEnvironment getConnectedEnvironment();
+
+ /**
+ * returns the connector for the currently connected test environment
+ */
+ IServiceConnector getConnector();
+
+ IHostTestEnvironment getConnectedHost();
+
+ OteServiceProperties getProperties(IHostTestEnvironment testHost);
+
+ boolean isConnected();
+
+ /**
+ * sets a {@link SessionDelegate} who will handle certain aspects of the client session A successful call to
+ * {@link #setUser(OSEEPerson1_4, InetAddress)} must have occurred prior to calling this method.
+ */
+ void setSessionDelegate(SessionDelegate sessionDelegate);
+
+ /**
+ * returns a collection of all the {@link IHostTestEnvironment} that are currently available.
+ */
+ List<IServiceConnector> getAvailableTestHosts();
+
+ IServiceConnector getConnector(IHostTestEnvironment host);
+
+ UUID getSessionKey();
+}
diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/ITestConnectionListener.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/ITestConnectionListener.java
new file mode 100644
index 000000000..f3821493f
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/ITestConnectionListener.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.service;
+
+import org.eclipse.osee.connection.service.IServiceConnector;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface ITestConnectionListener {
+
+ void onPostConnect(ConnectionEvent event);
+
+ /**
+ * the connection to the service is broken unexpectedly. The service is not considered valid and thus clients should
+ * not try to communicate in any way with the OTE server. Clients are free to modify any local state.
+ */
+ void onConnectionLost(IServiceConnector connector);
+
+ /**
+ * this method is called when a disconnect request is initiated by the client. The connector and the service are
+ * still valid. This allows clients to remove any listeners on the remote OTE server or set some state prior to the
+ * actual disconnect.
+ */
+ void onPreDisconnect(ConnectionEvent event);
+
+}
diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/ITestEnvironmentAvailibilityListener.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/ITestEnvironmentAvailibilityListener.java
new file mode 100644
index 000000000..20b557d9a
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/ITestEnvironmentAvailibilityListener.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.service;
+
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+
+/**
+ * This listener will be notified of test host availability events. Clients must register implementations of this
+ * listener by calling {@link IOteClientService#addEnvironmentAvailibiltyListener(ITestEnvironmentAvailibilityListener)}
+ *
+ * @author Ken J. Aguilar
+ */
+public interface ITestEnvironmentAvailibilityListener {
+
+ /**
+ * this method will be called when a {@link IHostTestEnvironment} becomes available for use.
+ */
+ void environmentAvailable(IServiceConnector connector, OteServiceProperties properties);
+
+ /**
+ * this method will be called whenever a {@link IHostTestEnvironment} becomes unavailable.
+ */
+ void environmentUnavailable(IServiceConnector connector, OteServiceProperties properties);
+}
diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/ITestEnvironmentFilter.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/ITestEnvironmentFilter.java
new file mode 100644
index 000000000..9d9241275
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/ITestEnvironmentFilter.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.service;
+
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface ITestEnvironmentFilter {
+ boolean accept(IHostTestEnvironment env, OteServiceProperties properties);
+}
diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/JmsToJiniBridgeConnector.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/JmsToJiniBridgeConnector.java
new file mode 100644
index 000000000..3db200f25
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/JmsToJiniBridgeConnector.java
@@ -0,0 +1,192 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.service;
+
+import java.io.File;
+import java.io.Serializable;
+import java.net.URI;
+import java.net.UnknownHostException;
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import java.rmi.server.ExportException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import net.jini.export.Exporter;
+import net.jini.jeri.BasicILFactory;
+import net.jini.jeri.BasicJeriExporter;
+import net.jini.jeri.tcp.TcpServerEndpoint;
+
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.connection.service.IServicePropertyChangeListener;
+import org.eclipse.osee.framework.jdk.core.util.EnhancedProperties;
+import org.eclipse.osee.framework.jdk.core.util.Network;
+import org.eclipse.osee.framework.plugin.core.util.ExportClassLoader;
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class JmsToJiniBridgeConnector implements IServiceConnector {
+ public static final String TYPE = "jmstojini";
+ private static final class ExportInfo {
+ private final Exporter exporter;
+ private final Object exportedObject;
+
+ private ExportInfo(Exporter exporter, Object exportedObject) {
+ this.exportedObject = exportedObject;
+ this.exporter = exporter;
+ }
+ }
+
+ private EnhancedProperties properties;
+ private final HashMap<Object, ExportInfo> exports = new HashMap<>();
+ private final ExportClassLoader exportClassLoader;
+ private final Object service;
+ private final List<IServicePropertyChangeListener> propertyChangeListeners =
+ new CopyOnWriteArrayList<IServicePropertyChangeListener>();
+ private final String uniqueServerId;
+ private boolean connected = false;
+
+ public JmsToJiniBridgeConnector(ExportClassLoader exportClassLoader, Object service, String id) {
+ this.uniqueServerId = id;
+ this.exportClassLoader = exportClassLoader;
+ this.service = service;
+ if (service instanceof IHostTestEnvironment) {
+ try {
+ this.properties = ((IHostTestEnvironment) service).getProperties();
+ } catch (RemoteException ex) {
+ this.properties = new EnhancedProperties();
+ ex.printStackTrace();
+ }
+ } else {
+ this.properties = new EnhancedProperties();
+ }
+ }
+
+ @Override
+ public Object export(Object callback) throws ExportException {
+ try {
+ Exporter exporter = createExporter();
+ Object exportedObject = exporter.export((Remote) callback);
+ exports.put(callback, new ExportInfo(exporter, exportedObject));
+ return exportedObject;
+ } catch (UnknownHostException e) {
+ throw new ExportException("failed to export", e);
+ }
+ }
+
+ @Override
+ public void unexport(Object callback) throws Exception {
+ ExportInfo info = exports.remove(callback);
+ if (info != null) {
+ info.exporter.unexport(false);
+ }
+ }
+
+ @Override
+ public Object findExport(Object callback) {
+ ExportInfo info = exports.get(callback);
+ if (info != null) {
+ return info.exportedObject;
+ }
+ return null;
+ }
+
+ @Override
+ public void stop() throws Exception {
+ for (ExportInfo info : exports.values()) {
+ info.exporter.unexport(false);
+ }
+ exports.clear();
+ }
+
+ private Exporter createExporter() throws UnknownHostException {
+ return new BasicJeriExporter(TcpServerEndpoint.getInstance(Network.getValidIP().getHostAddress(), 0),
+ new BasicILFactory(null, null, exportClassLoader), false, false);
+ }
+
+ @Override
+ public String getConnectorType() {
+ return TYPE;
+ }
+
+ @Override
+ public Serializable getProperty(String property, Serializable defaultValue) {
+ return properties.getProperty(property, defaultValue);
+ }
+
+ @Override
+ public Object getService() {
+ return service;
+ }
+
+ @Override
+ public boolean ping() {
+ if (getService() != null && getService() instanceof IHostTestEnvironment) {
+ try {
+ ((IHostTestEnvironment) getService()).getProperties();
+ return true;
+ } catch (Throwable th) {
+ return false;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public void addPropertyChangeListener(IServicePropertyChangeListener listener) {
+ propertyChangeListeners.add(listener);
+ }
+
+ @Override
+ public void removePropertyChangeListener(IServicePropertyChangeListener listener) {
+ propertyChangeListeners.remove(listener);
+ }
+
+ @Override
+ public void setProperty(String key, Serializable value) {
+ properties.setProperty(key, value);
+ for (IServicePropertyChangeListener listener : propertyChangeListeners) {
+ listener.propertyChanged(this, key, value);
+ }
+ }
+
+ @Override
+ public URI upload(File file) throws Exception {
+ return null;
+ }
+
+ @Override
+ public String getUniqueServerId() {
+ return uniqueServerId;
+ }
+
+ @Override
+ public EnhancedProperties getProperties() {
+ return properties;
+ }
+
+ @Override
+ public void init(Object service) throws UnknownHostException, ExportException {
+
+ }
+
+ public void setConnected(boolean connected){
+ this.connected = connected;
+ }
+
+ public boolean isConnected() {
+ return this.connected;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/OteServiceProperties.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/OteServiceProperties.java
new file mode 100644
index 000000000..853d239aa
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/OteServiceProperties.java
@@ -0,0 +1,119 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.service;
+
+import java.io.Serializable;
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.framework.jdk.core.util.EnhancedProperties;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class OteServiceProperties {
+ private IServiceConnector connector;
+
+ private static final String NA = "N.A.";
+ private final boolean debug = false;
+
+ private EnhancedProperties properties;
+
+ public OteServiceProperties(IServiceConnector connector) {
+ this.connector = connector;
+ }
+
+ public OteServiceProperties(EnhancedProperties properties) {
+ this.properties = properties;
+ }
+
+ private String getLocalProperty(String name) {
+ if (connector != null) {
+ return (String) connector.getProperty(name, NA);
+ } else if (properties != null) {
+ return (String) properties.getProperty(name, NA);
+ }
+ return NA;
+ }
+
+ /**
+ * @return the name
+ */
+ public String getName() {
+ return getLocalProperty("name");
+ }
+
+ /**
+ * @return the station
+ */
+ public String getStation() {
+ return getLocalProperty("station");
+ }
+
+ /**
+ * @return the type
+ */
+ public String getType() {
+ return getLocalProperty("type");
+ }
+
+ /**
+ * @return the mode
+ */
+ public String getMode() {
+ return getLocalProperty("mode");
+ }
+
+ /**
+ * @return the version
+ */
+ public String getVersion() {
+ return getLocalProperty("version");
+ }
+
+ /**
+ * @return the group
+ */
+ public String getGroup() {
+ return getLocalProperty("groups");
+ }
+
+ /**
+ * @return the comment
+ */
+ public String getComment() {
+ return getLocalProperty("comment");
+ }
+
+ /**
+ * @return the dateStart
+ */
+ public String getDateStarted() {
+ return getLocalProperty("date").toString();
+ }
+
+ public String getUserList() {
+ return getLocalProperty("user_list").toString();
+ }
+
+ public void printStats() {
+ if (debug) {
+ System.out.printf("test service found:\n\tname: %s\n\tstation: %s\n\ttype: %s\n\tcomment: %s\n\t%s\n",
+ getName(), getStation(), getType(), getComment(), getGroup());
+ }
+ }
+
+ public Serializable getProperty(String name) {
+ return connector.getProperty(name, null);
+ }
+
+ public String getOwner() {
+ return (String) connector.getProperty("owner", NA);
+ }
+}
diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/SessionDelegate.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/SessionDelegate.java
new file mode 100644
index 000000000..f1980641d
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/SessionDelegate.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.service;
+
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+import org.eclipse.osee.ote.core.framework.prompt.IPassFailPromptResponse;
+import org.eclipse.osee.ote.core.framework.prompt.IResumeResponse;
+import org.eclipse.osee.ote.core.framework.prompt.IUserInputPromptResponse;
+import org.eclipse.osee.ote.core.framework.prompt.IYesNoPromptResponse;
+
+/**
+ * Test sessions will delegate responsibilities to sub classes of this interface.
+ *
+ * @author Ken J. Aguilar
+ */
+public interface SessionDelegate {
+ void handlePassFail(IPassFailPromptResponse prompt) throws Exception;
+
+ void handleYesNo(IYesNoPromptResponse prompt) throws Exception;
+
+ void handlePause(IResumeResponse prompt) throws Exception;
+
+ void handleInformationPrompt(String message) throws Exception;
+
+ void handleUserInput(final IUserInputPromptResponse prompt) throws Exception;
+
+ /**
+ * When connected to a {@link IHostTestEnvironment}, it is possible for the environment to request files from the
+ * client. This method will be called by the {@link IHostTestEnvironment} with a path that should make sense to the
+ * client.
+ *
+ * @return an array bytes that represent the content of the requested file
+ */
+ byte[] getFile(String path) throws Exception;
+
+ long getFileDate(String path) throws Exception;
+
+ void cancelPrompts() throws Exception;
+
+}
diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/TestSessionException.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/TestSessionException.java
new file mode 100644
index 000000000..9ba557e4c
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/TestSessionException.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.service;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class TestSessionException extends Exception {
+
+ private static final long serialVersionUID = -2013110839832896588L;
+
+ public TestSessionException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public TestSessionException(String message) {
+ super(message);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/ClientSession.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/ClientSession.java
new file mode 100644
index 000000000..c850a25d8
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/ClientSession.java
@@ -0,0 +1,220 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.service.core;
+
+import java.net.InetAddress;
+import java.rmi.RemoteException;
+import java.util.UUID;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.ReentrantLock;
+import java.util.logging.Level;
+
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.framework.logging.OseeLevel;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.ExportClassLoader;
+import org.eclipse.osee.ote.core.AbstractRemoteSession;
+import org.eclipse.osee.ote.core.ConnectionRequestResult;
+import org.eclipse.osee.ote.core.IRemoteUserSession;
+import org.eclipse.osee.ote.core.OSEEPerson1_4;
+import org.eclipse.osee.ote.core.environment.TestEnvironmentConfig;
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+import org.eclipse.osee.ote.core.framework.prompt.IPassFailPromptResponse;
+import org.eclipse.osee.ote.core.framework.prompt.IResumeResponse;
+import org.eclipse.osee.ote.core.framework.prompt.IUserInputPromptResponse;
+import org.eclipse.osee.ote.core.framework.prompt.IYesNoPromptResponse;
+import org.eclipse.osee.ote.service.Activator;
+import org.eclipse.osee.ote.service.SessionDelegate;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class ClientSession extends AbstractRemoteSession {
+ private static final int TIMEOUT = 1; // 1 minute timeout
+ private static final String LOCK_ERROR_MSG = "could not acquire lock";
+ private final InetAddress address;
+ private SessionDelegate sessionDelegate = null;
+ private final ReentrantLock lock = new ReentrantLock();
+// private final OteClientEndpointReceive receive;
+ private UUID id;
+
+ public ClientSession(OSEEPerson1_4 user, InetAddress address) {
+ super(user);
+ this.address = address;
+// this.receive = receive;
+ this.id = UUID.randomUUID();
+ Activator.log(Level.INFO,
+ String.format("Created OTE session for %s. Address=%s\n ", user.getName(), address.toString()));
+ }
+
+ @Override
+ public String getAddress() throws RemoteException {
+ return address.getHostAddress();
+ }
+
+ @Override
+ public byte[] getFile(String workspacePath) throws RemoteException {
+ if (sessionDelegate != null) {
+ try {
+ return sessionDelegate.getFile(workspacePath);
+ } catch (Exception ex) {
+ throw new RemoteException("failed to get the file " + workspacePath, ex);
+ }
+ }
+ throw new IllegalStateException("session delegate not set");
+ }
+
+ @Override
+ public long getFileDate(String workspacePath) throws RemoteException {
+ if (sessionDelegate != null) {
+ try {
+ return sessionDelegate.getFileDate(workspacePath);
+ } catch (Exception ex) {
+ throw new RemoteException("failed to get the file date" + workspacePath, ex);
+ }
+ }
+ throw new IllegalStateException("session delegate not set");
+ }
+
+ @Override
+ public boolean isAlive() throws RemoteException {
+ try {
+ if (lock.tryLock(TIMEOUT, TimeUnit.MINUTES)) {
+ try {
+ return true;
+ } finally {
+ lock.unlock();
+ }
+ }
+ return false;
+ } catch (InterruptedException ex) {
+ throw new RemoteException(LOCK_ERROR_MSG, ex);
+ }
+ }
+
+ @Override
+ public void initiateInformationalPrompt(String message) throws RemoteException {
+ assert sessionDelegate != null : "delegate is null";
+ try {
+ sessionDelegate.handleInformationPrompt(message);
+ } catch (Exception ex) {
+ System.out.println(message);
+ }
+ }
+
+ @Override
+ public void initiatePassFailPrompt(IPassFailPromptResponse prompt) throws RemoteException {
+ assert sessionDelegate != null : "delegate is null";
+ try {
+ sessionDelegate.handlePassFail(prompt);
+ } catch (Exception ex) {
+ throw new RemoteException("exception initiating prompt", ex);
+ }
+ }
+
+ @Override
+ public void initiateResumePrompt(IResumeResponse prompt) throws RemoteException {
+ assert sessionDelegate != null : "delegate is null";
+ try {
+ sessionDelegate.handlePause(prompt);
+ } catch (Exception ex) {
+ throw new RemoteException("exception initiating prompt", ex);
+ }
+ }
+
+ @Override
+ public void cancelPrompts() throws RemoteException {
+ assert sessionDelegate != null : "delegate is null";
+ try {
+ sessionDelegate.cancelPrompts();
+ } catch (Exception ex) {
+ throw new RemoteException("exception canceling prompt", ex);
+ }
+ }
+
+ @Override
+ public void initiateUserInputPrompt(IUserInputPromptResponse prompt) throws RemoteException {
+ assert sessionDelegate != null : "delegate is null";
+ try {
+ sessionDelegate.handleUserInput(prompt);
+ } catch (Exception ex) {
+ throw new RemoteException("exception initiating prompt", ex);
+ }
+ }
+
+ /**
+ * this must be called prior to establishing a test host connection
+ */
+ synchronized void setSessionDelegate(SessionDelegate sessionDelegate) {
+ // intentionally package-private
+ this.sessionDelegate = sessionDelegate;
+ }
+
+ /**
+ * closes this session
+ */
+ void close() {
+
+ }
+
+ TestHostConnection connect(IServiceConnector connector, IHostTestEnvironment testHost, TestEnvironmentConfig config) throws Exception {
+ // intentionally package-private
+ if (lock.tryLock(TIMEOUT, TimeUnit.MINUTES)) {
+ try {
+ IRemoteUserSession exportedSession = (IRemoteUserSession) connector.export(this);
+ UUID id = UUID.randomUUID();
+ Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+ ConnectionRequestResult result = testHost.requestEnvironment(exportedSession, id, config);
+ if (result != null && result.getStatus().getStatus()) {
+ connector.setConnected(true);
+ return new TestHostConnection(connector, testHost, result.getEnvironment(), result.getSessionKey());
+ } else {
+ OseeLog.log(Activator.class, OseeLevel.SEVERE_POPUP, "Error Connecting to the OTE Test Server.",
+ new Exception(result.getStatus().getMessage()));
+ }
+ return null;
+ } finally {
+ lock.unlock();
+ }
+ }
+ throw new IllegalStateException(LOCK_ERROR_MSG);
+
+ }
+
+ void disconnect(TestHostConnection connection) throws InterruptedException, RemoteException {
+ // intentionally package-private
+ if (lock.tryLock(TIMEOUT, TimeUnit.MINUTES)) {
+ try {
+ connection.getServiceConnector().setConnected(false);
+ connection.endConnection();
+ return;
+ } finally {
+ lock.unlock();
+ }
+ }
+ throw new IllegalStateException(LOCK_ERROR_MSG);
+ }
+
+ @Override
+ public void initiateYesNoPrompt(IYesNoPromptResponse prompt) throws Exception {
+ assert sessionDelegate != null : "delegate is null";
+ try {
+ sessionDelegate.handleYesNo(prompt);
+ } catch (Exception ex) {
+ throw new RemoteException("exception initiating prompt", ex);
+ }
+ }
+
+ @Override
+ public UUID getUserId() throws Exception {
+ return id;
+ }
+}
diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/ConnectionServiceTracker.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/ConnectionServiceTracker.java
new file mode 100644
index 000000000..7a82a8b37
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/ConnectionServiceTracker.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.service.core;
+
+import java.util.logging.Level;
+
+import org.eclipse.osee.connection.service.IConnectionService;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.service.IOteClientService;
+import org.eclipse.osee.ote.service.TestSessionException;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.util.tracker.ServiceTracker;
+
+public class ConnectionServiceTracker extends ServiceTracker {
+
+// private final OteClientEndpointReceive endpointReceive = new OteClientEndpointReceive();
+// private final OteClientEndpointSend endpointSend = new OteClientEndpointSend();
+// private final MessagingGatewayBindTracker messagingGatewayTracker;
+
+ private ServiceRegistration registration;
+ private TestClientServiceImpl testClientService;
+
+ public ConnectionServiceTracker(BundleContext context) {
+ super(context, IConnectionService.class.getName(), null);
+// messagingGatewayTracker = new MessagingGatewayBindTracker(context, endpointSend, endpointReceive);
+// messagingGatewayTracker.open(true);
+ }
+
+ @Override
+ public Object addingService(ServiceReference reference) {
+ IConnectionService connectionService = (IConnectionService) super.addingService(reference);
+ testClientService = new TestClientServiceImpl(connectionService);
+ testClientService.init();
+ // register the service
+ registration = context.registerService(IOteClientService.class.getName(), testClientService, null);
+ return connectionService;
+ }
+
+ private void shutdownClientService() {
+ if (testClientService != null) {
+ // we should fire off all disconnect listeners before we unregister the service
+ if (testClientService.isConnected()) {
+ try {
+ testClientService.disconnect();
+ } catch (TestSessionException ex) {
+ OseeLog.log(ConnectionServiceTracker.class, Level.SEVERE, "failed to disconnect", ex);
+ }
+ }
+ registration.unregister();
+ try {
+ testClientService.stop();
+ } catch (Exception e) {
+ OseeLog.log(ConnectionServiceTracker.class, Level.SEVERE, "failed to properly stop OTE client service", e);
+
+ }
+ testClientService = null;
+ }
+ }
+
+ @Override
+ public void close() {
+ shutdownClientService();
+// messagingGatewayTracker.close();
+ super.close();
+ }
+
+ @Override
+ public void removedService(ServiceReference reference, Object service) {
+ shutdownClientService();
+ super.removedService(reference, service);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/ListenerNotifier.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/ListenerNotifier.java
new file mode 100644
index 000000000..61490b51c
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/ListenerNotifier.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.service.core;
+
+import java.util.concurrent.CopyOnWriteArraySet;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadFactory;
+import java.util.logging.Level;
+
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.service.Activator;
+import org.eclipse.osee.ote.service.ConnectionEvent;
+import org.eclipse.osee.ote.service.ITestConnectionListener;
+
+/**
+ * @author Ken J. Aguilar
+ */
+class ListenerNotifier {
+ private final ExecutorService executor = Executors.newCachedThreadPool(new ThreadFactory() {
+ private int count = 0;
+ @Override
+ public Thread newThread(Runnable r) {
+ Thread th = new Thread(r);
+ th.setName(String.format("OTE listener notifier [%d]", count++));
+ return th;
+ }
+ });
+ private final CopyOnWriteArraySet<ITestConnectionListener> testConnectionListeners =
+ new CopyOnWriteArraySet<ITestConnectionListener>();
+
+ boolean addTestConnectionListener(ITestConnectionListener listener) {
+ return testConnectionListeners.add(listener);
+ }
+
+ boolean removeTestConnectionListener(ITestConnectionListener listener) {
+ return testConnectionListeners.remove(listener);
+ }
+
+ void notifyPostConnection(final ConnectionEvent event) {
+ executor.submit(new Runnable() {
+
+ @Override
+ public void run() {
+ for (ITestConnectionListener listener : testConnectionListeners) {
+ try {
+ listener.onPostConnect(event);
+ } catch (Throwable ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, "exception notifying listener of post connect event", ex);
+ }
+ }
+ }
+
+ });
+ }
+
+ void notifyDisconnect(final ConnectionEvent event) {
+ for (ITestConnectionListener listener : testConnectionListeners) {
+ try {
+ listener.onPreDisconnect(event);
+ } catch (Throwable ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, "exception notifying listener of disconnect event", ex);
+ }
+ }
+ }
+
+ void notifyConnectionLost(final IServiceConnector connector) {
+ executor.submit(new Runnable() {
+
+ @Override
+ public void run() {
+ for (ITestConnectionListener listener : testConnectionListeners) {
+ try {
+ listener.onConnectionLost(connector);
+ } catch (Throwable ex) {
+ OseeLog.log(Activator.class, Level.SEVERE, "exception notifying listener of connection error event",
+ ex);
+ }
+ }
+ }
+ });
+
+ }
+
+}
diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/TestClientServiceImpl.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/TestClientServiceImpl.java
new file mode 100644
index 000000000..176d3d3f7
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/TestClientServiceImpl.java
@@ -0,0 +1,378 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.service.core;
+
+import java.net.InetAddress;
+import java.rmi.RemoteException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.UUID;
+import java.util.logging.Level;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.osee.connection.service.IConnectionService;
+import org.eclipse.osee.connection.service.IConnectorListener;
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.framework.jdk.core.util.EnhancedProperties;
+import org.eclipse.osee.ote.core.OSEEPerson1_4;
+import org.eclipse.osee.ote.core.ServiceUtility;
+import org.eclipse.osee.ote.core.environment.TestEnvironmentConfig;
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironment;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpoint;
+import org.eclipse.osee.ote.service.Activator;
+import org.eclipse.osee.ote.service.ConnectionEvent;
+import org.eclipse.osee.ote.service.IEnvironmentConfigurer;
+import org.eclipse.osee.ote.service.IOteClientService;
+import org.eclipse.osee.ote.service.ITestConnectionListener;
+import org.eclipse.osee.ote.service.ITestEnvironmentAvailibilityListener;
+import org.eclipse.osee.ote.service.OteServiceProperties;
+import org.eclipse.osee.ote.service.SessionDelegate;
+import org.eclipse.osee.ote.service.TestSessionException;
+
+public class TestClientServiceImpl implements IOteClientService, IConnectorListener {
+
+ private static final String NO_USER_MSG = "a user has not been set";
+ private final IConnectionService connectionService;
+ private final HashMap<String, IServiceConnector> testHosts = new HashMap<>();
+ private final ListenerNotifier listenerNotifier = new ListenerNotifier();
+ private final HashSet<ITestEnvironmentAvailibilityListener> hostAvailabilityListeners =
+ new HashSet<ITestEnvironmentAvailibilityListener>();
+ private ClientSession session = null;
+ private volatile boolean stopped = false;
+ private TestHostConnection testConnection;
+
+// private final OteClientEndpointSend endpointSend;
+// private final OteClientEndpointReceive endpointReceive;
+
+ public TestClientServiceImpl(IConnectionService connectionService) {
+ this.connectionService = connectionService;
+// this.endpointReceive = endpointReceive;
+// this.endpointSend = endpointSend;
+// endpointSend.setTestClientService(this);
+ }
+
+ public void init() {
+ connectionService.addListener(this);
+ }
+
+ @Override
+ public void addEnvironmentAvailibiltyListener(ITestEnvironmentAvailibilityListener listener) {
+ checkState();
+ final Set<Entry<String, IServiceConnector>> entrySet;
+ synchronized (this) {
+ if (hostAvailabilityListeners.add(listener)) {
+ entrySet = new HashSet<>(testHosts.entrySet());
+ } else {
+ entrySet = Collections.emptySet();
+ }
+ }
+ for (Entry<String, IServiceConnector> entry : entrySet) {
+ listener.environmentAvailable(entry.getValue(),
+ new OteServiceProperties(entry.getValue()));
+ }
+ }
+
+ @Override
+ public ConnectionEvent connect(IHostTestEnvironment testHost, IEnvironmentConfigurer configurer, TestEnvironmentConfig config, IProgressMonitor monitor) throws IllegalArgumentException, TestSessionException {
+ checkState();
+ final IServiceConnector connector;
+ final ClientSession localSession;
+ synchronized (this) {
+ if (session == null) {
+ throw new IllegalArgumentException("a user has not been set");
+ }
+ if (testConnection != null) {
+ throw new IllegalStateException("already connected");
+ }
+ if (testHost == null) {
+ throw new IllegalArgumentException("test host cannot be null");
+ }
+ connector = getConnector(testHost);
+ localSession = session;
+ }
+ try {
+ if (connector == null) {
+ throw new IllegalStateException("Unable to find a connection.");
+ }
+ if(configurer.configure(testHost, new SubProgressMonitor(monitor, 95)) && !monitor.isCanceled()){
+ testConnection = localSession.connect(connector, testHost, config);
+ if (testConnection != null) {
+ // success
+ ConnectionEvent event = new ConnectionEvent(testHost, connector, testConnection.getConnectEnvironment(), testConnection.getSessionKey());
+ listenerNotifier.notifyPostConnection(event);
+ return event;
+ }
+ }
+ } catch (Exception e) {
+ Activator.log(Level.SEVERE, "failed to establish connection", e);
+ testConnection = null;
+ }
+ return null;
+ }
+
+ @Override
+ public synchronized IServiceConnector getConnector(IHostTestEnvironment host) {
+ try {
+ EnhancedProperties properties = host.getProperties();
+ if(properties != null){
+ String passedInId = (String) properties.getProperty("id");
+ for (IServiceConnector connector : testHosts.values()) {
+ String loopId = (String) connector.getProperty("id", "no");
+ if (passedInId != null && loopId != null && loopId.equals(passedInId)) {
+ return connector;
+ }
+ }
+ }
+ } catch (RemoteException ex) {
+ ex.printStackTrace();
+ }
+ return null;
+ }
+
+ @Override
+ public void disconnect() throws TestSessionException {
+ checkState();
+ synchronized (this) {
+ if (session == null) {
+ throw new IllegalStateException(NO_USER_MSG);
+ }
+ if (testConnection == null) {
+ return;
+ }
+ Activator.log(Level.INFO,
+ "disconnecting from " + new OteServiceProperties(testConnection.getServiceConnector()).getStation());
+ ITestEnvironment envirnonment = testConnection.getConnectEnvironment();
+
+ if (!testConnection.getServiceConnector().ping()) {
+ listenerNotifier.notifyConnectionLost(testConnection.getServiceConnector());
+ testConnection = null;
+ } else {
+ ConnectionEvent event =
+ new ConnectionEvent(this.getConnectedHost(), testConnection.getConnectedTestHost(), envirnonment,
+ testConnection.getSessionKey());
+ listenerNotifier.notifyDisconnect(event);
+ try {
+ session.disconnect(testConnection);
+ } catch (Exception e) {
+ throw new TestSessionException("could not properly disconnect from test environment", e);
+ } finally {
+ testConnection = null;
+ }
+ }
+ }
+
+ }
+
+ /**
+ * stops this service
+ */
+ public synchronized void stop() {
+ connectionService.removeListener(this);
+ if (session != null) {
+ try {
+ if (testConnection != null) {
+ disconnect();
+ }
+ } catch (Exception e) {
+ Activator.log(Level.SEVERE, "exception trying to disconnect during stop()", e);
+ } finally {
+ session.close();
+ }
+ }
+ stopped = true;
+ hostAvailabilityListeners.clear();
+ }
+
+ @Override
+ public void addConnectionListener(ITestConnectionListener listener) {
+ checkState();
+ if (listenerNotifier.addTestConnectionListener(listener)) {
+ if (session == null) {
+ return;
+ }
+ try {
+ final ConnectionEvent event;
+ // we want to avoid holding a lock when we call onPostConnect due to potential deadlock. so lets do what we can
+ // in a small synchronized block prior to calling onPostConnect
+ synchronized (this) {
+ // check to see if a connection already established
+ if (testConnection != null) {
+ event = new ConnectionEvent(this.getConnectedHost(),
+ testConnection.getServiceConnector(), testConnection.getConnectEnvironment(),
+ testConnection.getSessionKey());
+ } else {
+ event = null;
+ }
+ }
+ if (event != null) {
+ listener.onPostConnect(event);
+ }
+ } catch (Exception e) {
+ Activator.log(Level.SEVERE, "Exception notifying listener of connection event", e);
+ }
+ }
+ }
+
+ @Override
+ public void removeConnectionListener(ITestConnectionListener listener) {
+ listenerNotifier.removeTestConnectionListener(listener);
+ }
+
+ @Override
+ public synchronized void removeEnvironmentAvailibiltyListener(ITestEnvironmentAvailibilityListener listener) {
+ checkState();
+ hostAvailabilityListeners.remove(listener);
+ }
+
+ private void checkState() {
+ if (stopped) {
+ throw new IllegalStateException("service stopped");
+ }
+ }
+
+ @Override
+ public synchronized void setUser(OSEEPerson1_4 user, InetAddress address) throws TestSessionException {
+ checkState();
+ if (testConnection != null) {
+ disconnect();
+ }
+ if (session != null) {
+ session.close();
+ }
+ session = new ClientSession(user, address);
+ }
+
+ @Override
+ public synchronized OSEEPerson1_4 getUser() {
+ if (session != null) {
+ return session.getUser();
+ }
+ return null;
+ }
+
+ @Override
+ public synchronized UUID getSessionKey() {
+ return testConnection != null ? testConnection.getSessionKey() : null;
+
+ }
+
+ @Override
+ public synchronized void setSessionDelegate(SessionDelegate sessionDelegate) {
+ checkState();
+ if (session == null) {
+ throw new IllegalStateException(NO_USER_MSG);
+ }
+ session.setSessionDelegate(sessionDelegate);
+ }
+
+
+ private void notifyHostAvailable(IServiceConnector connector, OteServiceProperties props) {
+ for (ITestEnvironmentAvailibilityListener listener : hostAvailabilityListeners) {
+ listener.environmentAvailable(connector, props);
+ }
+ }
+
+ private void notifyHostUnavailable(IServiceConnector connector, OteServiceProperties props) {
+ for (ITestEnvironmentAvailibilityListener listener : hostAvailabilityListeners) {
+ try {
+ listener.environmentUnavailable(connector, props);
+ } catch (Exception e) {
+ Activator.log(Level.SEVERE, "exception in listener during host unavailable event notification", e);
+ }
+ }
+ }
+
+ @Override
+ public synchronized ITestEnvironment getConnectedEnvironment() throws IllegalStateException {
+ checkState();
+ return testConnection == null ? null : testConnection.getConnectEnvironment();
+ }
+
+ @Override
+ public synchronized IHostTestEnvironment getConnectedHost() throws IllegalStateException {
+ checkState();
+ return testConnection == null ? null : (IHostTestEnvironment) testConnection.getConnectedTestHost().getService();
+
+ }
+
+ @Override
+ public synchronized IServiceConnector getConnector() {
+ checkState();
+ return testConnection == null ? null : testConnection.getServiceConnector();
+ }
+
+ @Override
+ public synchronized List<IServiceConnector> getAvailableTestHosts() {
+ List<IServiceConnector> envs = new ArrayList<>();
+ for (IServiceConnector conn : testHosts.values()) {
+ envs.add(conn);
+ }
+ return envs;
+ }
+
+ @Override
+ public synchronized boolean isConnected() {
+ return testConnection != null;
+ }
+
+ @Override
+ public OteServiceProperties getProperties(IHostTestEnvironment testHost) {
+
+ IServiceConnector connector = getConnector(testHost);
+ if (connector != null) {
+ return new OteServiceProperties(connector);
+ }
+ try {
+ return new OteServiceProperties(testHost.getProperties());
+ } catch (RemoteException ex) {
+ return null;
+ }
+ }
+
+ @Override
+ public void onConnectionServiceStopped() {
+ }
+
+ @Override
+ public synchronized void onConnectorsAdded(Collection<IServiceConnector> connectors) {
+ for (IServiceConnector connector : connectors) {
+ OteServiceProperties props = new OteServiceProperties(connector);
+ props.printStats();
+ testHosts.put(connector.getUniqueServerId(), connector);
+ notifyHostAvailable(connector, props);
+ }
+ }
+
+ @Override
+ public synchronized void onConnectorRemoved(IServiceConnector connector) {
+ String id = connector.getUniqueServerId();
+ testHosts.remove(id);
+ notifyHostUnavailable(connector, new OteServiceProperties(connector));
+ IHostTestEnvironment connectedHost = getConnectedHost();
+ if (testConnection != null && testConnection.getId().equals(id)) {
+ testConnection = null;
+ listenerNotifier.notifyConnectionLost(connector);
+ OteUdpEndpoint endpoint = ServiceUtility.getService(OteUdpEndpoint.class);
+ if(endpoint != null){
+ endpoint.removeBroadcast(null);
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/TestHostConnection.java b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/TestHostConnection.java
new file mode 100644
index 000000000..6680b6b0f
--- /dev/null
+++ b/org.eclipse.osee.ote.client/src/org/eclipse/osee/ote/service/core/TestHostConnection.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.service.core;
+
+import java.rmi.RemoteException;
+import java.util.UUID;
+
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironment;
+
+/**
+ * Encapsulated all information regarding the current connection between a client and a test server.
+ *
+ * @author Ken J. Aguilar
+ */
+class TestHostConnection {
+ // intentionally package-private
+
+ private final IServiceConnector serviceConnector;
+ private final ITestEnvironment connectEnvironment;
+ private final UUID sessionKey;
+ private final IHostTestEnvironment host;
+ private String serverId;
+
+ TestHostConnection(IServiceConnector connector, IHostTestEnvironment host, ITestEnvironment connectEnvironment, UUID uuid) {
+ // intentionally package-private
+ if (connector == null) {
+ throw new NullPointerException("service connector cannot be null");
+ }
+ if (connectEnvironment == null) {
+ throw new NullPointerException("test environment cannot be null");
+ }
+ if (uuid == null) {
+ throw new NullPointerException("session key cannot be null");
+ }
+ this.serviceConnector = connector;
+ this.host = host;
+ this.connectEnvironment = connectEnvironment;
+ this.sessionKey = uuid;
+ try {
+ this.serverId = (String) host.getProperties().getProperty("id");
+ } catch (RemoteException e) {
+ this.serverId = "";
+ }
+ }
+
+ /**
+ * @return the connectedTestHost
+ */
+ public IServiceConnector getConnectedTestHost() {
+ return serviceConnector;
+ }
+
+ /**
+ * @return the connectEnvironment
+ */
+ public ITestEnvironment getConnectEnvironment() {
+ return connectEnvironment;
+ }
+
+ /**
+ * @return the sessionKey
+ */
+ public UUID getSessionKey() {
+ return sessionKey;
+ }
+
+ /**
+ * @return the serviceConnector
+ */
+ public IServiceConnector getServiceConnector() {
+ return serviceConnector;
+ }
+
+ public String getId(){
+ return serverId;
+ }
+
+ void endConnection() throws RemoteException {
+ // intentionally package-private
+
+ host.disconnect(sessionKey);
+ }
+}
diff --git a/org.eclipse.osee.ote.connection.jini/.classpath b/org.eclipse.osee.ote.connection.jini/.classpath
new file mode 100644
index 000000000..1fa3e6803
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.jini/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.ote.connection.jini/.pmd b/org.eclipse.osee.ote.connection.jini/.pmd
new file mode 100644
index 000000000..c7b0a9fb3
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.jini/.pmd
@@ -0,0 +1,925 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<pmd>
+ <useProjectRuleSet>false</useProjectRuleSet>
+ <ruleSetFile>.ruleset</ruleSetFile>
+ <rules>
+ <rule>
+ <name>LooseCoupling</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneMethodMustImplementCloneable</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedImports</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SignatureDeclareThrowsException</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IfStmtsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>WhileLoopsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IfElseStmtsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ForLoopsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseSingleton</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanReturns</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanExpressions</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SwitchStmtsShouldHaveDefault</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDeeplyNestedIfStmts</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidReassigningParameters</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SwitchDensity</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConstructorCallsOverridableMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AccessorClassGeneration</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalFieldCouldBeStatic</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloseResource</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonStaticInitializer</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DefaultLabelNotLastInSwitchStmt</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonCaseLabelInSwitchStatement</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>OptimizableToArrayCall</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BadComparison</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EqualsNull</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConfusingTernary</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InstantiationToGetClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IdempotentOperations</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimpleDateFormatNeedsLocale</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ImmutableField</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseLocaleWithCaseConversions</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidProtectedFieldInFinalClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AssignmentToNonFinalStatic</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingStaticMethodInNonInstantiatableClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidSynchronizedAtMethodLevel</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingBreakInSwitch</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseNotifyAllInsteadOfNotify</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidInstanceofChecksInCatchClause</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractClassWithoutAbstractMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyConditional</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CompareObjectsWithEquals</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PositionLiteralsFirstInComparisons</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryLocalBeforeReturn</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonThreadSafeSingleton</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UncommentedEmptyMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UncommentedEmptyConstructor</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidConstantsInterface</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnsynchronizedStaticDateFormatter</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PreserveStackTrace</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseCollectionIsEmpty</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassWithOnlyPrivateConstructorsShouldBeFinal</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyMethodInAbstractClassShouldBeAbstract</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SingularField</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReturnEmptyArrayRatherThanNull</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractClassWithoutAnyMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooFewBranchesForASwitchStatement</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCatchingThrowable</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SignatureDeclareThrowsException</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExceptionAsFlowControl</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCatchingNPE</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingRawExceptionTypes</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingNullPointerException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidRethrowingException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotExtendJavaLangError</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotThrowExceptionInFinally</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingNewInstanceOfSameException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedPrivateField</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedLocalVariable</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedPrivateMethod</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedFormalParameter</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MoreThanOneLogger</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LoggerIsNotStaticFinal</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SystemPrintln</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidPrintStackTrace</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDuplicateLiterals</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringInstantiation</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringToString</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InefficientStringBuffering</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryCaseChange</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseStringBufferLength</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AppendCharacterWithChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConsecutiveLiteralAppends</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseIndexOfChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InefficientEmptyStringCheck</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InsufficientStringBufferDeclaration</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessStringValueOf</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringBufferInstantiationWithChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseEqualsToCompareStrings</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidStringBufferField</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceVectorWithList</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceHashtableWithMap</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceEnumerationWithIterator</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidEnumAsIdentifier</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidAssertAsIdentifier</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IntegerInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ByteInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ShortInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LongInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseBeforeAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseAfterAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseTestAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4SuitesShouldUseSuiteAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitUseExpected</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseProperClassLoader</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MDBAndSessionBeanNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>RemoteSessionInterfaceNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LocalInterfaceSessionNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LocalHomeNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>RemoteInterfaceNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotCallSystemExit</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StaticEJBFieldShouldBeFinal</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotUseThreads</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidInstantiatingObjectsInLoops</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseArrayListInsteadOfVector</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyStartsWith</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseStringBufferForStringAppends</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseArraysAsList</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidArrayLoops</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryWrapperObjectCreation</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AddEmptyString</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyCatchBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyIfStmt</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyWhileStmt</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyTryBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyFinallyBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptySwitchStatements</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JumbledIncrementer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ForLoopShouldBeWhileLoop</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryConversionTemporary</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>OverrideBothEqualsAndHashcode</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoubleCheckedLocking</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReturnFromFinallyBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptySynchronizedBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryReturn</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyStaticInitializer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnconditionalIfStatement</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyStatementNotInLoop</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanInstantiation</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryFinalModifier</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CollapsibleIfStatements</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessOverridingMethod</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassCastExceptionWithToArray</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDecimalLiteralsInBigDecimalConstructor</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessOperationOnImmutable</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MisplacedNullCheck</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedNullCheckInEquals</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThreadGroup</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BrokenNullCheck</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BigIntegerInstantiation</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingOctalValues</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingHardCodedIP</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CheckResultSet</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidMultipleUnaryOperators</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyInitializer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodReturnsInternalArray</name>
+ <ruleset>Security Code Guidelines</ruleset>
+ </rule>
+ <rule>
+ <name>ArrayIsStoredDirectly</name>
+ <ruleset>Security Code Guidelines</ruleset>
+ </rule>
+ <rule>
+ <name>CouplingBetweenObjects</name>
+ <ruleset>Coupling Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveImports</name>
+ <ruleset>Coupling Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LooseCoupling</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DuplicateImports</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DontImportJavaLang</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedImports</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ImportFromSamePackage</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyStaticImports</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitStaticSuite</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitSpelling</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitAssertionsShouldIncludeMessage</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitTestsShouldIncludeAssert</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TestClassWithoutTestCases</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryBooleanAssertion</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertEqualsInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertSameInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertNullInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanAssertion</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NullAssignment</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedModifier</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AssignmentInOperand</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AtLeastOneConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DontImportSun</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousOctalEscape</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CallSuperInConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryParentheses</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DefaultPackage</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanInversion</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DataflowAnomalyAnalysis</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFinalLocalVariable</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingShortType</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingVolatile</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingNativeCode</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidAccessibilityAlteration</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotCallGarbageCollectionExplicitly</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodNamingConventions</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassNamingConventions</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractNaming</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDollarSigns</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodWithSameNameAsEnclosingClass</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousHashcodeMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousConstantFieldName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousEqualsMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFieldNameMatchingTypeName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFieldNameMatchingMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NoPackage</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PackageCase</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MisleadingVariableName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanGetMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NPathComplexity</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveMethodLength</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveParameterList</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveClassLength</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CyclomaticComplexity</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessivePublicCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyFields</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssMethodCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssTypeCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssConstructorCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyMethods</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyFinalizer</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeOnlyCallsSuperFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeOverloaded</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeDoesNotCallSuperFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeShouldBeProtected</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCallingFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseCorrectExceptionLogging</name>
+ <ruleset>Jakarta Commons Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ProperLogger</name>
+ <ruleset>Jakarta Commons Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingSerialVersionUID</name>
+ <ruleset>JavaBean Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ProperCloneImplementation</name>
+ <ruleset>Clone Implementation Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneThrowsCloneNotSupportedException</name>
+ <ruleset>Clone Implementation Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneMethodMustImplementCloneable</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ </rules>
+ <includeDerivedFiles>false</includeDerivedFiles>
+ <violationsAsErrors>true</violationsAsErrors>
+</pmd>
diff --git a/org.eclipse.osee.ote.connection.jini/.project b/org.eclipse.osee.ote.connection.jini/.project
new file mode 100644
index 000000000..42f4d6531
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.jini/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ote.connection.jini</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.connection.jini/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.connection.jini/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..793371522
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.jini/META-INF/MANIFEST.MF
@@ -0,0 +1,18 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: JINI Connector provider (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.connection.jini;singleton:=true
+Bundle-Version: 0.25.3.qualifier
+Bundle-Activator: org.eclipse.osee.ote.connection.jini.Activator
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.osee.framework.jini,
+ net.jini,
+ org.eclipse.osee.framework.plugin.core,
+ org.eclipse.osee.framework.logging
+Bundle-ActivationPolicy: lazy
+Import-Package: org.eclipse.osee.connection.service,
+ org.eclipse.osee.framework.jdk.core.util,
+ org.eclipse.osee.framework.jdk.core.util.network
+Export-Package: org.eclipse.osee.ote.connection.jini
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
diff --git a/org.eclipse.osee.ote.connection.jini/build.properties b/org.eclipse.osee.ote.connection.jini/build.properties
new file mode 100644
index 000000000..e9863e281
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.jini/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml
diff --git a/org.eclipse.osee.ote.connection.jini/plugin.xml b/org.eclipse.osee.ote.connection.jini/plugin.xml
new file mode 100644
index 000000000..9523eb4e9
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.jini/plugin.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+ <extension
+ point="org.eclipse.osee.connection.service.ext">
+ <ConnectorContribution
+ className="org.eclipse.osee.ote.connection.jini.ConnectorContribution">
+ </ConnectorContribution>
+ </extension>
+
+</plugin>
diff --git a/org.eclipse.osee.ote.connection.jini/pom.xml b/org.eclipse.osee.ote.connection.jini/pom.xml
new file mode 100644
index 000000000..4b5e4cc44
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.jini/pom.xml
@@ -0,0 +1,35 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.osee</groupId>
+ <artifactId>org.eclipse.osee.ote.parent</artifactId>
+ <version>0.25.3-SNAPSHOT</version>
+ <relativePath>../org.eclipse.osee.ote.parent</relativePath>
+ </parent>
+
+ <artifactId>org.eclipse.osee.ote.connection.jini</artifactId>
+ <packaging>eclipse-plugin</packaging>
+ <name>OTE Connection JINI (Incubation)</name>
+
+ <build>
+ <!-- workaround for https://issues.sonatype.org/browse/TYCHO-168 -->
+ <resources>
+ <resource>
+ <directory>src</directory>
+ <excludes>
+ <exclude>**/*.java</exclude>
+ </excludes>
+ </resource>
+ </resources>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-source-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/Activator.java b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/Activator.java
new file mode 100644
index 000000000..d73c09496
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/Activator.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.connection.jini;
+
+import java.util.logging.Level;
+
+import org.eclipse.core.runtime.Plugin;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.ExportClassLoader;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends Plugin {
+
+ // The plug-in ID
+ public static final String PLUGIN_ID = "org.eclipse.osee.ote.connection.jini";
+
+ // The shared instance
+ private static Activator plugin;
+
+
+ private ExportClassLoader exportClassLoader;
+
+ /**
+ * The constructor
+ */
+ public Activator() {
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ plugin = this;
+
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ super.stop(context);
+ exportClassLoader = null;
+ plugin = null;
+ }
+
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static Activator getDefault() {
+ return plugin;
+ }
+
+ ClassLoader getExportClassLoader() {
+ return exportClassLoader;
+ }
+
+ public static void log(Level level, String message, Throwable t) {
+ OseeLog.log(Activator.class, level, message, t);
+ }
+
+ public static void log(Level level, String message) {
+ log(level, message, null);
+ }
+}
diff --git a/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/ConnectorContribution.java b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/ConnectorContribution.java
new file mode 100644
index 000000000..17d6fe946
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/ConnectorContribution.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.connection.jini;
+
+import org.eclipse.osee.connection.service.IConnectorContributor;
+
+public class ConnectorContribution implements IConnectorContributor {
+
+ public ConnectorContribution() {
+ }
+
+ @Override
+ public void init() throws Exception {
+ }
+
+}
diff --git a/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/IJiniConnectorLink.java b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/IJiniConnectorLink.java
new file mode 100644
index 000000000..bd858a816
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/IJiniConnectorLink.java
@@ -0,0 +1,18 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.connection.jini;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+
+public interface IJiniConnectorLink extends Remote {
+ boolean ping() throws RemoteException;
+}
diff --git a/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/IJiniConnectorRegistrar.java b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/IJiniConnectorRegistrar.java
new file mode 100644
index 000000000..b2418692b
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/IJiniConnectorRegistrar.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.connection.jini;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import net.jini.core.discovery.LookupLocator;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IJiniConnectorRegistrar {
+ void addLocators(String... hosts) throws MalformedURLException, ClassNotFoundException, IOException;
+
+ LookupLocator[] getLocators();
+
+ void addGroup(String... groups) throws IOException;
+
+ String[] getGroups();
+}
diff --git a/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/JiniClientSideConnector.java b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/JiniClientSideConnector.java
new file mode 100644
index 000000000..10ff1b693
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/JiniClientSideConnector.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.connection.jini;
+
+import java.io.File;
+import java.net.URI;
+import java.net.UnknownHostException;
+import java.rmi.RemoteException;
+import java.rmi.server.ExportException;
+import net.jini.core.lookup.ServiceItem;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class JiniClientSideConnector extends JiniConnector {
+ public static final String TYPE = "jini.client-end";
+ private final ServiceItem serviceItem;
+ private final IJiniConnectorLink link;
+
+ JiniClientSideConnector(ServiceItem serviceItem) {
+ super();
+ this.serviceItem = serviceItem;
+ link = (IJiniConnectorLink) getProperties().getProperty(LINK_PROPERTY);
+ }
+
+ @Override
+ public Object getService() {
+ return serviceItem.service;
+ }
+
+ @Override
+ public String getConnectorType() {
+ return TYPE;
+ }
+
+ @Override
+ public URI upload(File file) throws Exception {
+ return null;
+ }
+
+ @Override
+ public boolean ping() {
+ try {
+ return link.ping();
+ } catch (RemoteException e) {
+ return false;
+ }
+ }
+
+ @Override
+ public void init(Object service) throws UnknownHostException, ExportException {
+
+ }
+
+ @Override
+ public String getUniqueServerId() {
+ return serviceItem.serviceID.toString();
+ }
+
+}
diff --git a/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/JiniConnector.java b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/JiniConnector.java
new file mode 100644
index 000000000..276d77ede
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/JiniConnector.java
@@ -0,0 +1,152 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.connection.jini;
+
+import java.io.Serializable;
+import java.net.UnknownHostException;
+import java.rmi.Remote;
+import java.rmi.server.ExportException;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
+
+import net.jini.core.entry.Entry;
+import net.jini.export.Exporter;
+import net.jini.jeri.BasicILFactory;
+import net.jini.jeri.BasicJeriExporter;
+import net.jini.jeri.tcp.TcpServerEndpoint;
+
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.connection.service.IServicePropertyChangeListener;
+import org.eclipse.osee.framework.jdk.core.util.EnhancedProperties;
+import org.eclipse.osee.framework.jdk.core.util.Network;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public abstract class JiniConnector implements IServiceConnector {
+ protected final static String LINK_PROPERTY = "JINI_CONNECTOR_LINK";
+ private final HashMap<Object, ExportInfo> exports = new HashMap<>();
+ private final EnhancedProperties properties;
+ private final HashSet<IServicePropertyChangeListener> propertyChangeListeners =
+ new HashSet<IServicePropertyChangeListener>();
+ private boolean connected = false;
+
+ private static final class ExportInfo {
+ private final Exporter exporter;
+ private final Object exportedObject;
+
+ private ExportInfo(Exporter exporter, Object exportedObject) {
+ this.exportedObject = exportedObject;
+ this.exporter = exporter;
+ }
+ }
+
+ protected JiniConnector() {
+ this(new EnhancedProperties());
+ }
+
+ protected JiniConnector(EnhancedProperties properties) {
+ this.properties = properties;
+ }
+
+ @Override
+ public Object export(Object callback) throws ExportException {
+ try {
+ Exporter exporter = createExporter();
+ Object exportedObject = exporter.export((Remote) callback);
+ exports.put(callback, new ExportInfo(exporter, exportedObject));
+ return exportedObject;
+ } catch (UnknownHostException e) {
+ throw new ExportException("failed to export", e);
+ }
+ }
+
+ @Override
+ public void unexport(Object callback) throws Exception {
+ ExportInfo info = exports.remove(callback);
+ if (info != null) {
+ info.exporter.unexport(false);
+ }
+ }
+
+ @Override
+ public Object findExport(Object callback) {
+ ExportInfo info = exports.get(callback);
+ if (info != null) {
+ return info.exportedObject;
+ }
+ return null;
+ }
+
+ @Override
+ public void stop() throws Exception {
+ for (ExportInfo info : exports.values()) {
+ info.exporter.unexport(false);
+ }
+ exports.clear();
+ }
+
+ private Exporter createExporter() throws UnknownHostException {
+ return new BasicJeriExporter(TcpServerEndpoint.getInstance(Network.getValidIP().getHostAddress(), 0),
+ new BasicILFactory(null, null, Activator.getDefault().getExportClassLoader()), false, false);
+ }
+
+ protected Entry[] createEntries() {
+ LinkedList<Entry> entries = new LinkedList<>();
+ return entries.toArray(new Entry[entries.size()]);
+ }
+
+ @Override
+ public Serializable getProperty(String property, Serializable defaultValue) {
+ return properties.getProperty(property, defaultValue);
+ }
+
+ @Override
+ public void addPropertyChangeListener(IServicePropertyChangeListener listener) {
+ propertyChangeListeners.add(listener);
+ }
+
+ @Override
+ public void removePropertyChangeListener(IServicePropertyChangeListener listener) {
+ propertyChangeListeners.remove(listener);
+ }
+
+ @Override
+ public void setProperty(String key, Serializable value) {
+ properties.setProperty(key, value);
+ for (IServicePropertyChangeListener listener : propertyChangeListeners) {
+ listener.propertyChanged(this, key, value);
+ }
+ }
+
+ @Override
+ public EnhancedProperties getProperties() {
+ return properties;
+ }
+
+ public void entriesChanged(Entry[] entries) {
+ EnhancedProperties newProps = new EnhancedProperties();
+ for (String key : properties.differences(newProps)) {
+ for (IServicePropertyChangeListener listener : propertyChangeListeners) {
+ listener.propertyChanged(this, key, properties.getProperty(key));
+ }
+ }
+ }
+
+ public void setConnected(boolean connected){
+ this.connected = connected;
+ }
+
+ public boolean isConnected() {
+ return this.connected;
+ }
+}
diff --git a/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/JiniServiceSideConnector.java b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/JiniServiceSideConnector.java
new file mode 100644
index 000000000..22d9dd963
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/JiniServiceSideConnector.java
@@ -0,0 +1,179 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.connection.jini;
+
+import java.io.File;
+import java.io.Serializable;
+import java.net.URI;
+import java.net.UnknownHostException;
+import java.rmi.Remote;
+import java.rmi.server.ExportException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Timer;
+import java.util.logging.Level;
+import net.jini.core.entry.Entry;
+import net.jini.core.lookup.ServiceID;
+import net.jini.core.lookup.ServiceItem;
+import net.jini.core.lookup.ServiceRegistrar;
+import net.jini.core.lookup.ServiceRegistration;
+import net.jini.id.Uuid;
+import net.jini.id.UuidFactory;
+import net.jini.jeri.BasicILFactory;
+import net.jini.jeri.BasicJeriExporter;
+import net.jini.jeri.tcp.TcpServerEndpoint;
+import org.eclipse.osee.framework.jdk.core.util.EnhancedProperties;
+import org.eclipse.osee.framework.jdk.core.util.Network;
+import org.eclipse.osee.ote.connection.jini.util.LeaseRenewTask;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class JiniServiceSideConnector extends JiniConnector implements IJiniConnectorLink {
+ public static final String TYPE = "jini.service-end";
+ private final HashMap<ServiceRegistration, LeaseRenewTask> registrations =
+ new HashMap<ServiceRegistration, LeaseRenewTask>();
+ private Remote service;
+ private Remote serviceProxy;
+ private BasicJeriExporter serviceExporter;
+ private ServiceID serviceId;
+ private final Timer timer = new Timer();
+ private ServiceItem serviceItem;
+ private BasicJeriExporter linkExporter;
+ private IJiniConnectorLink exportedThis;
+ private boolean stopped = false;
+
+ public JiniServiceSideConnector() {
+ super();
+ }
+
+ @Override
+ public void init(Object service) throws UnknownHostException, ExportException {
+
+ this.service = (Remote) service;
+ serviceId = generateServiceId();
+ serviceExporter =
+ new BasicJeriExporter(TcpServerEndpoint.getInstance(Network.getValidIP().getHostAddress(), 0),
+ new BasicILFactory(null, null, Activator.getDefault().getExportClassLoader()), false, false);
+ linkExporter =
+ new BasicJeriExporter(TcpServerEndpoint.getInstance(Network.getValidIP().getHostAddress(), 0),
+ new BasicILFactory(null, null, Activator.getDefault().getExportClassLoader()), false, false);
+ serviceProxy = serviceExporter.export(this.service);
+ exportedThis = (IJiniConnectorLink) linkExporter.export(this);
+ setProperty(LINK_PROPERTY, (Serializable) exportedThis);
+ serviceItem = new ServiceItem(serviceId, serviceProxy, createEntries());
+ }
+
+ public JiniServiceSideConnector(Remote service, EnhancedProperties props) throws UnknownHostException, ExportException {
+ super(props);
+ this.service = service;
+ serviceId = generateServiceId();
+ serviceExporter =
+ new BasicJeriExporter(TcpServerEndpoint.getInstance(Network.getValidIP().getHostAddress(), 0),
+ new BasicILFactory(null, null, Activator.getDefault().getExportClassLoader()), false, false);
+ linkExporter =
+ new BasicJeriExporter(TcpServerEndpoint.getInstance(Network.getValidIP().getHostAddress(), 0),
+ new BasicILFactory(null, null, Activator.getDefault().getExportClassLoader()), false, false);
+ serviceProxy = serviceExporter.export(service);
+ exportedThis = (IJiniConnectorLink) linkExporter.export(this);
+ props.setProperty(LINK_PROPERTY, (Serializable) exportedThis);
+ serviceItem = new ServiceItem(serviceId, serviceProxy, createEntries());
+ }
+
+ @Override
+ public Remote getService() {
+ return serviceProxy;
+ }
+
+ @Override
+ public synchronized void stop() throws Exception {
+ if (stopped) {
+ return;
+ }
+ stopped = true;
+ super.stop();
+ removeAllRegistrations();
+ serviceExporter.unexport(true);
+ linkExporter.unexport(true);
+ }
+
+ /**
+ * this method will cancel all current registrations of this connector
+ */
+ synchronized void removeAllRegistrations() {
+ for (ServiceRegistration registration : registrations.keySet()) {
+ try {
+ LeaseRenewTask task = registrations.get(registration);
+ if (task != null) {
+ task.cancel();
+ }
+ } catch (Exception e) {
+ Activator.log(Level.SEVERE, "exception removing registration", e);
+ }
+ }
+ registrations.clear();
+ }
+
+ private ServiceID generateServiceId() {
+ Uuid uuid = UuidFactory.generate();
+ Long lsb = new Long(uuid.getLeastSignificantBits());
+ Long msb = new Long(uuid.getMostSignificantBits());
+ return new ServiceID(msb.longValue(), lsb.longValue());
+ }
+
+ synchronized void addRegistration(ServiceRegistration registration, ServiceRegistrar registrar) {
+ registrations.put(registration, new LeaseRenewTask(timer, registration, registrar));
+ }
+
+ ServiceItem getServiceItem() {
+ return serviceItem;
+ }
+
+ private synchronized void setAttributes(Entry[] entry) {
+ Iterator<ServiceRegistration> iter = registrations.keySet().iterator();
+ while (iter.hasNext()) {
+ ServiceRegistration registration = iter.next();
+ try {
+ registration.setAttributes(entry);
+ } catch (Exception ex) {
+ Activator.log(Level.SEVERE, "exception setting attributes", ex);
+ registrations.remove(registration);
+ }
+ }
+ }
+
+ @Override
+ public String getConnectorType() {
+ return TYPE;
+ }
+
+ @Override
+ public void setProperty(String key, Serializable value) {
+ super.setProperty(key, value);
+ setAttributes(createEntries());
+ }
+
+ @Override
+ public URI upload(File file) throws Exception {
+ return null;
+ }
+
+ @Override
+ public boolean ping() {
+ return true;
+ }
+
+ @Override
+ public String getUniqueServerId() {
+ return serviceId.toString();
+ }
+
+}
diff --git a/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/TestEntry.java b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/TestEntry.java
new file mode 100644
index 000000000..4bcc3f666
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/TestEntry.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.connection.jini;
+
+import net.jini.entry.AbstractEntry;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class TestEntry extends AbstractEntry {
+ private static final long serialVersionUID = -2239353039479522642L;
+ public final String data;
+
+ public TestEntry() {
+ data = "<none>";
+ }
+
+ public TestEntry(String data) {
+ super();
+ this.data = data;
+ }
+
+ /**
+ * @return the data
+ */
+ public String getData() {
+ return data;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/util/LeaseRenewTask.java b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/util/LeaseRenewTask.java
new file mode 100644
index 000000000..49feede69
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.jini/src/org/eclipse/osee/ote/connection/jini/util/LeaseRenewTask.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.connection.jini.util;
+
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.logging.Level;
+import net.jini.core.lease.Lease;
+import net.jini.core.lookup.ServiceRegistrar;
+import net.jini.core.lookup.ServiceRegistration;
+import org.eclipse.osee.ote.connection.jini.Activator;
+
+public class LeaseRenewTask extends TimerTask {
+ /**
+ * The amount of time before a lease expires to first attempt renewal. This amount of time should be sufficiently
+ * large to account for delays in communication (i.e. network delays), and allow for at least a few retries in the
+ * event the service is not reachable. This time is specified in milliseconds.
+ */
+ private static final long RENEWAL_TIME = 1 * 60 * 1000; // 1 minute
+
+ private final ServiceRegistration registration;
+ private volatile boolean canceled = false;
+ private final ServiceRegistrar registrar;
+
+ public LeaseRenewTask(Timer timer, ServiceRegistration registration, ServiceRegistrar registrar) {
+ this.registration = registration;
+ timer.scheduleAtFixedRate(this, 0, RENEWAL_TIME);
+ this.registrar = registrar;
+ }
+
+ @Override
+ public void run() {
+ if (canceled) {
+ return;
+ }
+ try {
+ // Renew for the maximum amount of time allowed
+ registration.getLease().renew(Lease.FOREVER);
+ } catch (Throwable ex) {
+ handleLeaseRenewException(ex);
+ try {
+ registration.getLease().renew(Lease.FOREVER);
+ } catch (Throwable ex1) {
+ handleLeaseRenewException(ex1);
+ }
+ }
+ }
+
+ private void handleLeaseRenewException(Throwable th) {
+ String host = "unknown";
+ int port = 0;
+ try {
+ host = registrar.getLocator().getHost();
+ port = registrar.getLocator().getPort();
+ } catch (Throwable th2) {
+ th2.printStackTrace();
+ }
+ System.out.printf("lookup serviceId[%s] host[%s] port[%d]\n", registrar.getServiceID().toString(), host, port);
+ Activator.log(Level.SEVERE, "error renewing lease", th);
+ }
+
+ @Override
+ public boolean cancel() {
+ canceled = true;
+ boolean result = super.cancel();
+ try {
+ System.out.println("Canceling lookup lease");
+ registration.getLease().cancel();
+ } catch (Exception ex) {
+ throw new RuntimeException("failed to cancel lease", ex);
+ }
+ return result;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.connection.service.test/.classpath b/org.eclipse.osee.ote.connection.service.test/.classpath
new file mode 100644
index 000000000..751c8f2e5
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service.test/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.ote.connection.service.test/.pmd b/org.eclipse.osee.ote.connection.service.test/.pmd
new file mode 100644
index 000000000..c7b0a9fb3
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service.test/.pmd
@@ -0,0 +1,925 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<pmd>
+ <useProjectRuleSet>false</useProjectRuleSet>
+ <ruleSetFile>.ruleset</ruleSetFile>
+ <rules>
+ <rule>
+ <name>LooseCoupling</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneMethodMustImplementCloneable</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedImports</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SignatureDeclareThrowsException</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IfStmtsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>WhileLoopsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IfElseStmtsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ForLoopsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseSingleton</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanReturns</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanExpressions</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SwitchStmtsShouldHaveDefault</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDeeplyNestedIfStmts</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidReassigningParameters</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SwitchDensity</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConstructorCallsOverridableMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AccessorClassGeneration</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalFieldCouldBeStatic</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloseResource</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonStaticInitializer</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DefaultLabelNotLastInSwitchStmt</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonCaseLabelInSwitchStatement</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>OptimizableToArrayCall</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BadComparison</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EqualsNull</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConfusingTernary</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InstantiationToGetClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IdempotentOperations</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimpleDateFormatNeedsLocale</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ImmutableField</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseLocaleWithCaseConversions</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidProtectedFieldInFinalClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AssignmentToNonFinalStatic</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingStaticMethodInNonInstantiatableClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidSynchronizedAtMethodLevel</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingBreakInSwitch</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseNotifyAllInsteadOfNotify</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidInstanceofChecksInCatchClause</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractClassWithoutAbstractMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyConditional</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CompareObjectsWithEquals</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PositionLiteralsFirstInComparisons</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryLocalBeforeReturn</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonThreadSafeSingleton</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UncommentedEmptyMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UncommentedEmptyConstructor</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidConstantsInterface</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnsynchronizedStaticDateFormatter</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PreserveStackTrace</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseCollectionIsEmpty</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassWithOnlyPrivateConstructorsShouldBeFinal</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyMethodInAbstractClassShouldBeAbstract</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SingularField</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReturnEmptyArrayRatherThanNull</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractClassWithoutAnyMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooFewBranchesForASwitchStatement</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCatchingThrowable</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SignatureDeclareThrowsException</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExceptionAsFlowControl</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCatchingNPE</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingRawExceptionTypes</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingNullPointerException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidRethrowingException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotExtendJavaLangError</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotThrowExceptionInFinally</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingNewInstanceOfSameException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedPrivateField</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedLocalVariable</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedPrivateMethod</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedFormalParameter</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MoreThanOneLogger</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LoggerIsNotStaticFinal</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SystemPrintln</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidPrintStackTrace</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDuplicateLiterals</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringInstantiation</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringToString</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InefficientStringBuffering</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryCaseChange</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseStringBufferLength</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AppendCharacterWithChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConsecutiveLiteralAppends</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseIndexOfChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InefficientEmptyStringCheck</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InsufficientStringBufferDeclaration</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessStringValueOf</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringBufferInstantiationWithChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseEqualsToCompareStrings</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidStringBufferField</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceVectorWithList</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceHashtableWithMap</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceEnumerationWithIterator</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidEnumAsIdentifier</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidAssertAsIdentifier</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IntegerInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ByteInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ShortInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LongInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseBeforeAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseAfterAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseTestAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4SuitesShouldUseSuiteAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitUseExpected</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseProperClassLoader</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MDBAndSessionBeanNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>RemoteSessionInterfaceNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LocalInterfaceSessionNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LocalHomeNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>RemoteInterfaceNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotCallSystemExit</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StaticEJBFieldShouldBeFinal</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotUseThreads</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidInstantiatingObjectsInLoops</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseArrayListInsteadOfVector</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyStartsWith</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseStringBufferForStringAppends</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseArraysAsList</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidArrayLoops</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryWrapperObjectCreation</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AddEmptyString</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyCatchBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyIfStmt</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyWhileStmt</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyTryBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyFinallyBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptySwitchStatements</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JumbledIncrementer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ForLoopShouldBeWhileLoop</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryConversionTemporary</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>OverrideBothEqualsAndHashcode</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoubleCheckedLocking</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReturnFromFinallyBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptySynchronizedBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryReturn</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyStaticInitializer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnconditionalIfStatement</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyStatementNotInLoop</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanInstantiation</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryFinalModifier</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CollapsibleIfStatements</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessOverridingMethod</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassCastExceptionWithToArray</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDecimalLiteralsInBigDecimalConstructor</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessOperationOnImmutable</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MisplacedNullCheck</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedNullCheckInEquals</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThreadGroup</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BrokenNullCheck</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BigIntegerInstantiation</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingOctalValues</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingHardCodedIP</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CheckResultSet</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidMultipleUnaryOperators</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyInitializer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodReturnsInternalArray</name>
+ <ruleset>Security Code Guidelines</ruleset>
+ </rule>
+ <rule>
+ <name>ArrayIsStoredDirectly</name>
+ <ruleset>Security Code Guidelines</ruleset>
+ </rule>
+ <rule>
+ <name>CouplingBetweenObjects</name>
+ <ruleset>Coupling Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveImports</name>
+ <ruleset>Coupling Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LooseCoupling</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DuplicateImports</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DontImportJavaLang</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedImports</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ImportFromSamePackage</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyStaticImports</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitStaticSuite</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitSpelling</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitAssertionsShouldIncludeMessage</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitTestsShouldIncludeAssert</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TestClassWithoutTestCases</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryBooleanAssertion</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertEqualsInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertSameInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertNullInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanAssertion</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NullAssignment</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedModifier</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AssignmentInOperand</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AtLeastOneConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DontImportSun</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousOctalEscape</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CallSuperInConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryParentheses</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DefaultPackage</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanInversion</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DataflowAnomalyAnalysis</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFinalLocalVariable</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingShortType</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingVolatile</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingNativeCode</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidAccessibilityAlteration</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotCallGarbageCollectionExplicitly</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodNamingConventions</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassNamingConventions</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractNaming</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDollarSigns</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodWithSameNameAsEnclosingClass</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousHashcodeMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousConstantFieldName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousEqualsMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFieldNameMatchingTypeName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFieldNameMatchingMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NoPackage</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PackageCase</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MisleadingVariableName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanGetMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NPathComplexity</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveMethodLength</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveParameterList</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveClassLength</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CyclomaticComplexity</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessivePublicCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyFields</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssMethodCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssTypeCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssConstructorCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyMethods</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyFinalizer</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeOnlyCallsSuperFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeOverloaded</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeDoesNotCallSuperFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeShouldBeProtected</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCallingFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseCorrectExceptionLogging</name>
+ <ruleset>Jakarta Commons Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ProperLogger</name>
+ <ruleset>Jakarta Commons Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingSerialVersionUID</name>
+ <ruleset>JavaBean Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ProperCloneImplementation</name>
+ <ruleset>Clone Implementation Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneThrowsCloneNotSupportedException</name>
+ <ruleset>Clone Implementation Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneMethodMustImplementCloneable</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ </rules>
+ <includeDerivedFiles>false</includeDerivedFiles>
+ <violationsAsErrors>true</violationsAsErrors>
+</pmd>
diff --git a/org.eclipse.osee.ote.connection.service.test/.project b/org.eclipse.osee.ote.connection.service.test/.project
new file mode 100644
index 000000000..6f398b297
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service.test/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ote.connection.service.test</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.connection.service.test/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.connection.service.test/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..f2b751616
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service.test/META-INF/MANIFEST.MF
@@ -0,0 +1,15 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Test Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.connection.service.test;singleton:=true
+Bundle-Version: 0.25.3.qualifier
+Bundle-Activator: org.eclipse.osee.ote.connection.service.test.Activator
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Bundle-ActivationPolicy: lazy
+Import-Package: org.eclipse.osee.connection.service,
+ org.osgi.framework,
+ org.osgi.util.tracker
+Require-Bundle: net.jini,
+ org.eclipse.osee.ote.connection.jini,
+ org.eclipse.osee.framework.jdk.core
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
diff --git a/org.eclipse.osee.ote.connection.service.test/build.properties b/org.eclipse.osee.ote.connection.service.test/build.properties
new file mode 100644
index 000000000..34d2e4d2d
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service.test/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .
diff --git a/org.eclipse.osee.ote.connection.service.test/pom.xml b/org.eclipse.osee.ote.connection.service.test/pom.xml
new file mode 100644
index 000000000..340a6091c
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service.test/pom.xml
@@ -0,0 +1,31 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.osee</groupId>
+ <artifactId>org.eclipse.osee.ote.parent</artifactId>
+ <version>0.25.3-SNAPSHOT</version>
+ <relativePath>../org.eclipse.osee.ote.parent</relativePath>
+ </parent>
+
+ <artifactId>org.eclipse.osee.ote.connection.service.test</artifactId>
+ <packaging>eclipse-plugin</packaging>
+ <name>OTE Connection Service Test (Incubation)</name>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-surefire-plugin</artifactId>
+ <version>${tycho-version}</version>
+ <configuration>
+ <testSuite>org.eclipse.osee.ote.connection.service.test</testSuite>
+ <testClass>org.eclipse.osee.ote.connection.service.test.TestJiniService</testClass>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.connection.service.test/src/org/eclipse/osee/ote/connection/service/test/Activator.java b/org.eclipse.osee.ote.connection.service.test/src/org/eclipse/osee/ote/connection/service/test/Activator.java
new file mode 100644
index 000000000..98eb83466
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service.test/src/org/eclipse/osee/ote/connection/service/test/Activator.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.connection.service.test;
+
+import java.rmi.Remote;
+import java.util.Collection;
+import java.util.Timer;
+import java.util.TimerTask;
+import org.eclipse.osee.connection.service.IConnectionService;
+import org.eclipse.osee.connection.service.IConnectorListener;
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.framework.jdk.core.util.EnhancedProperties;
+import org.eclipse.osee.ote.connection.jini.JiniServiceSideConnector;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.util.tracker.ServiceTracker;
+
+public class Activator implements BundleActivator {
+ private ServiceTracker connectionServiceTracker;
+ private static Activator instance = null;
+ private JiniServiceSideConnector testConnector;
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ instance = this;
+ connectionServiceTracker = new ServiceTracker(context, IConnectionService.class.getName(), null);
+ connectionServiceTracker.open();
+ final IConnectionService service = getConnectionService();
+ EnhancedProperties properties = new EnhancedProperties();
+ properties.setProperty("name", "Dummy Test Service");
+ testConnector = new JiniServiceSideConnector(new TestJiniService(), properties);
+ service.addConnector(testConnector);
+
+ service.addListener(new IConnectorListener() {
+
+ @Override
+ public void onConnectionServiceStopped() {
+ }
+
+ @Override
+ public void onConnectorsAdded(Collection<IServiceConnector> connectors) {
+ for (IServiceConnector connector : connectors) {
+ if (connector.getService() instanceof Remote) {
+ System.out.printf("found remote service %s. connector type=%s\n",
+ connector.getProperty("name", "N.A."), connector.getConnectorType());
+ } else {
+ System.out.println("found a non-remote service!?. connector type=" + connector.getConnectorType());
+ }
+ }
+ }
+
+ @Override
+ public void onConnectorRemoved(IServiceConnector connector) {
+ }
+
+ });
+
+ final Timer timer = new Timer();
+ timer.schedule(new TimerTask() {
+
+ @Override
+ public void run() {
+ System.out.println("connectors:");
+ for (IServiceConnector connector : service.getAllConnectors()) {
+ System.out.printf("\ttype=%s\n", connector.getConnectorType());
+ }
+ timer.cancel();
+ }
+
+ }, 10000);
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ instance = null;
+ getConnectionService().removeConnector(testConnector);
+ connectionServiceTracker.close();
+ }
+
+ public Activator getDefault() {
+ return instance;
+ }
+
+ public IConnectionService getConnectionService() {
+ return (IConnectionService) connectionServiceTracker.getService();
+ }
+}
diff --git a/org.eclipse.osee.ote.connection.service.test/src/org/eclipse/osee/ote/connection/service/test/TestJiniService.java b/org.eclipse.osee.ote.connection.service.test/src/org/eclipse/osee/ote/connection/service/test/TestJiniService.java
new file mode 100644
index 000000000..9739a2f6d
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service.test/src/org/eclipse/osee/ote/connection/service/test/TestJiniService.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.connection.service.test;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class TestJiniService implements Remote {
+
+ public void doSomething() throws RemoteException {
+ System.out.println("doing something...");
+ }
+}
diff --git a/org.eclipse.osee.ote.connection.service/.classpath b/org.eclipse.osee.ote.connection.service/.classpath
new file mode 100644
index 000000000..751c8f2e5
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.ote.connection.service/.pmd b/org.eclipse.osee.ote.connection.service/.pmd
new file mode 100644
index 000000000..c7b0a9fb3
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/.pmd
@@ -0,0 +1,925 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<pmd>
+ <useProjectRuleSet>false</useProjectRuleSet>
+ <ruleSetFile>.ruleset</ruleSetFile>
+ <rules>
+ <rule>
+ <name>LooseCoupling</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneMethodMustImplementCloneable</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedImports</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SignatureDeclareThrowsException</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IfStmtsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>WhileLoopsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IfElseStmtsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ForLoopsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseSingleton</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanReturns</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanExpressions</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SwitchStmtsShouldHaveDefault</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDeeplyNestedIfStmts</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidReassigningParameters</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SwitchDensity</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConstructorCallsOverridableMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AccessorClassGeneration</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalFieldCouldBeStatic</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloseResource</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonStaticInitializer</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DefaultLabelNotLastInSwitchStmt</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonCaseLabelInSwitchStatement</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>OptimizableToArrayCall</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BadComparison</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EqualsNull</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConfusingTernary</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InstantiationToGetClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IdempotentOperations</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimpleDateFormatNeedsLocale</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ImmutableField</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseLocaleWithCaseConversions</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidProtectedFieldInFinalClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AssignmentToNonFinalStatic</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingStaticMethodInNonInstantiatableClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidSynchronizedAtMethodLevel</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingBreakInSwitch</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseNotifyAllInsteadOfNotify</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidInstanceofChecksInCatchClause</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractClassWithoutAbstractMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyConditional</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CompareObjectsWithEquals</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PositionLiteralsFirstInComparisons</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryLocalBeforeReturn</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonThreadSafeSingleton</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UncommentedEmptyMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UncommentedEmptyConstructor</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidConstantsInterface</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnsynchronizedStaticDateFormatter</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PreserveStackTrace</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseCollectionIsEmpty</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassWithOnlyPrivateConstructorsShouldBeFinal</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyMethodInAbstractClassShouldBeAbstract</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SingularField</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReturnEmptyArrayRatherThanNull</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractClassWithoutAnyMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooFewBranchesForASwitchStatement</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCatchingThrowable</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SignatureDeclareThrowsException</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExceptionAsFlowControl</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCatchingNPE</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingRawExceptionTypes</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingNullPointerException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidRethrowingException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotExtendJavaLangError</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotThrowExceptionInFinally</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingNewInstanceOfSameException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedPrivateField</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedLocalVariable</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedPrivateMethod</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedFormalParameter</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MoreThanOneLogger</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LoggerIsNotStaticFinal</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SystemPrintln</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidPrintStackTrace</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDuplicateLiterals</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringInstantiation</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringToString</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InefficientStringBuffering</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryCaseChange</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseStringBufferLength</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AppendCharacterWithChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConsecutiveLiteralAppends</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseIndexOfChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InefficientEmptyStringCheck</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InsufficientStringBufferDeclaration</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessStringValueOf</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringBufferInstantiationWithChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseEqualsToCompareStrings</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidStringBufferField</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceVectorWithList</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceHashtableWithMap</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceEnumerationWithIterator</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidEnumAsIdentifier</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidAssertAsIdentifier</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IntegerInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ByteInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ShortInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LongInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseBeforeAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseAfterAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseTestAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4SuitesShouldUseSuiteAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitUseExpected</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseProperClassLoader</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MDBAndSessionBeanNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>RemoteSessionInterfaceNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LocalInterfaceSessionNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LocalHomeNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>RemoteInterfaceNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotCallSystemExit</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StaticEJBFieldShouldBeFinal</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotUseThreads</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidInstantiatingObjectsInLoops</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseArrayListInsteadOfVector</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyStartsWith</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseStringBufferForStringAppends</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseArraysAsList</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidArrayLoops</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryWrapperObjectCreation</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AddEmptyString</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyCatchBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyIfStmt</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyWhileStmt</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyTryBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyFinallyBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptySwitchStatements</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JumbledIncrementer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ForLoopShouldBeWhileLoop</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryConversionTemporary</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>OverrideBothEqualsAndHashcode</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoubleCheckedLocking</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReturnFromFinallyBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptySynchronizedBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryReturn</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyStaticInitializer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnconditionalIfStatement</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyStatementNotInLoop</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanInstantiation</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryFinalModifier</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CollapsibleIfStatements</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessOverridingMethod</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassCastExceptionWithToArray</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDecimalLiteralsInBigDecimalConstructor</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessOperationOnImmutable</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MisplacedNullCheck</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedNullCheckInEquals</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThreadGroup</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BrokenNullCheck</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BigIntegerInstantiation</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingOctalValues</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingHardCodedIP</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CheckResultSet</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidMultipleUnaryOperators</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyInitializer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodReturnsInternalArray</name>
+ <ruleset>Security Code Guidelines</ruleset>
+ </rule>
+ <rule>
+ <name>ArrayIsStoredDirectly</name>
+ <ruleset>Security Code Guidelines</ruleset>
+ </rule>
+ <rule>
+ <name>CouplingBetweenObjects</name>
+ <ruleset>Coupling Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveImports</name>
+ <ruleset>Coupling Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LooseCoupling</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DuplicateImports</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DontImportJavaLang</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedImports</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ImportFromSamePackage</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyStaticImports</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitStaticSuite</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitSpelling</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitAssertionsShouldIncludeMessage</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitTestsShouldIncludeAssert</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TestClassWithoutTestCases</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryBooleanAssertion</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertEqualsInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertSameInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertNullInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanAssertion</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NullAssignment</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedModifier</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AssignmentInOperand</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AtLeastOneConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DontImportSun</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousOctalEscape</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CallSuperInConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryParentheses</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DefaultPackage</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanInversion</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DataflowAnomalyAnalysis</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFinalLocalVariable</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingShortType</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingVolatile</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingNativeCode</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidAccessibilityAlteration</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotCallGarbageCollectionExplicitly</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodNamingConventions</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassNamingConventions</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractNaming</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDollarSigns</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodWithSameNameAsEnclosingClass</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousHashcodeMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousConstantFieldName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousEqualsMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFieldNameMatchingTypeName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFieldNameMatchingMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NoPackage</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PackageCase</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MisleadingVariableName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanGetMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NPathComplexity</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveMethodLength</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveParameterList</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveClassLength</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CyclomaticComplexity</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessivePublicCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyFields</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssMethodCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssTypeCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssConstructorCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyMethods</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyFinalizer</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeOnlyCallsSuperFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeOverloaded</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeDoesNotCallSuperFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeShouldBeProtected</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCallingFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseCorrectExceptionLogging</name>
+ <ruleset>Jakarta Commons Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ProperLogger</name>
+ <ruleset>Jakarta Commons Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingSerialVersionUID</name>
+ <ruleset>JavaBean Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ProperCloneImplementation</name>
+ <ruleset>Clone Implementation Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneThrowsCloneNotSupportedException</name>
+ <ruleset>Clone Implementation Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneMethodMustImplementCloneable</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ </rules>
+ <includeDerivedFiles>false</includeDerivedFiles>
+ <violationsAsErrors>true</violationsAsErrors>
+</pmd>
diff --git a/org.eclipse.osee.ote.connection.service/.project b/org.eclipse.osee.ote.connection.service/.project
new file mode 100644
index 000000000..dd83e6aa5
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ote.connection.service</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.connection.service/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.connection.service/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..7f5f5ffb1
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/META-INF/MANIFEST.MF
@@ -0,0 +1,15 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Service Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.connection.service;singleton:=true
+Bundle-Version: 0.25.3.qualifier
+Bundle-Activator: org.eclipse.osee.connection.service.internal.Activator
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Bundle-ActivationPolicy: lazy
+Import-Package: org.eclipse.osee.framework.jdk.core.util,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.osee.framework.plugin.core.util,
+ org.osgi.framework,
+ org.osgi.util.tracker
+Export-Package: org.eclipse.osee.connection.service
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
diff --git a/org.eclipse.osee.ote.connection.service/build.properties b/org.eclipse.osee.ote.connection.service/build.properties
new file mode 100644
index 000000000..e9863e281
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml
diff --git a/org.eclipse.osee.ote.connection.service/plugin.xml b/org.eclipse.osee.ote.connection.service/plugin.xml
new file mode 100644
index 000000000..a652d47ca
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/plugin.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+ <extension-point id="org.eclipse.osee.connection.service.ext" name="Connection Service Extension" schema="schema/org.eclipse.osee.connection.service.ext.exsd"/>
+
+</plugin>
diff --git a/org.eclipse.osee.ote.connection.service/pom.xml b/org.eclipse.osee.ote.connection.service/pom.xml
new file mode 100644
index 000000000..541b996cf
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/pom.xml
@@ -0,0 +1,35 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.osee</groupId>
+ <artifactId>org.eclipse.osee.ote.parent</artifactId>
+ <version>0.25.3-SNAPSHOT</version>
+ <relativePath>../org.eclipse.osee.ote.parent</relativePath>
+ </parent>
+
+ <artifactId>org.eclipse.osee.ote.connection.service</artifactId>
+ <packaging>eclipse-plugin</packaging>
+ <name>OTE Connection Service (Incubation)</name>
+
+ <build>
+ <!-- workaround for https://issues.sonatype.org/browse/TYCHO-168 -->
+ <resources>
+ <resource>
+ <directory>src</directory>
+ <excludes>
+ <exclude>**/*.java</exclude>
+ </excludes>
+ </resource>
+ </resources>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-source-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.connection.service/schema/org.eclipse.osee.connection.service.ext.exsd b/org.eclipse.osee.ote.connection.service/schema/org.eclipse.osee.connection.service.ext.exsd
new file mode 100644
index 000000000..73f50562b
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/schema/org.eclipse.osee.connection.service.ext.exsd
@@ -0,0 +1,102 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.ote.connection.service" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appinfo>
+ <meta.schema plugin="org.eclipse.osee.ote.connection.service" id="org.eclipse.osee.connection.service.ext" name="Connection Service Extension"/>
+ </appinfo>
+ <documentation>
+ [Enter description of this extension point.]
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appinfo>
+ <meta.element />
+ </appinfo>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="ConnectorContribution"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appinfo>
+ <meta.attribute translatable="true"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="ConnectorContribution">
+ <complexType>
+ <attribute name="className" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appinfo>
+ <meta.attribute kind="java" basedOn=":org.eclipse.osee.connection.service.IConnectorContributor"/>
+ </appinfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="since"/>
+ </appinfo>
+ <documentation>
+ [Enter the first release in which this extension point appears.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="examples"/>
+ </appinfo>
+ <documentation>
+ [Enter extension point usage example here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="apiinfo"/>
+ </appinfo>
+ <documentation>
+ [Enter API information here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appinfo>
+ <meta.section type="implementation"/>
+ </appinfo>
+ <documentation>
+ [Enter information about supplied implementation of this extension point.]
+ </documentation>
+ </annotation>
+
+
+</schema>
diff --git a/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IConnectionService.java b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IConnectionService.java
new file mode 100644
index 000000000..310b8da61
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IConnectionService.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.connection.service;
+
+import java.util.Collection;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IConnectionService {
+
+ /**
+ * finds all currently existing connectors
+ */
+ Collection<IServiceConnector> getAllConnectors();
+
+ /**
+ * finds all available connectors that are accepted by all filters in the filter chain
+ */
+ Collection<IServiceConnector> findConnectors(IConnectorFilter[] filterChain);
+
+ /**
+ * registers an listener object for notification of connector events. Note that the listener object's
+ * {@link IConnectorListener#onConnectorsAdded(Collection)} will be called immediately for each active connector.
+ */
+ void addListener(IConnectorListener listener);
+
+ void removeListener(IConnectorListener listener);
+
+ void addConnector(IServiceConnector connector);
+
+ void addConnectors(Collection<IServiceConnector> connectors);
+
+ void removeConnector(IServiceConnector connector) throws Exception;
+
+ boolean isStopped();
+}
diff --git a/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IConnectorContributor.java b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IConnectorContributor.java
new file mode 100644
index 000000000..32d2f63d5
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IConnectorContributor.java
@@ -0,0 +1,16 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.connection.service;
+
+public interface IConnectorContributor {
+
+ void init() throws Exception;
+}
diff --git a/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IConnectorFilter.java b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IConnectorFilter.java
new file mode 100644
index 000000000..bab00bbb9
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IConnectorFilter.java
@@ -0,0 +1,18 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.connection.service;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IConnectorFilter {
+ public boolean accept(IServiceConnector connector);
+}
diff --git a/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IConnectorListener.java b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IConnectorListener.java
new file mode 100644
index 000000000..8b4c185f6
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IConnectorListener.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.connection.service;
+
+import java.util.Collection;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IConnectorListener {
+
+ void onConnectorsAdded(Collection<IServiceConnector> connectors);
+
+ void onConnectorRemoved(IServiceConnector connector);
+
+ /**
+ * this method will be called when the connect service has been commanded to stop but before it is actually stopped.
+ * this gives clients a chance to cleanup however, clients should not call any methods on the service.
+ */
+ void onConnectionServiceStopped();
+}
diff --git a/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IFileKey.java b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IFileKey.java
new file mode 100644
index 000000000..0d2d5a85f
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IFileKey.java
@@ -0,0 +1,18 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.connection.service;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IFileKey {
+
+}
diff --git a/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IServiceConnector.java b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IServiceConnector.java
new file mode 100644
index 000000000..f74ab3ba4
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IServiceConnector.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.connection.service;
+
+import java.io.File;
+import java.io.Serializable;
+import java.net.URI;
+import java.net.UnknownHostException;
+import java.rmi.server.ExportException;
+import org.eclipse.osee.framework.jdk.core.util.EnhancedProperties;
+
+/**
+ * Provides a communication pipe to a service.
+ *
+ * @author Ken J. Aguilar
+ */
+public interface IServiceConnector {
+
+ String getConnectorType();
+
+ /**
+ * gets the service provided by this connector
+ */
+ Object getService();
+
+ void setProperty(String key, Serializable value);
+
+ Serializable getProperty(String property, Serializable defaultValue);
+
+ void stop() throws Exception;
+
+ /**
+ * makes the callback accessible by this connector's service
+ */
+ Object export(Object callback) throws ExportException;
+
+ void init(Object service) throws UnknownHostException, ExportException;
+
+ /**
+ * finds the matching exported representation of supplied object
+ */
+ Object findExport(Object callback);
+
+ void unexport(Object callback) throws Exception;
+
+ void addPropertyChangeListener(IServicePropertyChangeListener listener);
+
+ void removePropertyChangeListener(IServicePropertyChangeListener listener);
+
+ /**
+ * uploads a file to a service and creates an {@link URI} that the service can access.
+ */
+ URI upload(File file) throws Exception;
+
+ boolean ping();
+
+ EnhancedProperties getProperties();
+
+ public String getUniqueServerId();
+
+ void setConnected(boolean b);
+ boolean isConnected();
+}
diff --git a/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IServicePropertyChangeListener.java b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IServicePropertyChangeListener.java
new file mode 100644
index 000000000..7200b1b15
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/IServicePropertyChangeListener.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.connection.service;
+
+import java.io.Serializable;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IServicePropertyChangeListener {
+ void propertyChanged(IServiceConnector connector, String key, Serializable value);
+}
diff --git a/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/LocalConnector.java b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/LocalConnector.java
new file mode 100644
index 000000000..bf81d7f02
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/LocalConnector.java
@@ -0,0 +1,131 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.connection.service;
+
+import java.io.File;
+import java.io.Serializable;
+import java.net.URI;
+import java.rmi.server.ExportException;
+import java.util.HashSet;
+
+import org.eclipse.osee.framework.jdk.core.util.EnhancedProperties;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class LocalConnector implements IServiceConnector {
+ public static final String TYPE = "local";
+ private Object service;
+ private final EnhancedProperties properties;
+ private String id;
+
+ private final HashSet<IServicePropertyChangeListener> propertyChangeListeners =
+ new HashSet<IServicePropertyChangeListener>();
+ private boolean connected = false;
+
+ public LocalConnector() {
+ this(null, "", new EnhancedProperties());
+ }
+
+ @Override
+ public void init(Object service) {
+ this.service = service;
+ }
+
+ public LocalConnector(Object service, String id, EnhancedProperties properties) {
+ this.service = service;
+ this.properties = properties;
+ }
+
+ @Override
+ public Object getService() {
+ return service;
+ }
+
+ @Override
+ public void stop() {
+ }
+
+ @Override
+ public String getConnectorType() {
+ return TYPE;
+ }
+
+ @Override
+ public void setProperty(String key, Serializable value) {
+ properties.setProperty(key, value);
+ for (IServicePropertyChangeListener listener : propertyChangeListeners) {
+ listener.propertyChanged(this, key, value);
+ }
+
+ }
+
+ @Override
+ public Serializable getProperty(String property, Serializable defaultValue) {
+ return properties.getProperty(property, defaultValue);
+ }
+
+ @Override
+ public Object export(Object callback) throws ExportException {
+ return callback;
+ }
+
+ @Override
+ public void unexport(Object callback) throws Exception {
+ }
+
+ @Override
+ public Object findExport(Object callback) {
+ return callback;
+ }
+
+ @Override
+ public void addPropertyChangeListener(IServicePropertyChangeListener listener) {
+ propertyChangeListeners.add(listener);
+ }
+
+ @Override
+ public void removePropertyChangeListener(IServicePropertyChangeListener listener) {
+ propertyChangeListeners.remove(listener);
+ }
+
+ @Override
+ public URI upload(File file) throws Exception {
+ return file.toURI();
+ }
+
+ @Override
+ public boolean ping() {
+ return true;
+ }
+
+ @Override
+ public EnhancedProperties getProperties() {
+ return properties;
+ }
+
+ @Override
+ public String getUniqueServerId() {
+ if(properties == null){
+ return id;
+ } else {
+ return (String)properties.getProperty("id", id);
+ }
+ }
+
+ public void setConnected(boolean connected){
+ this.connected = connected;
+ }
+
+ public boolean isConnected() {
+ return this.connected;
+ }
+}
diff --git a/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/LocalFileKey.java b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/LocalFileKey.java
new file mode 100644
index 000000000..bfe1b1b52
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/LocalFileKey.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.connection.service;
+
+import java.io.File;
+
+/**
+ * @author Ken J. Aguilar
+ */
+class LocalFileKey implements IFileKey {
+
+ private final File file;
+
+ LocalFileKey(File file) {
+ this.file = file;
+ }
+
+ File getFile() {
+ return file;
+ }
+}
diff --git a/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/internal/Activator.java b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/internal/Activator.java
new file mode 100644
index 000000000..0a5e88434
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/internal/Activator.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.connection.service.internal;
+
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.osee.connection.service.IConnectionService;
+import org.eclipse.osee.connection.service.IConnectorContributor;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.ExtensionDefinedObjects;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceRegistration;
+
+public class Activator implements BundleActivator {
+
+ private ConnectionServiceImpl service;
+ private ServiceRegistration registration;
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ service = new ConnectionServiceImpl();
+
+ // register the service
+ registration = context.registerService(IConnectionService.class.getName(), service, null);
+
+ // create a tracker and track the service
+
+ ExtensionDefinedObjects<IConnectorContributor> definedObjects =
+ new ExtensionDefinedObjects<IConnectorContributor>("org.eclipse.osee.connection.service.ext",
+ "ConnectorContribution", "className");
+ try {
+ List<IConnectorContributor> contributors = definedObjects.getObjects();
+ for (IConnectorContributor contributor : contributors) {
+ try {
+ contributor.init();
+ } catch (Exception e) {
+ log(Level.SEVERE, "exception initializing connector contributor", e);
+ }
+ }
+ } catch (Exception ex) {
+ log(Level.SEVERE, "failed to process OTE runtime library provider extensions", ex);
+ }
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ service.stop();
+ registration.unregister();
+ service = null;
+ }
+
+ public static void log(Level level, String message, Throwable t) {
+ OseeLog.log(Activator.class, level, message, t);
+ }
+
+ public static void log(Level level, String message) {
+ log(level, message, null);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/internal/ConnectionServiceImpl.java b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/internal/ConnectionServiceImpl.java
new file mode 100644
index 000000000..bb6c43d40
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/internal/ConnectionServiceImpl.java
@@ -0,0 +1,115 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.connection.service.internal;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.osee.connection.service.IConnectionService;
+import org.eclipse.osee.connection.service.IConnectorFilter;
+import org.eclipse.osee.connection.service.IConnectorListener;
+import org.eclipse.osee.connection.service.IServiceConnector;
+
+class ConnectionServiceImpl implements IConnectionService {
+
+ private final HashSet<IServiceConnector> connectors = new HashSet<>();
+ private final EventNotifier eventNotifier = new EventNotifier();
+
+ private boolean isStopped = false;
+
+ @Override
+ public void addConnector(IServiceConnector connector) {
+ addConnectors(Collections.singletonList(connector));
+ }
+
+ @Override
+ public synchronized void addConnectors(Collection<IServiceConnector> connectors) {
+ checkState();
+ this.connectors.addAll(connectors);
+ eventNotifier.notifyConnectorsAdded(connectors);
+ }
+
+ @Override
+ public synchronized void addListener(IConnectorListener listener) {
+ checkState();
+ eventNotifier.addListener(listener);
+ listener.onConnectorsAdded(connectors);
+ }
+
+ @Override
+ public synchronized List<IServiceConnector> findConnectors(IConnectorFilter[] filterChain) {
+ checkState();
+ ArrayList<IServiceConnector> matchingConnectors = new ArrayList<>();
+ for (IServiceConnector connector : connectors) {
+ boolean accepted = true;
+ for (IConnectorFilter filter : filterChain) {
+ if (!filter.accept(connector)) {
+ accepted = false;
+ break;
+ }
+ }
+ if (accepted) {
+ matchingConnectors.add(connector);
+ }
+ }
+ return matchingConnectors;
+ }
+
+ @Override
+ public synchronized Collection<IServiceConnector> getAllConnectors() {
+ checkState();
+ return connectors;
+ }
+
+ @Override
+ public synchronized void removeConnector(IServiceConnector connector) throws Exception {
+ checkState();
+ if (connectors.remove(connector)) {
+ eventNotifier.notifyConnectorRemoved(connector);
+ connector.stop();
+ }
+
+ }
+
+ @Override
+ public synchronized void removeListener(IConnectorListener listener) {
+ checkState();
+ eventNotifier.removeListener(listener);
+ }
+
+ void stop() {
+ isStopped = true;
+ eventNotifier.notifyServiceStopped();
+ for (IServiceConnector connector : connectors) {
+ try {
+ connector.stop();
+ } catch (Exception ex) {
+ Activator.log(Level.SEVERE, "Exception notifying listener of service stop", ex);
+ }
+ }
+ connectors.clear();
+ }
+
+ private void checkState() throws IllegalStateException {
+ if (isStopped) {
+ throw new IllegalStateException("service has been stopped");
+ }
+ }
+
+ @Override
+ public boolean isStopped() {
+ return isStopped;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/internal/EventNotifier.java b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/internal/EventNotifier.java
new file mode 100644
index 000000000..474d578e4
--- /dev/null
+++ b/org.eclipse.osee.ote.connection.service/src/org/eclipse/osee/connection/service/internal/EventNotifier.java
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.connection.service.internal;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.logging.Level;
+import org.eclipse.osee.connection.service.IConnectorListener;
+import org.eclipse.osee.connection.service.IServiceConnector;
+
+public class EventNotifier {
+
+ private final ExecutorService executorService = Executors.newCachedThreadPool();
+
+ private final CopyOnWriteArrayList<IConnectorListener> connectorListener =
+ new CopyOnWriteArrayList<IConnectorListener>();
+
+ void notifyConnectorsAdded(final Collection<IServiceConnector> connectors) {
+ executorService.submit(new Runnable() {
+ // copy the collection of new connectors
+ final ArrayList<IServiceConnector> newConnectors = new ArrayList<>(connectors);
+
+ @Override
+ public void run() {
+ for (IConnectorListener listener : connectorListener) {
+ try {
+ listener.onConnectorsAdded(newConnectors);
+ } catch (Exception e) {
+ Activator.log(Level.SEVERE, "Error processing listeners for connector added event", e);
+ }
+ }
+ }
+ });
+
+ }
+
+ void notifyConnectorRemoved(final IServiceConnector connector) {
+ executorService.submit(new Runnable() {
+
+ @Override
+ public void run() {
+ for (IConnectorListener listener : connectorListener) {
+ try {
+ listener.onConnectorRemoved(connector);
+ } catch (Exception e) {
+ Activator.log(Level.SEVERE, "Error processing listeners for connector remove event", e);
+ }
+ }
+ }
+
+ });
+
+ }
+
+ void notifyServiceStopped() {
+ for (IConnectorListener listener : connectorListener) {
+ listener.onConnectionServiceStopped();
+ }
+ }
+
+ void addListener(IConnectorListener listener) {
+ connectorListener.add(listener);
+ }
+
+ void removeListener(IConnectorListener listener) {
+ connectorListener.remove(listener);
+ }
+}
diff --git a/org.eclipse.osee.ote.container/.classpath b/org.eclipse.osee.ote.container/.classpath
new file mode 100644
index 000000000..1fa3e6803
--- /dev/null
+++ b/org.eclipse.osee.ote.container/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.ote.container/.pmd b/org.eclipse.osee.ote.container/.pmd
new file mode 100644
index 000000000..c7b0a9fb3
--- /dev/null
+++ b/org.eclipse.osee.ote.container/.pmd
@@ -0,0 +1,925 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<pmd>
+ <useProjectRuleSet>false</useProjectRuleSet>
+ <ruleSetFile>.ruleset</ruleSetFile>
+ <rules>
+ <rule>
+ <name>LooseCoupling</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneMethodMustImplementCloneable</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedImports</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SignatureDeclareThrowsException</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IfStmtsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>WhileLoopsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IfElseStmtsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ForLoopsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseSingleton</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanReturns</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanExpressions</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SwitchStmtsShouldHaveDefault</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDeeplyNestedIfStmts</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidReassigningParameters</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SwitchDensity</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConstructorCallsOverridableMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AccessorClassGeneration</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalFieldCouldBeStatic</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloseResource</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonStaticInitializer</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DefaultLabelNotLastInSwitchStmt</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonCaseLabelInSwitchStatement</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>OptimizableToArrayCall</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BadComparison</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EqualsNull</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConfusingTernary</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InstantiationToGetClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IdempotentOperations</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimpleDateFormatNeedsLocale</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ImmutableField</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseLocaleWithCaseConversions</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidProtectedFieldInFinalClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AssignmentToNonFinalStatic</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingStaticMethodInNonInstantiatableClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidSynchronizedAtMethodLevel</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingBreakInSwitch</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseNotifyAllInsteadOfNotify</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidInstanceofChecksInCatchClause</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractClassWithoutAbstractMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyConditional</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CompareObjectsWithEquals</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PositionLiteralsFirstInComparisons</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryLocalBeforeReturn</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonThreadSafeSingleton</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UncommentedEmptyMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UncommentedEmptyConstructor</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidConstantsInterface</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnsynchronizedStaticDateFormatter</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PreserveStackTrace</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseCollectionIsEmpty</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassWithOnlyPrivateConstructorsShouldBeFinal</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyMethodInAbstractClassShouldBeAbstract</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SingularField</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReturnEmptyArrayRatherThanNull</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractClassWithoutAnyMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooFewBranchesForASwitchStatement</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCatchingThrowable</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SignatureDeclareThrowsException</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExceptionAsFlowControl</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCatchingNPE</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingRawExceptionTypes</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingNullPointerException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidRethrowingException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotExtendJavaLangError</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotThrowExceptionInFinally</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingNewInstanceOfSameException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedPrivateField</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedLocalVariable</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedPrivateMethod</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedFormalParameter</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MoreThanOneLogger</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LoggerIsNotStaticFinal</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SystemPrintln</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidPrintStackTrace</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDuplicateLiterals</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringInstantiation</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringToString</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InefficientStringBuffering</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryCaseChange</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseStringBufferLength</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AppendCharacterWithChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConsecutiveLiteralAppends</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseIndexOfChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InefficientEmptyStringCheck</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InsufficientStringBufferDeclaration</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessStringValueOf</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringBufferInstantiationWithChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseEqualsToCompareStrings</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidStringBufferField</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceVectorWithList</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceHashtableWithMap</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceEnumerationWithIterator</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidEnumAsIdentifier</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidAssertAsIdentifier</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IntegerInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ByteInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ShortInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LongInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseBeforeAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseAfterAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseTestAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4SuitesShouldUseSuiteAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitUseExpected</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseProperClassLoader</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MDBAndSessionBeanNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>RemoteSessionInterfaceNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LocalInterfaceSessionNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LocalHomeNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>RemoteInterfaceNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotCallSystemExit</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StaticEJBFieldShouldBeFinal</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotUseThreads</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidInstantiatingObjectsInLoops</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseArrayListInsteadOfVector</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyStartsWith</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseStringBufferForStringAppends</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseArraysAsList</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidArrayLoops</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryWrapperObjectCreation</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AddEmptyString</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyCatchBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyIfStmt</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyWhileStmt</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyTryBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyFinallyBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptySwitchStatements</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JumbledIncrementer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ForLoopShouldBeWhileLoop</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryConversionTemporary</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>OverrideBothEqualsAndHashcode</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoubleCheckedLocking</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReturnFromFinallyBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptySynchronizedBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryReturn</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyStaticInitializer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnconditionalIfStatement</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyStatementNotInLoop</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanInstantiation</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryFinalModifier</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CollapsibleIfStatements</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessOverridingMethod</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassCastExceptionWithToArray</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDecimalLiteralsInBigDecimalConstructor</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessOperationOnImmutable</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MisplacedNullCheck</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedNullCheckInEquals</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThreadGroup</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BrokenNullCheck</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BigIntegerInstantiation</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingOctalValues</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingHardCodedIP</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CheckResultSet</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidMultipleUnaryOperators</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyInitializer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodReturnsInternalArray</name>
+ <ruleset>Security Code Guidelines</ruleset>
+ </rule>
+ <rule>
+ <name>ArrayIsStoredDirectly</name>
+ <ruleset>Security Code Guidelines</ruleset>
+ </rule>
+ <rule>
+ <name>CouplingBetweenObjects</name>
+ <ruleset>Coupling Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveImports</name>
+ <ruleset>Coupling Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LooseCoupling</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DuplicateImports</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DontImportJavaLang</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedImports</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ImportFromSamePackage</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyStaticImports</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitStaticSuite</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitSpelling</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitAssertionsShouldIncludeMessage</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitTestsShouldIncludeAssert</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TestClassWithoutTestCases</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryBooleanAssertion</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertEqualsInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertSameInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertNullInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanAssertion</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NullAssignment</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedModifier</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AssignmentInOperand</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AtLeastOneConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DontImportSun</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousOctalEscape</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CallSuperInConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryParentheses</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DefaultPackage</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanInversion</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DataflowAnomalyAnalysis</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFinalLocalVariable</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingShortType</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingVolatile</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingNativeCode</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidAccessibilityAlteration</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotCallGarbageCollectionExplicitly</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodNamingConventions</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassNamingConventions</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractNaming</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDollarSigns</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodWithSameNameAsEnclosingClass</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousHashcodeMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousConstantFieldName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousEqualsMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFieldNameMatchingTypeName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFieldNameMatchingMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NoPackage</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PackageCase</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MisleadingVariableName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanGetMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NPathComplexity</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveMethodLength</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveParameterList</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveClassLength</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CyclomaticComplexity</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessivePublicCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyFields</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssMethodCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssTypeCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssConstructorCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyMethods</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyFinalizer</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeOnlyCallsSuperFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeOverloaded</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeDoesNotCallSuperFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeShouldBeProtected</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCallingFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseCorrectExceptionLogging</name>
+ <ruleset>Jakarta Commons Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ProperLogger</name>
+ <ruleset>Jakarta Commons Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingSerialVersionUID</name>
+ <ruleset>JavaBean Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ProperCloneImplementation</name>
+ <ruleset>Clone Implementation Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneThrowsCloneNotSupportedException</name>
+ <ruleset>Clone Implementation Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneMethodMustImplementCloneable</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ </rules>
+ <includeDerivedFiles>false</includeDerivedFiles>
+ <violationsAsErrors>true</violationsAsErrors>
+</pmd>
diff --git a/org.eclipse.osee.ote.container/.project b/org.eclipse.osee.ote.container/.project
new file mode 100644
index 000000000..c7196c9c5
--- /dev/null
+++ b/org.eclipse.osee.ote.container/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ote.container</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.container/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.container/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..522e97f3c
--- /dev/null
+++ b/org.eclipse.osee.ote.container/META-INF/MANIFEST.MF
@@ -0,0 +1,19 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OTE Classpath Container
+Bundle-SymbolicName: org.eclipse.osee.ote.container;singleton:=true
+Bundle-Version: 0.25.3.qualifier
+Bundle-Activator: org.eclipse.osee.ote.container.OteContainerActivator
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.core.resources,
+ org.eclipse.jdt,
+ org.eclipse.jdt.ui,
+ org.eclipse.jdt.core,
+ org.eclipse.osee.ote.runtimeManager,
+ org.eclipse.osee.framework.jdk.core,
+ org.eclipse.osee.ote.core
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-ActivationPolicy: lazy
+Import-Package: org.eclipse.osee.framework.ui.workspacebundleloader
+Bundle-Vendor: Eclipse Open System Engineering Environment
diff --git a/org.eclipse.osee.ote.container/build.properties b/org.eclipse.osee.ote.container/build.properties
new file mode 100644
index 000000000..e9863e281
--- /dev/null
+++ b/org.eclipse.osee.ote.container/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml
diff --git a/org.eclipse.osee.ote.container/plugin.xml b/org.eclipse.osee.ote.container/plugin.xml
new file mode 100644
index 000000000..d428fe62c
--- /dev/null
+++ b/org.eclipse.osee.ote.container/plugin.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+ <extension
+ point="org.eclipse.jdt.core.classpathContainerInitializer">
+ <classpathContainerInitializer
+ class="org.eclipse.osee.ote.container.OteClasspathContainerInitializer"
+ id="OTE Classpath Container from the extension point">
+ </classpathContainerInitializer>
+ </extension>
+ <extension
+ point="org.eclipse.jdt.ui.classpathContainerPage">
+ <classpathContainerPage
+ class="org.eclipse.osee.ote.container.OteContainerPage"
+ id="org.eclipse.osee.ote.container.classpathContainerPage"
+ name="OTE Classpath Container please use this">
+ </classpathContainerPage>
+ </extension>
+
+</plugin>
diff --git a/org.eclipse.osee.ote.container/pom.xml b/org.eclipse.osee.ote.container/pom.xml
new file mode 100644
index 000000000..3871f881d
--- /dev/null
+++ b/org.eclipse.osee.ote.container/pom.xml
@@ -0,0 +1,17 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.osee</groupId>
+ <artifactId>org.eclipse.osee.ote.parent</artifactId>
+ <version>0.25.3-SNAPSHOT</version>
+ <relativePath>../org.eclipse.osee.ote.parent</relativePath>
+ </parent>
+
+ <artifactId>org.eclipse.osee.ote.container</artifactId>
+ <packaging>eclipse-plugin</packaging>
+ <name>OTE Container (Incubation)</name>
+
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/IUserLibListener.java b/org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/IUserLibListener.java
new file mode 100644
index 000000000..3ec0a3800
--- /dev/null
+++ b/org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/IUserLibListener.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.container;
+
+/**
+ * @author Michael P. Masterson
+ */
+public interface IUserLibListener {
+
+ public void libraryChanged();
+
+}
diff --git a/org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/JarChangeResourceListener.java b/org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/JarChangeResourceListener.java
new file mode 100644
index 000000000..410c02b6d
--- /dev/null
+++ b/org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/JarChangeResourceListener.java
@@ -0,0 +1,158 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.container;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectNature;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceChangeListener;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.osee.framework.ui.workspacebundleloader.JarCollectionNature;
+
+/**
+ * Handler for IResourceChangeEvent.POST_CHANGE and IResourceChangeEvent.PRE_CLOSE events for projects with a given
+ * nature ID that extends JarCollectionNature. POST_CHANGE events against the jars in projects with the nature, and
+ * close events on the projects with the nature are detected and offered to an IJarChangeListener.
+ *
+ * @author Robert A. Fisher
+ */
+public class JarChangeResourceListener<T extends JarCollectionNature> implements IResourceChangeListener {
+ private final String natureId;
+ private final LibraryChangeProvider listener;
+
+ public JarChangeResourceListener(String natureId, LibraryChangeProvider listener) {
+ if (natureId == null) {
+ throw new IllegalArgumentException("natureId must not be null");
+ }
+ if (listener == null) {
+ throw new IllegalArgumentException("listener must not be null");
+ }
+ this.natureId = natureId;
+ this.listener = listener;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void resourceChanged(IResourceChangeEvent event) {
+ try {
+ if (event.getType() == IResourceChangeEvent.POST_CHANGE) {
+ handleChangeEvent(event);
+ } else if (event.getType() == IResourceChangeEvent.PRE_CLOSE) {
+ IResource resource = event.getResource();
+ if (resource != null && resource instanceof IProject) {
+ IProject project = (IProject) resource;
+
+ IProjectNature nature = project.getNature(natureId);
+ if (nature != null) {
+ listener.handleNatureClosed((T) nature);
+ }
+ }
+ }
+ } catch (CoreException ex) {
+ } catch (MalformedURLException ex) {
+ }
+ }
+
+ private void handleChangeEvent(IResourceChangeEvent event) throws CoreException, MalformedURLException {
+ IResourceDelta rootDelta = event.getDelta();
+ if (rootDelta != null) {
+ boolean triggered = false;
+ for (IResourceDelta child : rootDelta.getAffectedChildren()) {
+ IResource resource = child.getResource();
+ if (resource != null && resource instanceof IProject) {
+ IProject project = (IProject) resource;
+
+ IProjectNature nature = project.getNature(natureId);
+ if (nature != null) {
+ JarCollectionNature starterNature = (JarCollectionNature) nature;
+ IPath[] paths = starterNature.getProjectRelativeBundlePaths();
+ for (IPath path : paths) {
+ IResourceDelta pluginDelta = child.findMember(path);
+ if (pluginDelta != null) {
+ handlePluginChanges(project.getLocation().removeLastSegments(1),
+ pluginDelta.getAffectedChildren());
+ triggered = true;
+ }
+ }
+ }
+ }
+ }
+
+ if (triggered) {
+ listener.handlePostChange();
+ }
+ }
+ }
+
+ protected void handlePluginChanges(IPath workspacePath, IResourceDelta[] affectedChildren) throws MalformedURLException {
+ for (IResourceDelta affectedPluginDelta : affectedChildren) {
+ URL url = workspacePath.append(affectedPluginDelta.getFullPath()).toFile().toURI().toURL();
+ if (affectedPluginDelta.getFullPath().getFileExtension().equals("jar")) {
+ try {
+ switch (affectedPluginDelta.getKind()) {
+ case IResourceDelta.ADDED:
+ listener.handleBundleAdded(url);
+ break;
+ case IResourceDelta.CHANGED:
+ listener.handleBundleChanged(url);
+ break;
+ case IResourceDelta.REMOVED:
+ listener.handleBundleRemoved(url);
+ break;
+
+ default:
+ System.err.println("Do not expect change kind of " + generateKindString(affectedPluginDelta.getKind()));
+ }
+ } catch (RuntimeException ex) {
+ ex.printStackTrace();
+ throw ex;
+ }
+ }
+ }
+ }
+
+ private String generateKindString(int kind) {
+ switch (kind) {
+ case IResourceDelta.ADDED:
+ return "Added";
+ case IResourceDelta.CHANGED:
+ return "Changed";
+ case IResourceDelta.REMOVED:
+ return "Removed";
+ default:
+ return "Unexpected Kind: " + kind;
+ }
+ }
+
+ protected String generateEventString(int type) {
+ switch (type) {
+ case IResourceChangeEvent.POST_BUILD:
+ return "Post Build";
+ case IResourceChangeEvent.POST_CHANGE:
+ return "Post Change";
+ case IResourceChangeEvent.PRE_BUILD:
+ return "Pre Build";
+ case IResourceChangeEvent.PRE_CLOSE:
+ return "Pre Close";
+ case IResourceChangeEvent.PRE_DELETE:
+ return "Pre Delete";
+ case IResourceChangeEvent.PRE_REFRESH:
+ return "Pre Refresh";
+ default:
+ return "Unknown Code: " + type;
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/LibraryChangeProvider.java b/org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/LibraryChangeProvider.java
new file mode 100644
index 000000000..4384a90bd
--- /dev/null
+++ b/org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/LibraryChangeProvider.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.container;
+
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.framework.ui.workspacebundleloader.JarCollectionNature;
+
+public class LibraryChangeProvider<T extends JarCollectionNature> {
+
+ private final List<IUserLibListener> listeners;
+
+ public LibraryChangeProvider() {
+ listeners = new ArrayList<>();
+ }
+
+ public void addListener(IUserLibListener listener) {
+ if (!listeners.contains(listener)) {
+ listeners.add(listener);
+ }
+ }
+
+ public void handleBundleAdded(URL url) {
+ resetClasspath();
+ }
+
+ private void resetClasspath() {
+ for (IUserLibListener listener : listeners) {
+ listener.libraryChanged();
+ // try {
+ // this.oteClasspathContainer.javaProject.getPerProjectInfo().resetResolvedClasspath();
+ // }
+ // catch (JavaModelException ex) {
+ // ex.printStackTrace();
+ // }
+ }
+ }
+
+ public void handleBundleChanged(URL url) {
+ }
+
+ public void handleBundleRemoved(URL url) {
+ resetClasspath();
+ }
+
+ public void handleNatureClosed(T nature) {
+ resetClasspath();
+ }
+
+ public void handlePostChange() {
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/OteClasspathContainer.java b/org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/OteClasspathContainer.java
new file mode 100644
index 000000000..2f0ae41d7
--- /dev/null
+++ b/org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/OteClasspathContainer.java
@@ -0,0 +1,176 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.container;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.core.IClasspathContainer;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.internal.core.JavaProject;
+import org.eclipse.osee.framework.ui.workspacebundleloader.JarChangeResourceListener;
+import org.eclipse.osee.ote.core.BundleInfo;
+import org.eclipse.osee.ote.core.OteBundleLocator;
+import org.eclipse.osee.ote.runtimemanager.OteUserLibsNature;
+import org.osgi.framework.BundleContext;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class OteClasspathContainer implements IClasspathContainer, IUserLibListener {
+ public final static Path ID = new Path("OTE Classpath Container from the extension point");
+
+ private Collection<ClassPathDescription> classPaths;
+
+ private List<BundleInfo> betterPaths;
+
+ private ServiceTracker tracker;
+
+ private OteBundleLocator locator;
+
+ private final JavaProject javaProject;
+
+ private LibraryChangeProvider<OteUserLibsNature> userLibListener;
+
+ private JarChangeResourceListener<OteUserLibsNature> userLibResourceListener;
+
+ public OteClasspathContainer(IPath path, IJavaProject javaProject) throws CoreException {
+ this.javaProject = (JavaProject) javaProject;
+
+ try {
+ BundleContext context = OteContainerActivator.getDefault().getContext();
+ tracker = new ServiceTracker(context, OteBundleLocator.class.getName(), null);
+ tracker.open(true);
+ Object obj = tracker.waitForService(10000);
+ locator = (OteBundleLocator) obj;
+
+ OteContainerActivator.getDefault().getLibraryChangeProvider().addListener(this);
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+
+ }
+
+ private String findProjectRoot(String path) {
+ File fileForPath = new File(path);
+ File projectFile = recursivelyFindProjectFile(fileForPath);
+ return projectFile.getAbsolutePath();
+ }
+
+ private File recursivelyFindProjectFile(File file) {
+
+ if (file == null) {
+ return file;
+ }
+
+ if (fileIsDirectoryWithBin(file)) {
+ return file;
+ } else {
+ return recursivelyFindProjectFile(file.getParentFile());
+ }
+ }
+
+ private boolean fileIsDirectoryWithBin(File file) {
+ if (file.isDirectory()) {
+ File binChildFile = new File(file.getAbsoluteFile() + "/bin");
+ if (binChildFile.exists()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private String getWorkspaceRelativePath(String absolutePath) {
+ return absolutePath;
+ }
+
+ @Override
+ public IClasspathEntry[] getClasspathEntries() {
+ List<IClasspathEntry> entries = new ArrayList<>();
+ Collection<BundleInfo> runtimeLibUrls;
+ try {
+ runtimeLibUrls = locator.getRuntimeLibs();
+ classPaths = new ArrayList<>();
+ betterPaths = new ArrayList<>();
+ for (BundleInfo info : runtimeLibUrls) {
+
+ String binaryFilePath = info.getSystemLocation().getFile();
+
+ if (info.isSystemLibrary()) {
+ entries.add(JavaCore.newLibraryEntry(new Path(binaryFilePath), new Path(binaryFilePath), new Path("/")));
+ } else {
+ File projectFilePath = recursivelyFindProjectFile(new File(binaryFilePath));
+ binaryFilePath = "/" + projectFilePath.getName();
+
+ entries.add(JavaCore.newProjectEntry(new Path(binaryFilePath)));
+ }
+ }
+
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+
+ IClasspathEntry[] retVal = new IClasspathEntry[entries.size()];
+ return entries.toArray(retVal);
+ }
+
+ @Override
+ public String getDescription() {
+ return "OTE Classpath Container";
+ }
+
+ @Override
+ public int getKind() {
+ return IClasspathContainer.K_APPLICATION;
+ }
+
+ @Override
+ public IPath getPath() {
+ return ID;
+ }
+
+ private class ClassPathDescription {
+ private final String sourcePath, binaryPath;
+
+ public ClassPathDescription(String binaryPath, String sourcePath) {
+ super();
+ this.sourcePath = sourcePath;
+ this.binaryPath = binaryPath;
+ }
+
+ /**
+ * @return the sourcePath
+ */
+ public String getSourcePath() {
+ return sourcePath;
+ }
+
+ /**
+ * @return the binaryPath
+ */
+ public String getBinaryPath() {
+ return binaryPath;
+ }
+
+ }
+
+ @Override
+ public void libraryChanged() {
+ }
+
+}
diff --git a/org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/OteClasspathContainerInitializer.java b/org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/OteClasspathContainerInitializer.java
new file mode 100644
index 000000000..046e9599c
--- /dev/null
+++ b/org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/OteClasspathContainerInitializer.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.container;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jdt.core.ClasspathContainerInitializer;
+import org.eclipse.jdt.core.IClasspathContainer;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+
+public class OteClasspathContainerInitializer extends ClasspathContainerInitializer {
+
+ public OteClasspathContainerInitializer() {
+ }
+
+ @Override
+ public void initialize(IPath containerPath, IJavaProject project) throws CoreException {
+
+ OteClasspathContainer oteClasspathContainer = new OteClasspathContainer(containerPath, project);
+ JavaCore.setClasspathContainer(containerPath, new IJavaProject[] {project},
+ new IClasspathContainer[] {oteClasspathContainer}, null);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/OteContainerActivator.java b/org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/OteContainerActivator.java
new file mode 100644
index 000000000..c449a7281
--- /dev/null
+++ b/org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/OteContainerActivator.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.container;
+
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.osee.ote.runtimemanager.OteUserLibsNature;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class OteContainerActivator implements BundleActivator {
+
+ // The plug-in ID
+ public static final String PLUGIN_ID = "org.eclipse.osee.ote.container";
+
+ // The shared instance
+ private static OteContainerActivator plugin;
+
+ private BundleContext context;
+
+ private JarChangeResourceListener<OteUserLibsNature> userLibResourceListener;
+
+ private LibraryChangeProvider<OteUserLibsNature> userLibListener;
+
+ /**
+ * The constructor
+ */
+ public OteContainerActivator() {
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ plugin = this;
+ this.context = context;
+ userLibListener = new LibraryChangeProvider<>();
+ this.userLibResourceListener =
+ new JarChangeResourceListener<OteUserLibsNature>(OteUserLibsNature.NATURE_ID, userLibListener);
+
+ IWorkspace workspace = ResourcesPlugin.getWorkspace();
+ workspace.addResourceChangeListener(userLibResourceListener);
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ IWorkspace workspace = ResourcesPlugin.getWorkspace();
+ workspace.removeResourceChangeListener(userLibResourceListener);
+ context = null;
+ plugin = null;
+ }
+
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static OteContainerActivator getDefault() {
+ return plugin;
+ }
+
+ /**
+ * @return the context
+ */
+ public BundleContext getContext() {
+ return context;
+ }
+
+ public LibraryChangeProvider<OteUserLibsNature> getLibraryChangeProvider() {
+ return userLibListener;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/OteContainerPage.java b/org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/OteContainerPage.java
new file mode 100644
index 000000000..4681c2a6d
--- /dev/null
+++ b/org.eclipse.osee.ote.container/src/org/eclipse/osee/ote/container/OteContainerPage.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.container;
+
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.ui.wizards.IClasspathContainerPage;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+
+public class OteContainerPage extends WizardPage implements IClasspathContainerPage {
+
+ public OteContainerPage() {
+ super("OTE CONTAINER");
+ }
+
+ @Override
+ public boolean finish() {
+ return true;
+ }
+
+ @Override
+ public IClasspathEntry getSelection() {
+ return JavaCore.newContainerEntry(OteClasspathContainer.ID);
+ }
+
+ @Override
+ public void setSelection(IClasspathEntry containerEntry) {
+ }
+
+ @Override
+ public void createControl(Composite parent) {
+ Composite comp = new Composite(parent, SWT.None);
+ GridLayout layout = new GridLayout(1, true);
+ comp.setLayout(layout);
+
+ GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
+ comp.setLayoutData(data);
+
+ Label label = new Label(comp, SWT.BORDER);
+ label.setText("JUST CLICK FINISH YOU FOOL!!!");
+
+ data = new GridData(SWT.FILL, SWT.FILL, true, true);
+ label.setLayoutData(data);
+ setControl(comp);
+
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core.test/.classpath b/org.eclipse.osee.ote.core.test/.classpath
new file mode 100644
index 000000000..1fa3e6803
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.ote.core.test/.project b/org.eclipse.osee.ote.core.test/.project
new file mode 100644
index 000000000..770c642ab
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ote.core.test</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.core.test/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.core.test/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..7821538d3
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/META-INF/MANIFEST.MF
@@ -0,0 +1,13 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OTE Core Test (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.core.test
+Bundle-Version: 0.25.3.qualifier
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Fragment-Host: org.eclipse.osee.ote.core
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Require-Bundle: org.junit,
+ org.eclipse.equinox.ds
+Export-Package: org.eclipse.osee.ote.core.framework
+Import-Package: org.mockito,
+ org.mockito.stubbing
diff --git a/org.eclipse.osee.ote.core.test/build.properties b/org.eclipse.osee.ote.core.test/build.properties
new file mode 100644
index 000000000..34d2e4d2d
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .
diff --git a/org.eclipse.osee.ote.core.test/data/loading.test1.jar b/org.eclipse.osee.ote.core.test/data/loading.test1.jar
new file mode 100644
index 000000000..0e6549aaa
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/data/loading.test1.jar
Binary files differ
diff --git a/org.eclipse.osee.ote.core.test/data/loading.test2.jar b/org.eclipse.osee.ote.core.test/data/loading.test2.jar
new file mode 100644
index 000000000..dac01e7d2
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/data/loading.test2.jar
Binary files differ
diff --git a/org.eclipse.osee.ote.core.test/data/loading.test3.jar b/org.eclipse.osee.ote.core.test/data/loading.test3.jar
new file mode 100644
index 000000000..ccd4c1622
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/data/loading.test3.jar
Binary files differ
diff --git a/org.eclipse.osee.ote.core.test/pom.xml b/org.eclipse.osee.ote.core.test/pom.xml
new file mode 100644
index 000000000..9205d59ba
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/pom.xml
@@ -0,0 +1,17 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.osee</groupId>
+ <artifactId>org.eclipse.osee.ote.parent</artifactId>
+ <version>0.25.3-SNAPSHOT</version>
+ <relativePath>../org.eclipse.osee.ote.parent</relativePath>
+ </parent>
+
+ <artifactId>org.eclipse.osee.ote.core.test</artifactId>
+ <packaging>eclipse-test-plugin</packaging>
+ <name>OTE Core Test</name>
+
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/OTEApiTest.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/OTEApiTest.java
new file mode 100644
index 000000000..7662b3e70
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/OTEApiTest.java
@@ -0,0 +1,223 @@
+package org.eclipse.osee.ote;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.concurrent.Future;
+import org.eclipse.osee.framework.jdk.core.util.ChecksumUtil;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.ServiceReference;
+
+@SuppressWarnings("restriction")
+public class OTEApiTest {
+
+ private OTEApi oteApi;
+
+ @Before
+ public void setup() {
+ BundleContext context = FrameworkUtil.getBundle(getClass()).getBundleContext();
+ ServiceReference<OTEApi> ref = context.getServiceReference(OTEApi.class);
+ Assert.assertNotNull(ref);
+ oteApi = context.getService(ref);
+ Assert.assertNotNull(oteApi);
+ }
+
+ @Test
+ public void testConfigurationLoading() throws IOException, Exception {
+ clearJarCache();
+ URL bundle1 = findEntry("data/loading.test1.jar");
+ URL bundle2 = findEntry("data/loading.test2.jar");
+ URL bundle3 = findEntry("data/loading.test3.jar");
+ ConfigurationItem config1 =
+ new ConfigurationItem(bundle1.toString(), "1.0.0", "loading.test1", ChecksumUtil.createChecksumAsString(
+ bundle1.openStream(), "MD5"), true);
+ ConfigurationItem config2 =
+ new ConfigurationItem(bundle2.toString(), "1.0.0", "loading.test2", ChecksumUtil.createChecksumAsString(
+ bundle2.openStream(), "MD5"), true);
+ ConfigurationItem config3 =
+ new ConfigurationItem(bundle3.toString(), "1.0.0", "loading.test3", ChecksumUtil.createChecksumAsString(
+ bundle3.openStream(), "MD5"), true);
+
+ Configuration validConfiguration = new Configuration();
+ validConfiguration.addItem(config1);
+ validConfiguration.addItem(config2);
+ validConfiguration.addItem(config3);
+
+ OTEStatusCallback<ConfigurationStatus> callable = new OTEStatusCallbackForTests<>();
+
+ Future<ConfigurationStatus> statusFuture = oteApi.loadConfiguration(validConfiguration, callable);
+ ConfigurationStatus status = statusFuture.get();
+ Assert.assertTrue(status.isSuccess());
+ Assert.assertEquals(validConfiguration, status.getConfiguration());
+ Assert.assertEquals(validConfiguration, oteApi.getConfiguration().get().getConfiguration());
+
+ Bundle bundle = findBundle("loading.test1");
+ Assert.assertNotNull(bundle);
+ Assert.assertEquals(Bundle.ACTIVE, bundle.getState());
+
+ bundle = findBundle("loading.test2");
+ Assert.assertNotNull(bundle);
+ Assert.assertEquals(Bundle.ACTIVE, bundle.getState());
+
+ bundle = findBundle("loading.test3");
+ Assert.assertNotNull(bundle);
+ Assert.assertEquals(Bundle.ACTIVE, bundle.getState());
+
+ Future<ConfigurationStatus> resetFeature = oteApi.resetConfiguration(callable);
+ ConfigurationStatus resetStatus = resetFeature.get();
+ Assert.assertTrue(resetStatus.isSuccess());
+ Assert.assertNull(findBundle("loading.test1"));
+ Assert.assertNull(findBundle("loading.test2"));
+ Assert.assertNull(findBundle("loading.test3"));
+
+ Configuration invalidConfiguration = new Configuration();
+ invalidConfiguration.addItem(config1);
+ invalidConfiguration.addItem(config3);
+ Future<ConfigurationStatus> failStatusFuture = oteApi.loadConfiguration(invalidConfiguration, callable);
+ ConfigurationStatus failStatus = failStatusFuture.get();
+ Assert.assertFalse(failStatus.isSuccess());
+ System.out.println(failStatus.getMessage());
+ Assert.assertNull(findBundle("loading.test1"));
+ Assert.assertNull(findBundle("loading.test2"));
+ Assert.assertNull(findBundle("loading.test3"));
+
+ //test the doing load case
+ Future<ConfigurationStatus> good = oteApi.loadConfiguration(validConfiguration, callable);
+ Future<ConfigurationStatus> bad = oteApi.loadConfiguration(validConfiguration, callable);
+
+ ConfigurationStatus goodStatus = good.get();
+ ConfigurationStatus badStatus = bad.get();
+ Assert.assertTrue(goodStatus.isSuccess());
+ Assert.assertFalse(badStatus.isSuccess());
+ System.out.println(badStatus.getMessage());
+
+ //test already configured
+ bad = oteApi.loadConfiguration(validConfiguration, callable);
+ badStatus = bad.get();
+ Assert.assertFalse(badStatus.isSuccess());
+ System.out.println(badStatus.getMessage());
+ }
+
+ @Test
+ public void testJarAcquire() throws IOException, Exception {
+ clearJarCache();
+ URL bundle1 = findEntry("data/loading.test1.jar");
+ URL bundle2 = findEntry("data/loading.test2.jar");
+ URL bundle3 = findEntry("data/loading.test3.jar");
+ ConfigurationItem config1 =
+ new ConfigurationItem(bundle1.toString(), "1.0.0", "loading.test1", ChecksumUtil.createChecksumAsString(
+ bundle1.openStream(), "MD5"), true);
+ ConfigurationItem config2 =
+ new ConfigurationItem(bundle2.toString(), "1.0.0", "loading.test2", ChecksumUtil.createChecksumAsString(
+ bundle2.openStream(), "MD5"), true);
+ ConfigurationItem config3 =
+ new ConfigurationItem(bundle3.toString(), "1.0.0", "loading.test3", ChecksumUtil.createChecksumAsString(
+ bundle3.openStream(), "MD5"), true);
+
+ Configuration validConfiguration = new Configuration();
+ validConfiguration.addItem(config1);
+ validConfiguration.addItem(config2);
+ validConfiguration.addItem(config3);
+
+ OTEStatusCallback<ConfigurationStatus> callable = new OTEStatusCallbackForTests<>();
+
+ Future<ConfigurationStatus> statusFuture = oteApi.downloadConfigurationJars(validConfiguration, callable);
+ ConfigurationStatus status = statusFuture.get();
+ Assert.assertTrue(status.isSuccess());
+ OTEServerRuntimeCache cache = oteApi.getRuntimeCache();
+ Assert.assertNotNull(cache.get(config1.getSymbolicName(), config1.getMd5Digest()));
+ Assert.assertNotNull(cache.get(config2.getSymbolicName(), config2.getMd5Digest()));
+ Assert.assertNotNull(cache.get(config3.getSymbolicName(), config3.getMd5Digest()));
+
+ Assert.assertNull(cache.get(config1.getSymbolicName(), config2.getMd5Digest()));
+ Assert.assertNull(cache.get(config2.getSymbolicName(), config3.getMd5Digest()));
+ Assert.assertNull(cache.get(config3.getSymbolicName(), config1.getMd5Digest()));
+
+ //test failure to download
+ clearJarCache();
+ ConfigurationItem config4 =
+ new ConfigurationItem("file://this/file/does/not/exist/2351.jar", "1.0.0", "loading.test11",
+ ChecksumUtil.createChecksumAsString(bundle1.openStream(), "MD5"), true);
+ Configuration invalidConfiguration = new Configuration();
+ invalidConfiguration.addItem(config4);
+ statusFuture = oteApi.downloadConfigurationJars(invalidConfiguration, callable);
+ status = statusFuture.get();
+ Assert.assertFalse(status.isSuccess());
+
+ // Assert.assertEquals(validConfiguration, status.getConfiguration());
+ // Assert.assertEquals(validConfiguration, oteApi.getConfiguration().get().getConfiguration());
+
+ // Bundle bundle = findBundle("loading.test1");
+ // Assert.assertNotNull(bundle);
+ // Assert.assertEquals(Bundle.ACTIVE, bundle.getState());
+ //
+ // bundle = findBundle("loading.test2");
+ // Assert.assertNotNull(bundle);
+ // Assert.assertEquals(Bundle.ACTIVE, bundle.getState());
+ //
+ // bundle = findBundle("loading.test3");
+ // Assert.assertNotNull(bundle);
+ // Assert.assertEquals(Bundle.ACTIVE, bundle.getState());
+
+ // Future<ConfigurationStatus> resetFeature = oteApi.resetConfiguration(callable);
+ // ConfigurationStatus resetStatus = resetFeature.get();
+ // Assert.assertTrue(resetStatus.isSuccess());
+ // Assert.assertNull(findBundle("loading.test1"));
+ // Assert.assertNull(findBundle("loading.test2"));
+ // Assert.assertNull(findBundle("loading.test3"));
+
+ // Configuration invalidConfiguration = new Configuration();
+ // invalidConfiguration.addItem(config1);
+ // invalidConfiguration.addItem(config3);
+ // Future<ConfigurationStatus> failStatusFuture = oteApi.loadConfiguration(invalidConfiguration, callable);
+ // ConfigurationStatus failStatus = failStatusFuture.get();
+ // Assert.assertFalse(failStatus.isSuccess());
+ // System.out.println(failStatus.getMessage());
+ // Assert.assertNull(findBundle("loading.test1"));
+ // Assert.assertNull(findBundle("loading.test2"));
+ // Assert.assertNull(findBundle("loading.test3"));
+ //
+ // //test the doing load case
+ // Future<ConfigurationStatus> good = oteApi.loadConfiguration(validConfiguration, callable);
+ // Future<ConfigurationStatus> bad = oteApi.loadConfiguration(validConfiguration, callable);
+ //
+ // ConfigurationStatus goodStatus = good.get();
+ // ConfigurationStatus badStatus = bad.get();
+ // Assert.assertTrue(goodStatus.isSuccess());
+ // Assert.assertFalse(badStatus.isSuccess());
+ // System.out.println(badStatus.getMessage());
+ //
+ // //test already configured
+ // bad = oteApi.loadConfiguration(validConfiguration, callable);
+ // badStatus = bad.get();
+ // Assert.assertFalse(badStatus.isSuccess());
+ // System.out.println(badStatus.getMessage());
+ }
+
+ private void clearJarCache() {
+ oteApi.getRuntimeCache().clearJarCache();
+ }
+
+ private Bundle findBundle(String symbolicName) {
+ Bundle[] bundles = FrameworkUtil.getBundle(OTEApiTest.class).getBundleContext().getBundles();
+ for (Bundle bundle : bundles) {
+ if (bundle.getSymbolicName().equals(symbolicName)) {
+ return bundle;
+ }
+ }
+ return null;
+ }
+
+ private URL findEntry(String path) {
+ URL url = null;
+ Bundle bundle = FrameworkUtil.getBundle(OTEApiTest.class);
+ url = bundle.getEntry(path);
+ Assert.assertNotNull(url);
+ return url;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/OTEStatusCallbackForTests.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/OTEStatusCallbackForTests.java
new file mode 100644
index 000000000..73d78edae
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/OTEStatusCallbackForTests.java
@@ -0,0 +1,37 @@
+package org.eclipse.osee.ote;
+
+
+public class OTEStatusCallbackForTests<T> implements OTEStatusCallback<ConfigurationStatus> {
+
+ @Override
+ public void complete(ConfigurationStatus done) {
+ System.out.println("done");
+ }
+
+ @Override
+ public void setTotalUnitsOfWork(int totalUnitsOfWork) {
+ System.out.println("units " + totalUnitsOfWork);
+ }
+
+ @Override
+ public void incrememtUnitsWorked(int count) {
+ System.out.println("units " + count);
+ }
+
+ @Override
+ public void log(String string) {
+ System.out.println(string);
+ }
+
+ @Override
+ public void error(String message, Throwable th) {
+ System.out.println(message);
+ th.printStackTrace();
+ }
+
+ @Override
+ public void error(String message) {
+ System.out.println(message);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/core/XmlSupportTest.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/core/XmlSupportTest.java
new file mode 100644
index 000000000..026bd918f
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/core/XmlSupportTest.java
@@ -0,0 +1,36 @@
+/*
+ * Created on Jun 10, 2013
+ *
+ * PLACE_YOUR_DISTRIBUTION_STATEMENT_RIGHT_HERE
+ */
+package org.eclipse.osee.ote.core;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * @author Michael P. Masterson
+ */
+public class XmlSupportTest {
+
+ /**
+ * Test method for {@link org.eclipse.osee.ote.core.XmlSupport#convertNonPrintableCharacers(java.lang.String)}.
+ */
+ @Test
+ public void testConvertXmlCharacers() {
+ String testString = "abc\n\r\0\t 123\f&<>";
+ String expected = "abc\n\r[ASCII=0]\t 123[ASCII=12][ampersand][less-than][greater-than]";
+ String actual = XmlSupport.convertXmlCharacters(testString);
+ Assert.assertEquals(expected, actual);
+ }
+
+ @Test
+ public void testNonPrintableCharacter() {
+ String testString = "abc\n\r\0\t 123\f&<>";
+ String expected = "abc\n\r[ASCII=0]\t 123[ASCII=12]&<>";
+
+ String actual = XmlSupport.convertNonPrintableCharacers(testString);
+ Assert.assertEquals(expected, actual);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/core/environment/status/msg/SerializedMessageTest.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/core/environment/status/msg/SerializedMessageTest.java
new file mode 100644
index 000000000..ef03ddbf5
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/core/environment/status/msg/SerializedMessageTest.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.status.msg;
+
+import java.io.IOException;
+
+import org.junit.Assert;
+
+import org.eclipse.osee.ote.core.environment.status.EnvironmentError;
+import org.junit.Test;
+
+public class SerializedMessageTest {
+
+ @Test
+ public void testErrorMessage() throws IOException, ClassNotFoundException {
+ String exMessage = "MY EX TEST";
+ EnvironmentError error = new EnvironmentError(new Exception(exMessage));
+ EnvErrorMessage msg = new EnvErrorMessage();
+ msg.setObject(error);
+ EnvironmentError errorBack = msg.getObject();
+ Assert.assertEquals(errorBack.getErr().getMessage(), exMessage);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/core/log/record/PropertyStoreRecordTest.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/core/log/record/PropertyStoreRecordTest.java
new file mode 100644
index 000000000..730a4bbc0
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/core/log/record/PropertyStoreRecordTest.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.log.record;
+
+import java.io.StringWriter;
+import java.io.Writer;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import javax.xml.stream.XMLOutputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+import junit.framework.TestCase;
+import org.eclipse.osee.framework.jdk.core.type.PropertyStore;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class PropertyStoreRecordTest extends TestCase {
+
+ public void testSimpleXmlWriting() throws XMLStreamException {
+ PropertyStore store = new PropertyStore();
+ store.put("test1", "data1");
+ store.put("test2", "data2");
+ store.put("test3", "data3");
+ store.put("test4", "data4");
+ PropertyStoreRecord record = new PropertyStoreRecord(store);
+ XMLOutputFactory factory = XMLOutputFactory.newInstance();
+ Writer stringStream = new StringWriter();
+ XMLStreamWriter writer = factory.createXMLStreamWriter(stringStream);
+ record.toXml(writer);
+
+ Pattern pattern = Pattern.compile("key=\"test1\"");
+ Matcher matcher = pattern.matcher(stringStream.toString());
+ assertTrue(matcher.find());
+
+ pattern = Pattern.compile("key=\"test2\"");
+ matcher = pattern.matcher(stringStream.toString());
+ assertTrue(matcher.find());
+
+ pattern = Pattern.compile("data2");
+ matcher = pattern.matcher(stringStream.toString());
+ assertTrue(matcher.find());
+
+ System.out.println(stringStream.toString());
+
+ pattern = Pattern.compile("data4");
+ matcher = pattern.matcher(stringStream.toString());
+ assertTrue(matcher.find());
+
+ pattern = Pattern.compile("key=\"test5\"");
+ matcher = pattern.matcher(stringStream.toString());
+ assertTrue(!matcher.find());
+ }
+
+ public void testNullPropertyStore() throws XMLStreamException {
+ PropertyStoreRecord record = new PropertyStoreRecord(null);
+ XMLOutputFactory factory = XMLOutputFactory.newInstance();
+ Writer stringStream = new StringWriter();
+ XMLStreamWriter writer = factory.createXMLStreamWriter(stringStream);
+ record.toXml(writer);
+ }
+
+ public void testEmptyPropertyStore() throws XMLStreamException {
+ PropertyStoreRecord record = new PropertyStoreRecord(new PropertyStore());
+ XMLOutputFactory factory = XMLOutputFactory.newInstance();
+ Writer stringStream = new StringWriter();
+ XMLStreamWriter writer = factory.createXMLStreamWriter(stringStream);
+ record.toXml(writer);
+
+ assertTrue(stringStream.toString().length() == 31);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/endpoint/OteUdpEndpointTest.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/endpoint/OteUdpEndpointTest.java
new file mode 100644
index 000000000..6caf95b48
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/endpoint/OteUdpEndpointTest.java
@@ -0,0 +1,43 @@
+package org.eclipse.osee.ote.endpoint;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+
+import org.eclipse.osee.framework.jdk.core.util.network.PortUtil;
+import org.eclipse.osee.ote.message.event.FileAvailableRequest;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class OteUdpEndpointTest {
+
+ @Test
+ public void testCreation() throws IOException {
+ int port = PortUtil.getInstance().getValidPort();
+ OteUdpEndpointSender sender = new OteUdpEndpointSender(new InetSocketAddress(port));
+ Assert.assertNotNull(sender);
+ port = PortUtil.getInstance().getValidPort();
+ OteUdpEndpointReceiverImpl receiver = new OteUdpEndpointReceiverImpl(new InetSocketAddress(port));
+ Assert.assertNotNull(receiver);
+ }
+
+ @Test
+ public void testSendReceive() throws IOException, InterruptedException {
+ int port = PortUtil.getInstance().getValidPort();
+ OteUdpEndpointReceiverImpl receiver = new OteUdpEndpointReceiverImpl(new InetSocketAddress(InetAddress.getLocalHost(), port));
+ receiver.setDebugOutput(true);
+ receiver.start();
+ Thread.sleep(20);
+ InetSocketAddress address = receiver.getEndpoint();
+ OteUdpEndpointSender sender = new OteUdpEndpointSender(address);
+ sender.start();
+ FileAvailableRequest request = new FileAvailableRequest();
+ sender.send(request);
+
+ Thread.sleep(20);
+
+ sender.stop();
+ receiver.stop();
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/data/MemoryResourceTest.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/data/MemoryResourceTest.java
new file mode 100644
index 000000000..89ecaeeac
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/data/MemoryResourceTest.java
@@ -0,0 +1,43 @@
+package org.eclipse.osee.ote.message.data;
+
+import java.nio.ByteBuffer;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class MemoryResourceTest {
+
+ @Test
+ public void testcopyDataByteBuffer() {
+ byte[] data = new byte[32];
+ ByteBuffer buffer = ByteBuffer.allocate(32);
+ for(int i = 0; i < 16; i++){
+ buffer.put((byte)0xDD);
+ }
+ for(int i = 0; i < 16; i++){
+ buffer.put((byte)0xFF);
+ }
+ buffer.position(16);
+ MemoryResource mem = new MemoryResource(data, 0, 64);
+ mem.copyData(0, buffer, buffer.remaining());
+
+ byte[] answer = new byte[32];
+ for(int i = 0; i < 16; i++){
+ answer[i] = (byte)0xFF;
+ }
+
+ Assert.assertArrayEquals(answer, mem.getData());
+
+ buffer.position(0);
+ mem.copyData(0, buffer, buffer.remaining());
+ for(int i = 0; i < 16; i++){
+ answer[i] = (byte)0xDD;
+ }
+ for(int i = 16; i < 32; i++){
+ answer[i] = (byte)0xFF;
+ }
+
+ Assert.assertArrayEquals(answer, mem.getData());
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/BiSci16ElementTest.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/BiSci16ElementTest.java
new file mode 100644
index 000000000..c8a94284f
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/BiSci16ElementTest.java
@@ -0,0 +1,167 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.elements;
+
+import org.eclipse.osee.ote.message.data.HeaderData;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * @author Michael P. Masterson
+ */
+public class BiSci16ElementTest {
+
+ private BiSci16Element uut;
+
+ @Before
+ public void setup() {
+ final HeaderData hd = new HeaderData("test_data", new MemoryResource(new byte[64], 2, 64));
+ uut = new BiSci16Element(null, "derp", hd, 0, 0, 15);
+ }
+
+ @Test
+ public void testLongToBiSci() {
+
+ long logicalValue ;
+ long biSciValue;
+
+ logicalValue = 1;
+ biSciValue = 0x10;
+ assertLongToBiSci(logicalValue, biSciValue);
+
+ logicalValue = 0;
+ biSciValue = 0x0;
+ assertLongToBiSci(logicalValue, biSciValue);
+
+ logicalValue = -1;
+ biSciValue = 0xFFF0;
+ assertLongToBiSci(logicalValue, biSciValue);
+
+ logicalValue = 946176;
+ biSciValue = 0xE73;
+ assertLongToBiSci(logicalValue, biSciValue);
+
+ logicalValue = 25624576;
+ biSciValue = 0x1874;
+ assertLongToBiSci(logicalValue, biSciValue);
+
+ logicalValue = -25624576;
+ biSciValue = 0xE794;
+ assertLongToBiSci(logicalValue, biSciValue);
+
+ long sixteenCubed = (long) Math.pow(16, 3);
+ logicalValue = (long) Math.pow(16, 5);
+ biSciValue = 0x1003;
+ assertLongToBiSci(logicalValue, biSciValue);
+
+ logicalValue = (long) (Math.pow(16, 5) + 1);
+ biSciValue = 0x1003;
+ assertLongToBiSci(logicalValue, biSciValue);
+
+ logicalValue = (long) (Math.pow(16, 5) - 1);
+ biSciValue = 0x1003;
+ assertLongToBiSci(logicalValue, biSciValue);
+
+ logicalValue = (long) (Math.pow(16, 5) + (sixteenCubed/2) - 1);
+ biSciValue = 0x1003;
+ assertLongToBiSci(logicalValue, biSciValue);
+
+ logicalValue = (long) (Math.pow(16, 5) + (sixteenCubed/2));
+ biSciValue = 0x1013;
+ assertLongToBiSci(logicalValue, biSciValue);
+
+ logicalValue = (long) (Math.pow(16, 5) - sixteenCubed/2 - 1);
+ biSciValue = 0x0FF3;
+ assertLongToBiSci(logicalValue, biSciValue);
+
+ logicalValue = (long) (Math.pow(16, 5) - sixteenCubed/2);
+ biSciValue = 0x1003;
+ assertLongToBiSci(logicalValue, biSciValue);
+
+ }
+
+ private void assertLongToBiSci(long input, long expected) {
+ long actual = uut.convertLogicalValueToBiSci(input);
+ Assert.assertEquals(expected, actual);
+ }
+
+ @Test
+ public void testBiSciToLong() {
+ long biSciValue;
+ long logicalValue;
+
+ logicalValue = 1;
+ biSciValue = 0x10;
+ assertBiSciToLong(biSciValue, logicalValue);
+
+ logicalValue = 0;
+ biSciValue = 0x0;
+ assertBiSciToLong(biSciValue, logicalValue);
+
+ logicalValue = -1;
+ biSciValue = 0xFFF0;
+ assertBiSciToLong(biSciValue, logicalValue);
+
+ logicalValue = 946176;
+ biSciValue = 0xE73;
+ assertBiSciToLong(biSciValue, logicalValue);
+
+ logicalValue = 25624576;
+ biSciValue = 0x1874;
+ assertBiSciToLong(biSciValue, logicalValue);
+
+ logicalValue = -25624576;
+ biSciValue = ((short)0xE794);
+ assertBiSciToLong(biSciValue, logicalValue);
+
+ }
+
+ /**
+ * @param bisciValue
+ * @param logicalValue
+ */
+ private void assertBiSciToLong(long input, long expected) {
+ long actual = uut.convertBiSciToLogicalValue(input);
+ Assert.assertEquals(expected, actual);
+
+ }
+
+ @Test
+ public void testSetValue() {
+ checkSet(25624576);
+ checkSet(-25624576);
+ checkSet(1);
+ checkSet(0);
+ checkSet(-1);
+
+ checkTiming(0x7FF << (4 * 15));
+ }
+
+ private void checkTiming(int input) {
+ long timeBefore, timeAfter;
+ for( int i = 0 ; i < 10000 ; i++) {
+ timeBefore = System.nanoTime();
+ checkSet(input);
+ timeAfter = System.nanoTime();
+ long runningTime = timeAfter - timeBefore;
+ Assert.assertTrue(runningTime < 500000);
+
+ }
+
+ }
+
+ private void checkSet(long input) {
+ uut.setValue(input);
+ Assert.assertEquals(input, (long)uut.getValue());
+ }
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/CharElementTest.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/CharElementTest.java
new file mode 100644
index 000000000..78267fd0f
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/CharElementTest.java
@@ -0,0 +1,80 @@
+/*
+ * Created on Oct 29, 2013
+ *
+ * PLACE_YOUR_DISTRIBUTION_STATEMENT_RIGHT_HERE
+ */
+package org.eclipse.osee.ote.message.elements;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.when;
+import java.util.Arrays;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+public class CharElementTest {
+
+ public class TestMessage extends Message {
+ public TestMessage(String name, int defaultByteSize, int defaultOffset, boolean isScheduled, int phase, double rate) {
+ super(name, defaultByteSize, defaultOffset, isScheduled, phase, rate);
+ }
+ }
+
+ @Mock
+ private TestMessage message;
+ @Mock
+ private MessageData msgData;
+ private final byte[] bytes = new byte[5];
+ private final MemoryResource memoryResource = new MemoryResource(bytes, 0, bytes.length);
+
+ @Before
+ public void before() {
+ MockitoAnnotations.initMocks(this);
+ when(message.getData()).thenReturn(bytes);
+ when(message.getName()).thenReturn("MSG");
+ when(msgData.getMem()).thenReturn(memoryResource);
+ }
+
+ @Test
+ public void parseAndSetWithByteAlignedElementTest() throws Exception {
+ CharElement sut = new CharElement(message, "TEST", msgData, 0, 0, 7);
+ assertEquals("Start with all zeros in the byte array", "[0, 0, 0, 0, 0]",
+ Arrays.toString(memoryResource.getData()));
+ sut.parseAndSet(null, " ");
+ assertEquals("getValue should return space character", ' ', sut.getValue().charValue());
+ sut.parseAndSet(null, "A");
+ assertEquals("getValue should return 'A'", 'A', sut.getValue().charValue());
+ sut.parseAndSet(null, "");
+ assertEquals("getValue should return null character", '\0', sut.getValue().charValue());
+ sut.parseAndSet(null, "FOO");
+ assertEquals("Decimal ASCII values for FOO", "[70, 79, 79, 0, 0]", Arrays.toString(memoryResource.getData()));
+ assertEquals("FOO should be returned by the getString method", "FOO", sut.getString(null, 5));
+ }
+
+ @Test
+ public void parseAndSetWithNonByteAlignedElementTest() throws Exception {
+ CharElement sut = new CharElement(message, "TEST", msgData, 0, 1, 7);
+ assertEquals("Start with all zeros in the byte array", "[0, 0, 0, 0, 0]",
+ Arrays.toString(memoryResource.getData()));
+ Arrays.fill(bytes, (byte) 0xFF);
+ sut.parseAndSet(null, " ");
+ assertEquals("getValue should return space character", ' ', sut.getValue().charValue());
+ sut.parseAndSet(null, "A");
+ assertEquals("getValue should return 'A'", 'A', sut.getValue().charValue());
+ sut.parseAndSet(null, "");
+ assertEquals("getValue should return null character", '\0', sut.getValue().charValue());
+ sut.parseAndSet(null, "FOO");
+ assertEquals("Unfortunately we tromple the spare bit data", "[70, 79, 79, -1, -1]",
+ Arrays.toString(memoryResource.getData()));
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void parseAndSetOverflowExceptionTest() throws Exception {
+ CharElement sut = new CharElement(message, "TEST", msgData, 0, 0, 7);
+ sut.parseAndSet(null, "TOOLONG");
+ }
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/Float32ElementTest.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/Float32ElementTest.java
new file mode 100644
index 000000000..887e06e7a
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/Float32ElementTest.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.elements;
+
+import java.util.Random;
+import org.eclipse.osee.ote.message.data.HeaderData;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.elements.Float32Element;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class Float32ElementTest {
+
+ @Test
+ public void testFloat32() {
+ final HeaderData hd = new HeaderData("test_data", new MemoryResource(new byte[64], 0, 64));
+ Float32Element[] e = new Float32Element[8];
+ for (int i = 0; i < e.length; i++) {
+ e[i] = new Float32Element(null, "Float32@" + i, hd, i * 4, 0, 31);
+ }
+ Random r = new Random(System.currentTimeMillis());
+ float[] vals = new float[e.length];
+ for (int i = 0; i < 1000; i++) {
+ generateAscending(r, e, vals, e.length);
+ check(e, vals, e.length);
+
+ generateDescending(r, e, vals, e.length);
+ check(e, vals, e.length);
+
+ // zeroize test
+ for (int z = 0; z < e.length; z += 2) {
+ e[z].zeroize();
+ vals[z] = 0;
+ }
+
+ check(e, vals, e.length);
+
+ }
+ Double x = new Double(r.nextFloat());
+ e[0].setValue(x);
+ Assert.assertTrue(e[0].getValue().equals(x));
+ }
+
+ private void generateAscending(Random r, Float32Element[] e, float[] expectedVals, int length) {
+ for (int i = 0; i < length; i++) {
+ float val = r.nextFloat();
+ Float32Element el = e[i];
+ el.setValue(val);
+ expectedVals[i] = val;
+ Assert.assertEquals(
+ String.format("set/get fail on %s: msb=%d, lsb=%d", el.getName(), el.getMsb(), el.getLsb()),
+ Double.valueOf(expectedVals[i]), el.getValue());
+ }
+ }
+
+ private void generateDescending(Random r, Float32Element[] e, float[] expectedVals, int length) {
+ for (int i = length - 1; i >= 0; i--) {
+ float val = r.nextFloat();
+ Float32Element el = e[i];
+ el.setValue(val);
+ expectedVals[i] = val;
+ Assert.assertEquals(
+ String.format("set/get fail on %s: msb=%d, lsb=%d", el.getName(), el.getMsb(), el.getLsb()),
+ Double.toHexString(expectedVals[i]), Double.toHexString(el.getValue()));
+ }
+ }
+
+ private void check(Float32Element[] e, float[] expectedVals, int length) {
+ for (int i = 0; i < length; i++) {
+ Float32Element el = e[i];
+ Assert.assertTrue(
+ String.format("corruption detect on %s: msb=%d, lsb=%d", el.getName(), el.getMsb(), el.getLsb()),
+ expectedVals[i] == el.getValue());
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/Float64ElementTest.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/Float64ElementTest.java
new file mode 100644
index 000000000..8c47626ad
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/Float64ElementTest.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.elements;
+
+import java.util.Random;
+import org.eclipse.osee.ote.message.data.HeaderData;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.elements.Float64Element;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class Float64ElementTest {
+
+ @Test
+ public void testFloat64() {
+ final HeaderData hd = new HeaderData("test_data", new MemoryResource(new byte[64], 0, 64));
+ Float64Element[] e = new Float64Element[8];
+ for (int i = 0; i < e.length; i++) {
+ e[i] = new Float64Element(null, "Float64@" + i, hd, i * 8, 0, 63);
+ }
+ Random r = new Random(System.currentTimeMillis());
+ double[] vals = new double[e.length];
+ for (int i = 0; i < 1000; i++) {
+ generateAscending(r, e, vals, e.length);
+ check(e, vals, e.length);
+
+ generateDescending(r, e, vals, e.length);
+ check(e, vals, e.length);
+
+ // zeroize test
+ for (int z = 0; z < e.length; z += 2) {
+ e[z].zeroize();
+ vals[z] = 0;
+ }
+
+ check(e, vals, e.length);
+ }
+ }
+
+ private void generateAscending(Random r, Float64Element[] e, double[] expectedVals, int length) {
+ for (int i = 0; i < length; i++) {
+ double val = r.nextDouble();
+ Float64Element el = e[i];
+ el.setValue(val);
+ expectedVals[i] = val;
+ Assert.assertEquals(
+ String.format("set/get fail on %s: msb=%d, lsb=%d", el.getName(), el.getMsb(), el.getLsb()),
+ (Double) expectedVals[i], el.getValue());
+ }
+ }
+
+ private void generateDescending(Random r, Float64Element[] e, double[] expectedVals, int length) {
+ for (int i = length - 1; i >= 0; i--) {
+ double val = r.nextDouble();
+ Float64Element el = e[i];
+ el.setValue(val);
+ expectedVals[i] = val;
+ Assert.assertEquals(
+ String.format("set/get fail on %s: msb=%d, lsb=%d", el.getName(), el.getMsb(), el.getLsb()),
+ Double.toHexString(expectedVals[i]), Double.toHexString(el.getValue()));
+ }
+ }
+
+ private void check(Float64Element[] e, double[] expectedVals, int length) {
+ for (int i = 0; i < length; i++) {
+ Float64Element el = e[i];
+ Assert.assertEquals(
+ String.format("corruption detect on %s: msb=%d, lsb=%d", el.getName(), el.getMsb(), el.getLsb()),
+ (Double) expectedVals[i], e[i].getValue());
+
+ String v = Double.toString(expectedVals[i]);
+ Assert.assertEquals(
+ String.format("set/get fail on %s: msb=%d, lsb=%d", el.getName(), el.getMsb(), el.getLsb()), v,
+ el.valueOf());
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/IntegerElementTest.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/IntegerElementTest.java
new file mode 100644
index 000000000..f5a7b32bd
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/IntegerElementTest.java
@@ -0,0 +1,270 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.elements;
+
+import java.util.Random;
+import org.eclipse.osee.ote.message.data.HeaderData;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.elements.IntegerElement;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class IntegerElementTest {
+
+ @Test
+ public void test1BitInts() {
+ createTest(1);
+ }
+
+ @Test
+ public void test2BitInts() {
+ createTest(2);
+ }
+
+ @Test
+ public void test3BitInts() {
+ createTest(3);
+ }
+
+ @Test
+ public void test4BitInts() {
+ createTest(4);
+ }
+
+ @Test
+ public void test5BitInts() {
+ createTest(5);
+ }
+
+ @Test
+ public void test6BitInts() {
+ createTest(6);
+ }
+
+ @Test
+ public void test7BitInts() {
+ createTest(7);
+ }
+
+ @Test
+ public void test8BitInts() {
+ createTest(8);
+ }
+
+ @Test
+ public void test9BitInts() {
+ createTest(9);
+ }
+
+ @Test
+ public void test10BitInts() {
+ createTest(10);
+ }
+
+ @Test
+ public void test11BitInts() {
+ createTest(11);
+ }
+
+ @Test
+ public void test12BitInts() {
+ createTest(12);
+ }
+
+ @Test
+ public void test13BitInts() {
+ createTest(13);
+ }
+
+ @Test
+ public void test14BitInts() {
+ createTest(14);
+ }
+
+ @Test
+ public void test15BitInts() {
+ createTest(15);
+ }
+
+ @Test
+ public void test16BitInts() {
+ createTest(16);
+ }
+
+ @Test
+ public void test17BitInts() {
+ createTest(17);
+ }
+
+ @Test
+ public void test18BitInts() {
+ createTest(18);
+ }
+
+ @Test
+ public void test19BitInts() {
+ createTest(19);
+ }
+
+ @Test
+ public void test20BitInts() {
+ createTest(20);
+ }
+
+ @Test
+ public void test21BitInts() {
+ createTest(21);
+ }
+
+ @Test
+ public void test22BitInts() {
+ createTest(22);
+ }
+
+ @Test
+ public void test23BitInts() {
+ createTest(23);
+ }
+
+ @Test
+ public void test24BitInts() {
+ createTest(24);
+ }
+
+ @Test
+ public void test25BitInts() {
+ createTest(25);
+ }
+
+ @Test
+ public void test26BitInts() {
+ createTest(26);
+ }
+
+ @Test
+ public void test27BitInts() {
+ createTest(27);
+ }
+
+ @Test
+ public void test28BitInts() {
+ createTest(28);
+ }
+
+ @Test
+ public void test29BitInts() {
+ createTest(29);
+ }
+
+ @Test
+ public void test30BitInts() {
+ createTest(30);
+ }
+
+ @Test
+ public void test32BitInts() {
+ createTest(32);
+ }
+
+ private void createTest(int width) {
+ final HeaderData hd = new HeaderData("test_data", new MemoryResource(new byte[64], 2, 64));
+ IntegerElement[] e = new IntegerElement[32];
+ for (int a = 0; a < 8; a++) {
+ for (int i = 0; i < width; i++) {
+ int count = 0;
+ int j;
+ // fill all bits before the first Integer Element with 1 bit elements
+ for (int k = 0; k < i; k++) {
+ e[count++] = new IntegerElement(null, "Element@" + k, hd, a, k, k);
+ }
+ for (j = i; j < 33 - width; j += width) {
+ e[count++] = new IntegerElement(null, "Element@" + j, hd, a, j, j + width - 1);
+ }
+ // fill remaining bits with 1 bit signals
+ for (int k = j; k < 32; k++) {
+ e[count++] = new IntegerElement(null, "Element@" + k, hd, a, k, k);
+ }
+ int[] expectedVals = new int[count];
+ Random r = new Random(System.currentTimeMillis());
+
+ for (int l = 0; l <= 255; l++) {
+ /*
+ * perform sets going through the array. We do this so that we can catch sets that modified bits before
+ * the element
+ */
+ generateAscending(r, e, expectedVals, count);
+ check(e, expectedVals, count);
+
+ /*
+ * perform sets going backwards through the array. We do this so that we can catch sets that modified
+ * bits after the element
+ */
+ generateDescending(r, e, expectedVals, count);
+ check(e, expectedVals, count);
+
+ // zeroize test
+ for (int z = 0; z < count; z += 2) {
+ e[z].zeroize();
+ expectedVals[z] = 0;
+ }
+
+ check(e, expectedVals, count);
+ }
+ }
+ }
+ }
+
+ private void generateAscending(Random r, IntegerElement[] e, int[] expectedVals, int length) {
+ for (int i = 0; i < length; i++) {
+ int val = r.nextInt();
+ IntegerElement el = e[i];
+ el.setValue(val);
+ int width = el.getLsb() - el.getMsb() + 1;
+ if (width < 32) {
+ expectedVals[i] = val & (1 << width) - 1;
+ } else {
+ expectedVals[i] = val;
+ }
+ Assert.assertEquals(
+ String.format("set/get fail on %s: msb=%d, lsb=%d", el.getName(), el.getMsb(), el.getLsb()),
+ (Integer) expectedVals[i], el.getValue());
+ }
+ }
+
+ private void generateDescending(Random r, IntegerElement[] e, int[] expectedVals, int length) {
+ for (int i = length - 1; i >= 0; i--) {
+ int val = r.nextInt();
+ IntegerElement el = e[i];
+ el.setValue(val);
+ int width = el.getLsb() - el.getMsb() + 1;
+ if (width < 32) {
+ expectedVals[i] = val & (1 << width) - 1;
+ } else {
+ expectedVals[i] = val;
+ }
+ Assert.assertEquals(
+ String.format("set/get fail on %s: msb=%d, lsb=%d", el.getName(), el.getMsb(), el.getLsb()),
+ Long.toHexString(expectedVals[i]), Long.toHexString(el.getValue()));
+ }
+ }
+
+ private void check(IntegerElement[] e, int[] expectedVals, int length) {
+ for (int i = 0; i < length; i++) {
+ IntegerElement el = e[i];
+ Assert.assertEquals(
+ String.format("corruption detect on %s: msb=%d, lsb=%d", el.getName(), el.getMsb(), el.getLsb()),
+ (Integer) expectedVals[i], el.getValue());
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/LongIntegerElementTest.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/LongIntegerElementTest.java
new file mode 100644
index 000000000..6bcc5c5f3
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/LongIntegerElementTest.java
@@ -0,0 +1,224 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.elements;
+
+import java.util.Random;
+import org.eclipse.osee.ote.message.data.HeaderData;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.elements.LongIntegerElement;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class LongIntegerElementTest {
+ @Test
+ public void test1BitInts() {
+ createLongIntTest(1);
+ }
+
+ @Test
+ public void test2BitInts() {
+ createLongIntTest(2);
+ }
+
+ @Test
+ public void test3BitInts() {
+ createLongIntTest(3);
+ }
+
+ @Test
+ public void test4BitInts() {
+ createLongIntTest(4);
+ }
+
+ @Test
+ public void test5BitInts() {
+ createLongIntTest(5);
+ }
+
+ @Test
+ public void test8BitInts() {
+ createLongIntTest(8);
+ }
+
+ @Test
+ public void test10BitInts() {
+ createLongIntTest(10);
+ }
+
+ @Test
+ public void test12BitInts() {
+ createLongIntTest(12);
+ }
+
+ @Test
+ public void test16BitInts() {
+ createLongIntTest(16);
+ }
+
+ @Test
+ public void test20BitInts() {
+ createLongIntTest(20);
+ }
+
+ @Test
+ public void test22BitInts() {
+ createLongIntTest(22);
+ }
+
+ @Test
+ public void test24BitInts() {
+ createLongIntTest(24);
+ }
+
+ @Test
+ public void test25BitInts() {
+ createLongIntTest(25);
+ }
+
+ @Test
+ public void test26BitInts() {
+ createLongIntTest(26);
+ }
+
+ @Test
+ public void test27BitInts() {
+ createLongIntTest(27);
+ }
+
+ @Test
+ public void test30BitInts() {
+ createLongIntTest(30);
+ }
+
+ @Test
+ public void test31BitInts() {
+ createLongIntTest(31);
+ }
+
+ @Test
+ public void test32BitInts() {
+ createLongIntTest(32);
+ }
+
+ @Test
+ public void test40BitInts() {
+ createLongIntTest(40);
+ }
+
+ @Test
+ public void test48BitInts() {
+ createLongIntTest(48);
+ }
+
+ @Test
+ public void test50BitInts() {
+ createLongIntTest(50);
+ }
+
+ @Test
+ public void test64BitInts() {
+ createLongIntTest(64);
+ }
+
+ private void createLongIntTest(int width) {
+ LongIntegerElement[] e = new LongIntegerElement[64];
+ for (int a = 0; a < 4; a++) {
+ final HeaderData hd = new HeaderData("test_data", new MemoryResource(new byte[64], a, 64));
+ for (int i = 0; i < width; i++) {
+ int count = 0;
+ int j;
+ for (int k = 0; k < i; k++) {
+ e[count++] = new LongIntegerElement(null, "Element@" + k, hd, 0, k, k);
+ }
+ for (j = i; j < 65 - width; j += width) {
+ e[count++] = new LongIntegerElement(null, "Element@" + j, hd, 0, j, j + width - 1);
+ }
+ // fill remaining bits with 1 bit signals
+ for (int k = j; k < 64; k++) {
+ e[count++] = new LongIntegerElement(null, "Element@" + k, hd, 0, k, k);
+ }
+ long[] expectedVals = new long[count];
+ Random r = new Random(System.currentTimeMillis());
+
+ for (int l = 0; l <= 1024; l++) {
+ /*
+ * perform sets going through the array. We do this so that we can catch sets that modified bits before
+ * the element
+ */
+ generateAscending(r, e, expectedVals, count);
+ check(e, expectedVals, count);
+
+ /*
+ * perform sets going backwards through the array. We do this so that we can catch sets that modified
+ * bits after the element
+ */
+ generateDescending(r, e, expectedVals, count);
+ check(e, expectedVals, count);
+
+ // zeroize test
+ for (int z = 0; z < count; z += 2) {
+ e[z].zeroize();
+ expectedVals[z] = 0;
+ }
+
+ check(e, expectedVals, count);
+ }
+ }
+ }
+ }
+
+ private void generateAscending(Random r, LongIntegerElement[] e, long[] expectedVals, int length) {
+ for (int i = 0; i < length; i++) {
+ long val = r.nextLong();
+ LongIntegerElement el = e[i];
+ el.setValue(val);
+ int width = el.getLsb() - el.getMsb() + 1;
+ if (width < 64) {
+ expectedVals[i] = val & (1L << width) - 1L;
+ } else {
+ expectedVals[i] = val;
+ }
+ Assert.assertEquals(
+ String.format("set/get fail on %s: msb=%d, lsb=%d", el.getName(), el.getMsb(), el.getLsb()),
+ Long.toHexString(expectedVals[i]), Long.toHexString(el.getValue()));
+ }
+ }
+
+ private void generateDescending(Random r, LongIntegerElement[] e, long[] expectedVals, int length) {
+ for (int i = length - 1; i >= 0; i--) {
+ long val = r.nextLong();
+ LongIntegerElement el = e[i];
+ el.setValue(val);
+ int width = el.getLsb() - el.getMsb() + 1;
+ if (width < 64) {
+ expectedVals[i] = val & (1l << width) - 1l;
+ } else {
+ expectedVals[i] = val;
+ }
+ Assert.assertEquals(
+ String.format("set/get fail on %s: msb=%d, lsb=%d", el.getName(), el.getMsb(), el.getLsb()),
+ (Long) expectedVals[i], el.getValue());
+ }
+ }
+
+ private void check(LongIntegerElement[] e, long[] expectedVals, int length) {
+ for (int i = 0; i < length; i++) {
+ LongIntegerElement el = e[i];
+ Assert.assertEquals(
+ String.format("corruption detect on %s: msb=%d, lsb=%d", el.getName(), el.getMsb(), el.getLsb()),
+ (Long) expectedVals[i], e[i].getValue());
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/RecordMapTest.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/RecordMapTest.java
new file mode 100644
index 000000000..255927d76
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/RecordMapTest.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.elements;
+
+import org.eclipse.osee.ote.message.mock.TestMessage;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class RecordMapTest {
+
+ @Test
+ public void testGetInt() {
+ TestMessage msg = new TestMessage();
+
+ // Testing below the boundary.
+ try {
+ msg.RECORD_MAP_1.get(1);
+ Assert.assertTrue(true);
+ } catch (IllegalArgumentException ex) {
+ Assert.fail("We shouldn't get an exception for this get!");
+ }
+
+ // Testing on the boundary.
+ try {
+ msg.RECORD_MAP_1.get(2);
+ Assert.fail("We should get an exception for this get on the boundary!");
+ } catch (IllegalArgumentException ex) {
+ Assert.assertTrue("We should get an exception for this index", true);
+ }
+ // Testing above the boundary.
+ try {
+ msg.RECORD_MAP_1.get(3);
+ Assert.fail("We should get an exception for this get above the boundary!");
+ } catch (IllegalArgumentException ex) {
+ Assert.assertTrue("We should get an exception for this index", true);
+ }
+
+ }
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/SignedInteger16ElementTest.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/SignedInteger16ElementTest.java
new file mode 100644
index 000000000..59ff96a9f
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/SignedInteger16ElementTest.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.elements;
+
+import org.eclipse.osee.ote.message.data.HeaderData;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.elements.SignedInteger16Element;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class SignedInteger16ElementTest {
+
+ @Test
+ public void test1() {
+ final HeaderData hd1 = new HeaderData("test_data 1", new MemoryResource(new byte[64], 0, 64));
+ final HeaderData hd2 = new HeaderData("test_data 2", new MemoryResource(new byte[64], 2, 64));
+ SignedInteger16Element element1 = new SignedInteger16Element(null, "Element1", hd1, 0, 0, 15);
+ SignedInteger16Element element2 = new SignedInteger16Element(null, "Element2", hd2, 0, 0, 15);
+
+ int val1 = -1000;
+ int val2 = 2000;
+ element1.setValue(val1);
+ check(element1, val1);
+ element1.setValue(val2);
+ check(element1, val2);
+
+ element2.setValue(val1);
+ check(element2, val1);
+ element2.setValue(val2);
+ check(element2, val2);
+ }
+
+ @Test
+ public void test2() {
+ final HeaderData hd1 = new HeaderData("test_data 1", new MemoryResource(new byte[64], 0, 64));
+ final HeaderData hd2 = new HeaderData("test_data 2", new MemoryResource(new byte[64], 2, 64));
+ SignedInteger16Element element1 = new SignedInteger16Element(null, "Element1", hd1, 0, 16, 31);
+ SignedInteger16Element element2 = new SignedInteger16Element(null, "Element2", hd2, 0, 16, 31);
+
+ int val1 = -10000;
+ int val2 = 2100;
+ element1.setValue(val1);
+ check(element1, val1);
+ element1.setValue(val2);
+ check(element1, val2);
+
+ element2.setValue(val1);
+ check(element2, val1);
+ element2.setValue(val2);
+ check(element2, val2);
+ }
+
+ private void check(SignedInteger16Element e, int expectedVals) {
+ Assert.assertEquals(
+ String.format("corruption detect on %s: msb=%d, lsb=%d", e.getName(), e.getMsb(), e.getLsb()),
+ (Integer) expectedVals, e.getValue());
+ }
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/StringElementTest.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/StringElementTest.java
new file mode 100644
index 000000000..1123f809e
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/elements/StringElementTest.java
@@ -0,0 +1,190 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.elements;
+
+import static org.junit.Assert.assertEquals;
+import java.util.Arrays;
+import org.eclipse.osee.ote.message.data.HeaderData;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class StringElementTest {
+ @Test
+ public void testZeroize() {
+ for (int i = 0; i < 10; i++) {
+ final HeaderData hd = new HeaderData("test_data", new MemoryResource(new byte[128], i, 128));
+ StringElement e1 = new StringElement(null, "test string1", hd, 0, 0, 8 * 10 - 1);
+ StringElement e2 = new StringElement(null, "test string2", hd, 10, 0, 8 * 10 - 1);
+ StringElement e3 = new StringElement(null, "test string3", hd, 20, 0, 8 * 10 - 1);
+
+ String s1 = "aaaa bb c";
+ String s2 = "zeroizing2";
+ String s3 = "1234567890";
+
+ e1.setValue(s1);
+ e2.setValue(s2);
+ e3.setValue(s3);
+
+ check(e1, s1);
+ check(e2, s2);
+ check(e3, s3);
+
+ e2.zeroize();
+ checkEmpty(e2);
+
+ check(e1, s1);
+ check(e2, "");
+ check(e3, s3);
+
+ e2.setValue(s2);
+ e1.zeroize();
+ checkEmpty(e1);
+
+ check(e1, "");
+ check(e2, s2);
+ check(e3, s3);
+
+ e1.setValue(s1);
+ e3.zeroize();
+
+ check(e1, s1);
+ check(e2, s2);
+ check(e3, "");
+ }
+ }
+
+ @Test
+ public void testStringsTooBig() {
+ for (int i = 0; i < 10; i++) {
+ final HeaderData hd = new HeaderData("test_data", new MemoryResource(new byte[128], i, 128));
+
+ String s1 = "aaaa bb c";
+ String s2 = "zeroizing2";
+ String s3 = "1234567890";
+ for (int j = 1; j < 10; j++) {
+ StringElement e1 = new StringElement(null, "test string1", hd, 0, 0, 8 * j - 1);
+ StringElement e2 = new StringElement(null, "test string2", hd, 10, 0, 8 * j - 1);
+ StringElement e3 = new StringElement(null, "test string3", hd, 20, 0, 8 * j - 1);
+
+ e1.setValue(s1);
+ e2.setValue(s2);
+ e3.setValue(s3);
+
+ check(e1, s1.substring(0, j));
+ check(e2, s2.substring(0, j));
+ check(e3, s3.substring(0, j));
+
+ e3.setValue(s3);
+ e2.setValue(s2);
+ e1.setValue(s1);
+
+ check(e1, s1.substring(0, j));
+ check(e2, s2.substring(0, j));
+ check(e3, s3.substring(0, j));
+ }
+ }
+ }
+
+ @Test
+ public void testStringsTooSmall() {
+ for (int i = 0; i < 10; i++) {
+ final HeaderData hd = new HeaderData("test_data", new MemoryResource(new byte[128], i, 128));
+ StringElement e1 = new StringElement(null, "test string1", hd, 0, 0, 8 * 10 - 1);
+ StringElement e2 = new StringElement(null, "test string2", hd, 10, 0, 8 * 10 - 1);
+ StringElement e3 = new StringElement(null, "test string3", hd, 20, 0, 8 * 10 - 1);
+ String ss1 = "aaaa bb c";
+ String ss2 = "zeroizing2";
+ String ss3 = "1234567890";
+ for (int j = 1; j <= 10; j++) {
+ String s1 = ss1.substring(0, j);
+ String s2 = ss2.substring(0, j);
+ String s3 = ss3.substring(0, j);
+ e1.setValue(s1);
+ e2.setValue(s2);
+ e3.setValue(s3);
+
+ check(e1, s1);
+ check(e2, s2);
+ check(e3, s3);
+
+ e3.setValue(s3);
+ e2.setValue(s2);
+ e1.setValue(s1);
+
+ check(e1, s1);
+ check(e2, s2);
+ check(e3, s3);
+ }
+ }
+ }
+
+ @Test
+ public void testSetChars() {
+ final char[] testData = {'A', 'B', '\0', 'C', 'D'};
+ final MessageData hd = new HeaderData("test_data", new MemoryResource(new byte[5], 0, 5));
+ final StringElement sut = new StringElement(null, "test string element", hd, 0, 0, 8 * 5 - 1);
+ assertEquals("Empty string to start", "", sut.getValue());
+ sut.setChars(testData);
+ assertEquals("New value is cut off by the null", "AB", sut.getValue());
+ char[] result = new char[5];
+ assertEquals("Five bytes in, five bytes back", 5, sut.getChars(result));
+ assertEquals("Exact same array comes back with getChars()", Arrays.toString(testData), Arrays.toString(result));
+ }
+
+ @Test
+ public void testSetCharsOverflow() {
+ final char[] testData = {'A', 'B', '\0', 'C', 'D', 'E'};
+ // buffer is big enough for test data
+ final MessageData hd = new HeaderData("test_data", new MemoryResource(new byte[6], 0, 6));
+ // element is not big enough for test data
+ final StringElement sut = new StringElement(null, "test string element", hd, 0, 0, 8 * 5 - 1);
+ assertEquals("Empty string to start", "", sut.getValue());
+ sut.setChars(testData);
+ assertEquals("New value is cut off by the null", "AB", sut.getValue());
+ char[] result = new char[5];
+ assertEquals("Five bytes in, five bytes back", 5, sut.getChars(result));
+ final char[] expected = {'A', 'B', '\0', 'C', 'D'};
+ assertEquals("Exact same array comes back with getChars()", Arrays.toString(expected), Arrays.toString(result));
+ }
+
+ @Test
+ public void testSetCharsUnderflow() {
+ final char[] testData = {'A', 'B', '\0', 'C'};
+ // buffer is big enough for test data
+ final MessageData hd = new HeaderData("test_data", new MemoryResource(new byte[5], 0, 5));
+ // element is not big enough for test data
+ final StringElement sut = new StringElement(null, "test string element", hd, 0, 0, 8 * 5 - 1);
+ assertEquals("Empty string to start", "", sut.getValue());
+ sut.setChars(testData);
+ assertEquals("New value is cut off by the null", "AB", sut.getValue());
+ char[] result = new char[5];
+ assertEquals("Five bytes in, five bytes back", 5, sut.getChars(result));
+ final char[] expected = {'A', 'B', '\0', 'C', '\0'};
+ assertEquals("Exact same array comes back with getChars()", Arrays.toString(expected), Arrays.toString(result));
+ }
+
+ private void check(StringElement elem, String value) {
+ if (!elem.getValue().equals(value)) {
+ Assert.assertEquals(elem.getName(), value, elem.getValue());
+ }
+ }
+
+ private void checkEmpty(StringElement elem) {
+ if (!elem.isEmpty()) {
+ Assert.assertEquals(elem.getName(), "rmpty", "not empty");
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/ISequenceHandle.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/ISequenceHandle.java
new file mode 100644
index 000000000..6c5b425d4
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/ISequenceHandle.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.mock;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface ISequenceHandle {
+ boolean waitForEndSequence(long timoeut, TimeUnit timeUnit) throws InterruptedException;
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/SequenceHandle.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/SequenceHandle.java
new file mode 100644
index 000000000..4b510086a
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/SequenceHandle.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.mock;
+
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * @author Ken J. Aguilar
+ */
+class SequenceHandle implements ISequenceHandle {
+
+ private final ReentrantLock lock = new ReentrantLock();
+ private final Condition endSequenceCondition = lock.newCondition();
+ private boolean endSequence = false;
+
+ @Override
+ public boolean waitForEndSequence(long timeout, TimeUnit timeUnit) throws InterruptedException {
+ lock.lock();
+ long nanos = timeUnit.toNanos(timeout);
+ try {
+ while (!endSequence) {
+ if (nanos > 0) {
+ nanos = endSequenceCondition.awaitNanos(nanos);
+ } else {
+ return false;
+ }
+ }
+ return true;
+ } finally {
+ lock.unlock();
+ }
+ }
+
+ void signalEndSequence() {
+ lock.lock();
+ try {
+ endSequence = true;
+ endSequenceCondition.signalAll();
+ } finally {
+ lock.unlock();
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/TestEnum.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/TestEnum.java
new file mode 100644
index 000000000..34b019223
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/TestEnum.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.mock;
+
+import org.eclipse.osee.ote.message.elements.IEnumValue;
+
+public enum TestEnum implements IEnumValue<TestEnum> {
+ VAL_0,
+ VAL_1,
+ VAL_2,
+ VAL_3,
+ VAL_4,
+ VAL_5,
+ VAL_6,
+ VAL_7,
+ VAL_8,
+ VAL_9,
+ VAL_10;
+
+ @Override
+ public TestEnum getEnum(int value) {
+ if (value < 0 || value >= values().length) {
+ throw new IllegalArgumentException("no enum matching value of " + value);
+ }
+ return values()[value];
+ }
+
+ @Override
+ public int getIntValue() {
+ return ordinal();
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/TestMemType.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/TestMemType.java
new file mode 100644
index 000000000..8d7d94ee3
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/TestMemType.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.mock;
+
+import org.eclipse.osee.ote.message.enums.DataType;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public enum TestMemType implements DataType {
+ ETHERNET,
+ SERIAL;
+
+ @Override
+ public int getToolingBufferSize() {
+ return 0;
+ }
+
+ @Override
+ public int getToolingDepth() {
+ return 0;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/TestMessage.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/TestMessage.java
new file mode 100644
index 000000000..7172e89b5
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/TestMessage.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.mock;
+
+import java.util.Collection;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.EnumeratedElement;
+import org.eclipse.osee.ote.message.elements.Float32Element;
+import org.eclipse.osee.ote.message.elements.IRecordFactory;
+import org.eclipse.osee.ote.message.elements.IntegerElement;
+import org.eclipse.osee.ote.message.elements.RecordElement;
+import org.eclipse.osee.ote.message.elements.RecordMap;
+import org.eclipse.osee.ote.message.elements.StringElement;
+
+public class TestMessage extends Message<UnitTestAccessor, TestMessageData, TestMessage> {
+
+ public final IntegerElement INT_ELEMENT_1;
+ public final StringElement STRING_ELEMENT_1;
+ public final EnumeratedElement<TestEnum> ENUM_ELEMENT_1;
+ public final Float32Element FLOAT32_ELEMENT_1;
+ public final RecordMap<TestRecordElement> RECORD_MAP_1;
+
+ public TestMessage() {
+ super("TEST_MSG", 100, 0, true, 0, 50.0);
+ TestMessageData ethData =
+ new TestMessageData(this.getClass().getName(), getName(), getDefaultByteSize(), getDefaultOffset(),
+ TestMemType.ETHERNET);
+ new TestMessageData(this.getClass().getName(), getName(), getDefaultByteSize(), getDefaultOffset(),
+ TestMemType.SERIAL);
+ setDefaultMessageData(ethData);
+ INT_ELEMENT_1 = new IntegerElement(this, "INT_ELEMENT_1", ethData, 0, 0, 15);
+ STRING_ELEMENT_1 = new StringElement(this, "STRING_ELEMENT_1", ethData, 2, 0, 159);
+ ENUM_ELEMENT_1 = new EnumeratedElement<>(this, "ENUM_ELEMENT_1", TestEnum.class, ethData, 22, 0, 7);
+ FLOAT32_ELEMENT_1 = new Float32Element(this, "FLOAT32_ELEMENT_1", ethData, 23, 0, 31);
+ RECORD_MAP_1 =
+ new RecordMap<TestRecordElement>(this, ethData, "RECORD_MAP_1", 2, new RECORD_MAP_1_factory(ethData));
+ addElements(INT_ELEMENT_1, STRING_ELEMENT_1, ENUM_ELEMENT_1, FLOAT32_ELEMENT_1, RECORD_MAP_1);
+ setMemSource(TestMemType.ETHERNET);
+ }
+
+ @Override
+ public void switchElementAssociation(Collection<TestMessage> messages) {
+
+ }
+
+ public class RECORD_MAP_1_factory implements IRecordFactory {
+ private final MessageData data;
+
+ public RECORD_MAP_1_factory(MessageData data) {
+ this.data = data;
+ }
+
+ @Override
+ public RecordElement create(int i) {
+ TestRecordElement temp =
+ new TestRecordElement(TestMessage.this, "RECORD_MAP_1", i, getBitOffset() + 0, this.data);
+ temp.addPath(RECORD_MAP_1.getElementPath().toArray());
+ return temp;
+ }
+
+ @Override
+ public int getBitLength() {
+ return 512;
+ }
+
+ }
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/TestMessageData.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/TestMessageData.java
new file mode 100644
index 000000000..3bfdb01e0
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/TestMessageData.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.mock;
+
+import org.eclipse.osee.ote.message.IMessageHeader;
+import org.eclipse.osee.ote.message.data.IMessageDataVisitor;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.enums.DataType;
+
+public class TestMessageData extends MessageData {
+
+ public TestMessageData(String typeName, String name, int dataByteSize, int offset, DataType memType) {
+ super(typeName, name, dataByteSize, offset, memType);
+ }
+
+ @Override
+ public IMessageHeader getMsgHeader() {
+ return null;
+ }
+
+ @Override
+ public void initializeDefaultHeaderValues() {
+
+ }
+
+ @Override
+ public void visit(IMessageDataVisitor visitor) {
+
+ }
+
+ @Override
+ public void zeroize() {
+
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/TestRecordElement.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/TestRecordElement.java
new file mode 100644
index 000000000..f545a342c
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/TestRecordElement.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.mock;
+
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.RecordElement;
+
+public class TestRecordElement extends RecordElement {
+
+ public TestRecordElement(Message message, String name, int index, int bitOffset, MessageData messageData) {
+ super(message, name, index, messageData, bitOffset, 152);
+ }
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/UnitTestAccessor.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/UnitTestAccessor.java
new file mode 100644
index 000000000..4969cd494
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/UnitTestAccessor.java
@@ -0,0 +1,668 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.mock;
+
+import java.util.HashMap;
+import java.util.ResourceBundle;
+import java.util.Set;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+import java.util.logging.Filter;
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+import java.util.logging.Logger;
+
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.eclipse.osee.ote.core.MethodFormatter;
+import org.eclipse.osee.ote.core.TestCase;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.environment.EnvironmentTask;
+import org.eclipse.osee.ote.core.environment.ReportDataControl;
+import org.eclipse.osee.ote.core.environment.ScriptControl;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.command.CommandDescription;
+import org.eclipse.osee.ote.core.environment.interfaces.BasicTimeout;
+import org.eclipse.osee.ote.core.environment.interfaces.ICancelTimer;
+import org.eclipse.osee.ote.core.environment.interfaces.IExecutionUnitManagement;
+import org.eclipse.osee.ote.core.environment.interfaces.IReportData;
+import org.eclipse.osee.ote.core.environment.interfaces.IScriptControl;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestLogger;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestPoint;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestStation;
+import org.eclipse.osee.ote.core.environment.interfaces.ITimeout;
+import org.eclipse.osee.ote.core.environment.interfaces.ITimerControl;
+import org.eclipse.osee.ote.core.environment.status.CommandEndedStatusEnum;
+import org.eclipse.osee.ote.core.framework.IRunManager;
+import org.eclipse.osee.ote.core.log.ITestPointTally;
+import org.eclipse.osee.ote.core.log.TestLogger;
+import org.eclipse.osee.ote.core.log.record.TestPointRecord;
+import org.eclipse.osee.ote.core.log.record.TestRecord;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.interfaces.IMessageManager;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+import org.eclipse.osee.ote.message.interfaces.ITestEnvironmentMessageSystemAccessor;
+
+public class UnitTestAccessor implements ITestEnvironmentMessageSystemAccessor, ITestAccessor {
+ private final HashMap<EnvironmentTask, ScheduledFuture<?>> handleMap =
+ new HashMap<EnvironmentTask, ScheduledFuture<?>>(32);
+ private final ScheduledExecutorService executor =
+ Executors.newScheduledThreadPool(Runtime.getRuntime().availableProcessors());
+ private final IScriptControl scriptCtrl = new ScriptControl();
+ private final IReportData reportData = new ReportDataControl();
+ private final ITestLogger testLogger = new TestLogger() {
+
+ @Override
+ public void attention(ITestEnvironmentAccessor source, String message) {
+
+ }
+
+ @Override
+ public void debug(ITestEnvironmentAccessor source, String message, boolean timeStamp) {
+
+ }
+
+ @Override
+ public void debug(ITestEnvironmentAccessor source, String message) {
+
+ }
+
+ @Override
+ public void log(TestRecord record) {
+
+ }
+
+ @Override
+ public void methodCalled(ITestEnvironmentAccessor source, MethodFormatter arguments, int methodCount) {
+
+ }
+
+ @Override
+ public void methodCalled(ITestEnvironmentAccessor source, MethodFormatter arguments) {
+
+ }
+
+ @Override
+ public void methodCalled(ITestEnvironmentAccessor source) {
+
+ }
+
+ @Override
+ public void methodCalledOnObject(ITestEnvironmentAccessor source, String objectName, MethodFormatter arguments, int methodCount) {
+
+ }
+
+ @Override
+ public void methodCalledOnObject(ITestEnvironmentAccessor source, String objectName, MethodFormatter methodFormat, Xmlizable xmlObject) {
+
+ }
+
+ @Override
+ public void methodCalledOnObject(ITestEnvironmentAccessor source, String objectName, MethodFormatter methodFormat) {
+
+ }
+
+ @Override
+ public void methodCalledOnObject(ITestEnvironmentAccessor source, String objectName) {
+
+ }
+
+ @Override
+ public void methodEnded(ITestEnvironmentAccessor source) {
+
+ }
+
+ @Override
+ public void requirement(ITestEnvironmentAccessor source, String message) {
+
+ }
+
+ @Override
+ public void severe(ITestEnvironmentAccessor source, String message) {
+
+ }
+
+ @Override
+ public void severe(Object source, Throwable thrown) {
+
+ }
+
+ @Override
+ public void support(ITestEnvironmentAccessor source, String message) {
+
+ }
+
+ @Override
+ public void testCaseBegan(TestCase testCase) {
+
+ }
+
+ @Override
+ public void testpoint(ITestEnvironmentAccessor env, TestScript script, TestCase testCase, boolean passed, String testPointName, String exp, String act) {
+
+ }
+
+ @Override
+ public void testpoint(ITestEnvironmentAccessor env, TestScript script, TestCase testCase, ITestPoint testPoint) {
+
+ }
+
+ @Override
+ public void testpoint(TestPointRecord record) {
+
+ }
+
+ @Override
+ public void warning(ITestEnvironmentAccessor source, String message) {
+
+ }
+
+ @Override
+ public synchronized void addHandler(Handler handler) throws SecurityException {
+
+ }
+
+ @Override
+ public void config(String msg) {
+
+ }
+
+ @Override
+ public void entering(String sourceClass, String sourceMethod) {
+
+ }
+
+ @Override
+ public void entering(String sourceClass, String sourceMethod, Object param1) {
+
+ }
+
+ @Override
+ public void entering(String sourceClass, String sourceMethod, Object[] params) {
+
+ }
+
+ @Override
+ public void exiting(String sourceClass, String sourceMethod) {
+
+ }
+
+ @Override
+ public void exiting(String sourceClass, String sourceMethod, Object result) {
+
+ }
+
+ @Override
+ public void fine(String msg) {
+
+ }
+
+ @Override
+ public void finer(String msg) {
+
+ }
+
+ @Override
+ public void finest(String msg) {
+
+ }
+
+ @Override
+ public Filter getFilter() {
+ return super.getFilter();
+ }
+
+ @Override
+ public synchronized Handler[] getHandlers() {
+ return super.getHandlers();
+ }
+
+ @Override
+ public Level getLevel() {
+ return super.getLevel();
+ }
+
+ @Override
+ public String getName() {
+ return super.getName();
+ }
+
+ @Override
+ public Logger getParent() {
+ return super.getParent();
+ }
+
+ @Override
+ public ResourceBundle getResourceBundle() {
+ return super.getResourceBundle();
+ }
+
+ @Override
+ public String getResourceBundleName() {
+ return super.getResourceBundleName();
+ }
+
+ @Override
+ public synchronized boolean getUseParentHandlers() {
+ return super.getUseParentHandlers();
+ }
+
+ @Override
+ public void info(String msg) {
+ super.info(msg);
+ }
+
+ @Override
+ public boolean isLoggable(Level level) {
+ return super.isLoggable(level);
+ }
+
+ @Override
+ public void log(LogRecord record) {
+ super.log(record);
+ }
+
+ @Override
+ public void log(Level level, String msg) {
+ super.log(level, msg);
+ }
+
+ @Override
+ public void log(Level level, String msg, Object param1) {
+ super.log(level, msg, param1);
+ }
+
+ @Override
+ public void log(Level level, String msg, Object[] params) {
+ super.log(level, msg, params);
+ }
+
+ @Override
+ public void log(Level level, String msg, Throwable thrown) {
+ super.log(level, msg, thrown);
+ }
+
+ @Override
+ public void logp(Level level, String sourceClass, String sourceMethod, String msg) {
+ super.logp(level, sourceClass, sourceMethod, msg);
+ }
+
+ @Override
+ public void logp(Level level, String sourceClass, String sourceMethod, String msg, Object param1) {
+ super.logp(level, sourceClass, sourceMethod, msg, param1);
+ }
+
+ @Override
+ public void logp(Level level, String sourceClass, String sourceMethod, String msg, Object[] params) {
+ super.logp(level, sourceClass, sourceMethod, msg, params);
+ }
+
+ @Override
+ public void logp(Level level, String sourceClass, String sourceMethod, String msg, Throwable thrown) {
+ super.logp(level, sourceClass, sourceMethod, msg, thrown);
+ }
+
+ @Override
+ public void logrb(Level level, String sourceClass, String sourceMethod, String bundleName, String msg) {
+ super.logrb(level, sourceClass, sourceMethod, bundleName, msg);
+ }
+
+ @Override
+ public void logrb(Level level, String sourceClass, String sourceMethod, String bundleName, String msg, Object param1) {
+ super.logrb(level, sourceClass, sourceMethod, bundleName, msg, param1);
+ }
+
+ @Override
+ public void logrb(Level level, String sourceClass, String sourceMethod, String bundleName, String msg, Object[] params) {
+ super.logrb(level, sourceClass, sourceMethod, bundleName, msg, params);
+ }
+
+ @Override
+ public void logrb(Level level, String sourceClass, String sourceMethod, String bundleName, String msg, Throwable thrown) {
+ super.logrb(level, sourceClass, sourceMethod, bundleName, msg, thrown);
+ }
+
+ @Override
+ public synchronized void removeHandler(Handler handler) throws SecurityException {
+ super.removeHandler(handler);
+ }
+
+ @Override
+ public void setFilter(Filter newFilter) throws SecurityException {
+ super.setFilter(newFilter);
+ }
+
+ @Override
+ public void setLevel(Level newLevel) throws SecurityException {
+ super.setLevel(newLevel);
+ }
+
+ @Override
+ public void setParent(Logger parent) {
+ super.setParent(parent);
+ }
+
+ @Override
+ public synchronized void setUseParentHandlers(boolean useParentHandlers) {
+ super.setUseParentHandlers(useParentHandlers);
+ }
+
+ @Override
+ public void severe(String msg) {
+ super.severe(msg);
+ }
+
+ @Override
+ public void throwing(String sourceClass, String sourceMethod, Throwable thrown) {
+ super.throwing(sourceClass, sourceMethod, thrown);
+ }
+
+ @Override
+ public void warning(String msg) {
+ super.warning(msg);
+ }
+
+ @Override
+ protected Object clone() throws CloneNotSupportedException {
+ return super.clone();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ return super.equals(obj);
+ }
+
+ @Override
+ protected void finalize() throws Throwable {
+ super.finalize();
+ }
+
+ @Override
+ public int hashCode() {
+ return super.hashCode();
+ }
+
+ @Override
+ public String toString() {
+ return super.toString();
+ }
+
+ };
+
+ private final ITimerControl timerCtrl = new ITimerControl() {
+
+ @Override
+ public void addTask(final EnvironmentTask task, TestEnvironment environment) {
+ final ScheduledFuture<?> handle = schedulePeriodicTask(new Runnable() {
+ @Override
+ public void run() {
+
+ try {
+ if (task.isRunning()) {
+ task.runOneCycle();
+ }
+ } catch (Throwable ex) {
+ ScheduledFuture<?> h = handleMap.get(task);
+ if (h != null) {
+ h.cancel(false);
+ }
+ ex.printStackTrace(System.err);
+ }
+ }
+
+ }, 0, (long) Math.rint(1000.0 / task.getHzRate()));
+ handleMap.put(task, handle);
+ }
+
+ @Override
+ public void cancelAllTasks() {
+ for (ScheduledFuture<?> handle : handleMap.values()) {
+ handle.cancel(false);
+ }
+ handleMap.clear();
+ }
+
+ @Override
+ public void cancelTimers() {
+ executor.shutdown();
+ }
+
+ @Override
+ public void dispose() {
+
+ }
+
+ @Override
+ public void envWait(ITimeout obj, int milliseconds) throws InterruptedException {
+ synchronized (obj) {
+ obj.wait(milliseconds);
+ }
+ }
+
+ @Override
+ public void envWait(int milliseconds) throws InterruptedException {
+ envWait(new BasicTimeout(), milliseconds);
+ }
+
+ @Override
+ public int getCycleCount() {
+ return (int) System.currentTimeMillis() / 20;
+ }
+
+ @Override
+ public long getEnvTime() {
+ return System.currentTimeMillis();
+ }
+
+ @Override
+ public void incrementCycleCount() {
+
+ }
+
+ @Override
+ public void removeTask(final EnvironmentTask task) {
+ ScheduledFuture<?> handle = handleMap.remove(task);
+ if (handle != null) {
+ handle.cancel(false);
+ }
+ }
+
+ @Override
+ public void setCycleCount(int cycle) {
+
+ }
+
+ @Override
+ public ICancelTimer setTimerFor(final ITimeout objToNotify, int milliseconds) {
+ objToNotify.setTimeout(false);
+ final ScheduledFuture<?> handle = scheduleOneShotTask(new Runnable() {
+
+ @Override
+ public void run() {
+ synchronized (objToNotify) {
+ objToNotify.setTimeout(true);
+ objToNotify.notify();
+ }
+ }
+ }, milliseconds);
+
+ return new ICancelTimer() {
+
+ @Override
+ public void cancelTimer() {
+ handle.cancel(false);
+ }
+ };
+ }
+
+ @Override
+ public void step() {
+
+ }
+
+ @Override
+ public long getTimeOfDay() {
+ return 0;
+ }
+
+ @Override
+ public void setRunManager(IRunManager runManager) {
+ }
+
+ @Override
+ public IRunManager getRunManager() {
+ return null;
+ }
+
+ @Override
+ public boolean isRealtime() {
+ return false;
+ }
+
+ };
+
+ public UnitTestAccessor() {
+
+ }
+
+ @Override
+ public IMessageManager getMsgManager() {
+ return null;
+ }
+
+ @Override
+ public boolean isPhysicalTypeAvailable(DataType physicalType) {
+ return physicalType == TestMemType.ETHERNET;
+ }
+
+ @Override
+ public void abortTestScript() {
+
+ }
+
+ @Override
+ public void abortTestScript(Throwable t) {
+
+ }
+
+ @Override
+ public boolean addTask(final EnvironmentTask task) {
+ timerCtrl.addTask(task, null);
+ return true;
+ }
+
+ public void addRunnable(Runnable r) {
+
+ }
+
+ @Override
+ public void associateObject(Class<?> c, Object obj) {
+
+ }
+
+ @Override
+ public Object getAssociatedObject(Class<?> c) {
+ return null;
+ }
+
+ @Override
+ public Set<Class<?>> getAssociatedObjects() {
+
+ return null;
+ }
+
+ public ITestPointTally getAttachedTestPointTally(TestScript script) {
+
+ return null;
+ }
+
+ @Override
+ public long getEnvTime() {
+ return timerCtrl.getEnvTime();
+ }
+
+ @Override
+ public IExecutionUnitManagement getExecutionUnitManagement() {
+ return null;
+ }
+
+ @Override
+ public ITestLogger getLogger() {
+ return testLogger;
+ }
+
+ @Override
+ public IScriptControl getScriptCtrl() {
+ return scriptCtrl;
+ }
+
+ @Override
+ public TestScript getTestScript() {
+ return null;
+ }
+
+ @Override
+ public ITestStation getTestStation() {
+ return null;
+ }
+
+ @Override
+ public ITimerControl getTimerCtrl() {
+ return timerCtrl;
+ }
+
+ @Override
+ public void onScriptComplete() throws InterruptedException {
+
+ }
+
+ @Override
+ public void onScriptSetup() {
+
+ }
+
+ public void setSequentialCmdFinished(CommandDescription description, CommandEndedStatusEnum status) throws Exception {
+
+ }
+
+ @Override
+ public ICancelTimer setTimerFor(ITimeout listener, int time) {
+ return timerCtrl.setTimerFor(listener, time);
+ }
+
+ public ScheduledFuture<?> schedulePeriodicTask(Runnable task, long initialDelay, long period) {
+ return executor.scheduleAtFixedRate(task, initialDelay, period, TimeUnit.MILLISECONDS);
+ }
+
+ public ScheduledFuture<?> scheduleOneShotTask(Runnable task, long delay) {
+ return executor.schedule(task, delay, TimeUnit.MILLISECONDS);
+ }
+
+ public void shutdown() {
+ timerCtrl.cancelAllTasks();
+ timerCtrl.cancelTimers();
+ }
+
+ @Override
+ public TestCase getTestCase() {
+
+ return null;
+ }
+
+ @Override
+ public Set<DataType> getDataTypes() {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/UnitTestSupport.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/UnitTestSupport.java
new file mode 100644
index 000000000..70fe316d2
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/mock/UnitTestSupport.java
@@ -0,0 +1,439 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.mock;
+
+import java.util.Random;
+import java.util.concurrent.CancellationException;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+import org.junit.Assert;
+import org.eclipse.osee.ote.core.TestException;
+import org.eclipse.osee.ote.core.environment.EnvironmentTask;
+import org.eclipse.osee.ote.core.testPoint.CheckGroup;
+import org.eclipse.osee.ote.core.testPoint.CheckPoint;
+import org.eclipse.osee.ote.core.testPoint.Operation;
+import org.eclipse.osee.ote.message.MessageSystemException;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.DiscreteElement;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.listener.IOSEEMessageListener;
+
+public class UnitTestSupport {
+
+ private final UnitTestAccessor accessor = new UnitTestAccessor();
+ private final Random rand = new Random();
+
+ public UnitTestSupport() {
+
+ }
+
+ public void activateMsg(final TestMessage msg) {
+ accessor.addTask(new EnvironmentTask(msg.getRate(), 0) {
+
+ @Override
+ public void runOneCycle() throws InterruptedException, TestException {
+ TestMessageData data = msg.getActiveDataSource();
+ data.incrementActivityCount();
+ data.notifyListeners();
+
+ }
+
+ });
+ }
+
+ public void cleanup() {
+ accessor.shutdown();
+ }
+
+ public <T extends Comparable<T>> void setAfter(final DiscreteElement<T> element, final T value, int millis) {
+ accessor.scheduleOneShotTask(new Runnable() {
+
+ @Override
+ public void run() {
+ element.setValue(value);
+ }
+
+ }, millis);
+ }
+
+ public <T extends Comparable<T>> void maintain(final DiscreteElement<T> element, final T value, final T postValue, int millis) {
+ element.setValue(value);
+ accessor.scheduleOneShotTask(new Runnable() {
+
+ @Override
+ public void run() {
+ element.setValue(postValue);
+ }
+
+ }, millis);
+ }
+
+ public <T extends Comparable<T>> ISequenceHandle setSequence(final DiscreteElement<T> element, final T[] sequence) throws InterruptedException {
+ final SequenceHandle seqHandle = new SequenceHandle();
+ element.setValue(sequence[0]);
+ IOSEEMessageListener listener = new IOSEEMessageListener() {
+ int index = 1;
+
+ @Override
+ public void onDataAvailable(MessageData data, DataType type) throws MessageSystemException {
+ if (index < sequence.length) {
+ element.setValue(sequence[index]);
+ System.out.println(element.getName() + " is now " + element.getValue());
+ index++;
+ } else {
+ element.getMessage().removeListener(this);
+ seqHandle.signalEndSequence();
+ }
+ }
+
+ @Override
+ public void onInitListener() throws MessageSystemException {
+
+ }
+
+ };
+
+ // wait for a transmission so that the sequence begins on transimssion edges
+ element.getMessage().waitForTransmission(accessor);
+ element.getMessage().addListener(listener);
+ return seqHandle;
+ }
+
+ public <T extends Comparable<T>> ScheduledFuture<?> maintainRandomizedList(final DiscreteElement<T> element, final T[] values, int millis) {
+ element.setValue(values[0]);
+ return accessor.schedulePeriodicTask(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ element.setValue(selectRandom(values));
+ } catch (Exception e) {
+ e.printStackTrace(System.err);
+ }
+ }
+ }, 0, millis);
+ }
+
+ public <T extends Comparable<T>> void checkRange(final DiscreteElement<T> element, final T minValue, boolean minInclusive, T maxValue, boolean maxInclusive, int millis) throws InterruptedException {
+ Assert.assertTrue(element.getName() + ".checkRange()->failed",
+ element.checkRange(accessor, null, minValue, minInclusive, maxValue, maxInclusive, millis));
+ }
+
+ public <T extends Comparable<T>> void checkMaintainRange(final DiscreteElement<T> element, final T minValue, boolean minInclusive, T maxValue, boolean maxInclusive, int millis) throws InterruptedException {
+ CheckGroup chkGrp = new CheckGroup(Operation.AND, "checkMaintainRangeGrp");
+ T val = element.checkMaintainRange(accessor, chkGrp, minValue, minInclusive, maxValue, maxInclusive, millis);
+ Assert.assertTrue(element.getName() + ".checkMaintainRange()->failed, value=" + val.toString(), chkGrp.isPass());
+ }
+
+ public <T extends Comparable<T>> void checkMaintainRangeFail(final DiscreteElement<T> element, final T minValue, boolean minInclusive, T maxValue, boolean maxInclusive, int millis) throws InterruptedException {
+ CheckGroup chkGrp = new CheckGroup(Operation.AND, "checkMaintainRangeFailGrp");
+ T val = element.checkMaintainRange(accessor, chkGrp, minValue, minInclusive, maxValue, maxInclusive, millis);
+ Assert.assertFalse(element.getName() + ".checkMaintainRangeFail()->failed, value=" + val.toString(),
+ chkGrp.isPass());
+ }
+
+ public <T extends Comparable<T>> void checkMaintainNotRange(final DiscreteElement<T> element, final T minValue, boolean minInclusive, T maxValue, boolean maxInclusive, int millis) throws InterruptedException {
+ CheckGroup chkGrp = new CheckGroup(Operation.AND, "checkMaintainRangeGrp");
+ T val = element.checkMaintainNotRange(accessor, chkGrp, minValue, minInclusive, maxValue, maxInclusive, millis);
+ Assert.assertTrue(element.getName() + ".checkMaintainNotRange()->failed, value=" + val.toString(),
+ chkGrp.isPass());
+ }
+
+ public <T extends Comparable<T>> void checkMaintainNotRangeFail(final DiscreteElement<T> element, final T minValue, boolean minInclusive, T maxValue, boolean maxInclusive, int millis) throws InterruptedException {
+ CheckGroup chkGrp = new CheckGroup(Operation.AND, "checkMaintainRangeGrp");
+ T val = element.checkMaintainNotRange(accessor, chkGrp, minValue, minInclusive, maxValue, maxInclusive, millis);
+ Assert.assertFalse(element.getName() + ".checkMaintainNotRangeFail()->failed, value=" + val.toString(),
+ chkGrp.isPass());
+ }
+
+ public <T extends Comparable<T>> void checkRangeFail(final DiscreteElement<T> element, final T minValue, boolean minInclusive, T maxValue, boolean maxInclusive, int millis) throws InterruptedException {
+ Assert.assertFalse(element.getName() + ".checkRangeFail()->failed",
+ element.checkRange(accessor, null, minValue, minInclusive, maxValue, maxInclusive, millis));
+ }
+
+ public <T extends Comparable<T>> void checkMaintain(DiscreteElement<T> element, T value, int millis) throws InterruptedException {
+ T result = element.checkMaintain(accessor, null, value, millis);
+ Assert.assertEquals(element.getName() + ".checkMaintain()->failed", value, result);
+ }
+
+ public <T extends Comparable<T>> void checkMaintainFail(DiscreteElement<T> element, T maintainValue, T discontinuity, int millis) {
+ try {
+ T result = element.checkMaintain(accessor, null, maintainValue, millis);
+ Assert.assertEquals(element.getName() + ".checkMaintainFail()->failed", discontinuity, result);
+ } catch (InterruptedException e) {
+ Assert.fail("Exception");
+ }
+ }
+
+ public <T extends Comparable<T>> void checkNot(DiscreteElement<T> element, T value, int millis) {
+ CheckGroup grp = new CheckGroup(Operation.AND, "checkNotCheckGroup");
+ try {
+ boolean c = element.checkNot(accessor, grp, value, millis);
+ CheckPoint cp = (CheckPoint) grp.getTestPoints().get(0);
+ long elapsedTime = cp.getElpasedTime();
+ Assert.assertTrue(element.getName() + String.format(".checkNot()->failed, elapsed time=%d", elapsedTime), c);
+ System.out.printf("checkNot->passed, actual %s, expected %s, elapsed=%d\n", cp.getActual(), cp.getExpected(),
+ cp.getElpasedTime());
+ } catch (InterruptedException e) {
+ Assert.fail("Exception");
+ }
+ }
+
+ public <T extends Comparable<T>> void checkNotFail(DiscreteElement<T> element, T value, int millis) {
+ try {
+ Assert.assertFalse(element.getName() + " .checkNotFail()->failed",
+ element.checkNot(accessor, null, value, millis));
+ } catch (InterruptedException e) {
+ Assert.fail("Exception");
+ }
+ }
+
+ public <T extends Comparable<T>> void check(DiscreteElement<T> element, T value) throws InterruptedException {
+ CheckGroup grp = new CheckGroup(Operation.AND, "checkCheckGrp");
+ boolean c = element.check(accessor, grp, value);
+ long time = ((CheckPoint) grp.getTestPoints().get(0)).getElpasedTime();
+ Assert.assertTrue(
+ element.getName() + String.format(".check()->failed, elapsed=%d, expect=<%s>, actual=<%s>", time, value,
+ element.getValue()), c);
+ }
+
+ public <T extends Comparable<T>> void checkWaitForValue(DiscreteElement<T> element, T value, int millis) throws InterruptedException {
+ T result = element.waitForValue(accessor, value, millis);
+ Assert.assertEquals(element.getName() + " .checkWaitForValue()->failed", value, result);
+ }
+
+ public <T extends Comparable<T>> void checkList(DiscreteElement<T> element, T[] values, int millis) throws InterruptedException {
+ Assert.assertTrue(element.getName() + " .checkList()->failed", element.checkInList(accessor, values, millis));
+ }
+
+ public <T extends Comparable<T>> void checkNotInList(DiscreteElement<T> element, T[] values, int millis) throws InterruptedException {
+ Assert.assertTrue(element.getName() + " .checkNotInList()->failed",
+ element.checkNotInList(accessor, values, millis));
+ }
+
+ public <T extends Comparable<T>> void checkNotInListFail(DiscreteElement<T> element, T[] values, int millis) throws InterruptedException {
+ CheckGroup chkGrp = new CheckGroup(Operation.AND, "checkNotInListFail");
+ element.checkNotInList(accessor, chkGrp, values, millis);
+ Assert.assertFalse(element.getName() + " .checkNotInListFail()->failed", chkGrp.isPass());
+ }
+
+ public <T extends Comparable<T>> void checkListFail(DiscreteElement<T> element, T[] values, int millis) throws InterruptedException {
+ CheckGroup chkGrp = new CheckGroup(Operation.AND, "checkListFail");
+ boolean b = element.checkInList(accessor, chkGrp, values, millis);
+ CheckPoint cp = (CheckPoint) ((CheckGroup) chkGrp.getTestPoints().get(0)).getTestPoints().get(0);
+ Assert.assertFalse(
+ element.getName() + String.format(" .checkListFail()->failed, elapsed time=%d", cp.getElpasedTime()), b);
+ }
+
+ public <T extends Comparable<T>> void checkMaintainList(DiscreteElement<T> element, T[] values, int millis) throws InterruptedException {
+ CheckGroup chkGrp = new CheckGroup(Operation.AND, "checkMaintianList");
+ T val = element.checkMaintainList(accessor, chkGrp, values, true, millis);
+ Assert.assertTrue(element.getName() + " .checkMaintainList()->failed, value=" + val.toString(), chkGrp.isPass());
+ }
+
+ public <T extends Comparable<T>> void checkMaintainListFail(DiscreteElement<T> element, T[] values, int millis) throws InterruptedException {
+ CheckGroup chkGrp = new CheckGroup(Operation.AND, "checkMaintainListFail");
+ T val = element.checkMaintainList(accessor, chkGrp, values, true, millis);
+ Assert.assertFalse(element.getName() + " .checkMaintainListFail()->failed, value=" + val.toString(),
+ chkGrp.isPass());
+ }
+
+ public <T extends Comparable<T>> void checkWaitForValueFail(DiscreteElement<T> element, T value, int millis) throws InterruptedException {
+ T result = element.waitForValue(accessor, value, millis);
+ boolean b = value.equals(result);
+ Assert.assertFalse(
+ element.getName() + String.format(" .checkWaitForValueFail()->failed, expect=%s, actual=%s", value, result), b);
+ }
+
+ public <T extends Comparable<T>> void checkPulse(DiscreteElement<T> element, T pulsedValue, T nonPulsedValue) throws InterruptedException {
+ Assert.assertTrue(element.getName() + " .checkPulse()->failed",
+ element.checkPulse(accessor, pulsedValue, nonPulsedValue));
+ }
+
+ public <T extends Comparable<T>> void checkPulseFail(DiscreteElement<T> element, T pulsedValue, T nonPulsedValue) throws InterruptedException {
+ Assert.assertFalse(element.getName() + " .checkPulseFail()->failed",
+ element.checkPulse(accessor, pulsedValue, nonPulsedValue));
+ }
+
+ public <T extends Comparable<T>> void genericTestCheckNot(DiscreteElement<T> element, T[] values) throws InterruptedException {
+ if (values.length < 2) {
+ throw new IllegalArgumentException("array needs atleast two values");
+ }
+ System.out.println("genericTestCheckNot()");
+ // check pass conditions
+ for (int i = values.length - 1; i >= 1; i--) {
+ T notValue = values[i];
+ T goodValue = values[i - 1];
+ System.out.format("\tgoodValue=%s, notValue=%s\n", goodValue, notValue);
+ element.setValue(notValue);
+ setAfter(element, goodValue, 100);
+ checkNot(element, notValue, 210);
+ check(element, goodValue); // make sure we did not pass until the goodValue was transmitted
+ }
+
+ // check fail conditions
+ for (T value : values) {
+ element.setValue(value);
+ checkNotFail(element, value, 100);
+ }
+ }
+
+ public <T extends Comparable<T>> void genericCheckMaintain(DiscreteElement<T> element, T[] values) throws InterruptedException {
+ if (values.length < 2) {
+ throw new IllegalArgumentException("array needs atleast two values");
+ }
+
+ // check pass conditions
+ for (T value : values) {
+ element.setValue(value);
+ checkMaintain(element, value, 200);
+ check(element, value); // make sure we pass for the right reasons e.q. no false positives
+ }
+
+ // check fail conditions
+ for (int i = values.length - 1; i >= 1; i--) {
+ T valueToMaintain = values[i];
+ T badValue = values[i - 1];
+ element.setValue(valueToMaintain);
+ setAfter(element, badValue, 100);
+ checkMaintainFail(element, valueToMaintain, badValue, 200); // make sure we fail as expected, no false negatives
+ }
+ }
+
+ public <T extends Comparable<T>> void genericTestCheckWaitForValue(DiscreteElement<T> element, T[] values, T valueToFInd) throws InterruptedException {
+ // check sequence
+ element.getMessage().waitForTransmission(accessor);
+ ISequenceHandle handle = setSequence(element, values);
+ for (T v : values) {
+ checkWaitForValue(element, v, 40);
+ }
+ handle.waitForEndSequence(100, TimeUnit.MILLISECONDS);
+ setSequence(element, values);
+ checkWaitForValueFail(element, valueToFInd, 200);
+ }
+
+ public <T extends Comparable<T>> void genericTestCheckList(DiscreteElement<T> element, T[] goodValues, T[] badValues) throws InterruptedException {
+ // check finding of every item in the list
+ for (T v : goodValues) {
+ element.setValue(selectRandom(badValues)); // value will always not be in the list until after 40 ms
+ setAfter(element, v, 40);
+ checkList(element, goodValues, 100);
+ }
+
+ // check pass
+ maintainRandomizedList(element, goodValues, 500);
+ checkList(element, goodValues, 500);
+
+ // check failure
+ maintainRandomizedList(element, badValues, 500);
+ checkListFail(element, goodValues, 500);
+ }
+
+ public <T extends Comparable<T>> void genericTestCheckNotList(DiscreteElement<T> element, T[] allowedValues, T[] excludeValues) throws InterruptedException {
+ // check transition from fail to pass within time period
+ for (T v : excludeValues) {
+ element.setValue(selectRandom(allowedValues)); // value will always not be in the list until after 40 ms
+ setAfter(element, v, 40);
+ checkNotInList(element, excludeValues, 100);
+ }
+
+ // check pass
+ ScheduledFuture<?> handle = maintainRandomizedList(element, allowedValues, 10);
+ try {
+ checkNotInList(element, excludeValues, 10);
+ } finally {
+ try {
+ handle.cancel(false);
+ handle.get();
+ } catch (CancellationException ex) {
+ // do nothing
+ } catch (ExecutionException ex) {
+ throw new RuntimeException("exception while waiting for randomizedList to finish", ex);
+ }
+ }
+
+ // check failure
+ handle = maintainRandomizedList(element, excludeValues, 10);
+ try {
+ checkNotInListFail(element, excludeValues, 550);
+ } finally {
+ try {
+ handle.cancel(false);
+ handle.get();
+ } catch (CancellationException ex) {
+ // do nothing
+ } catch (ExecutionException ex) {
+ throw new RuntimeException("exception while waiting for randomizedList to finish", ex);
+ }
+ }
+ }
+
+ public <T extends Comparable<T>> void genericTestCheckMaintainList(DiscreteElement<T> element, T[] values, T badValue) throws InterruptedException {
+ // visit each possible value in list, make sure checkMaintainList does not fail
+ element.setValue(values[0]);
+ int timeStep = 40;
+ for (T val : values) {
+ setAfter(element, val, timeStep);
+ }
+ checkMaintainList(element, values, 1000);
+
+ // random elements from list
+ ScheduledFuture<?> handle = maintainRandomizedList(element, values, 15);
+ try {
+ checkMaintainList(element, values, 2000);
+ } finally {
+ try {
+ handle.cancel(false);
+ handle.get();
+ } catch (CancellationException ex) {
+ // do nothing
+ } catch (ExecutionException ex) {
+ throw new RuntimeException("exception while waiting for randomizedList to finish", ex);
+ }
+ }
+
+ // check proper failure behavior
+ handle = maintainRandomizedList(element, values, 25);
+ try {
+ setAfter(element, badValue, 1500);
+ checkMaintainListFail(element, values, 2000);
+ checkWaitForValue(element, badValue, 0);
+ } finally {
+ try {
+ handle.cancel(false);
+ handle.get();
+ } catch (CancellationException ex) {
+ // do nothing
+ } catch (ExecutionException ex) {
+ throw new RuntimeException("exception while waiting for randomizedList to finish", ex);
+ }
+ }
+ }
+
+ public <T> T selectRandom(T[] list) {
+ return list[Math.abs(rand.nextInt(list.length))];
+
+ }
+
+ public void checkForTransmission(TestMessage msg, int numXmits, int millis) throws InterruptedException {
+ Assert.assertTrue(msg.getName() + " failed to transmit " + numXmits + " times in " + millis + "ms",
+ msg.checkForTransmissions(accessor, numXmits, millis));
+ }
+
+ public void checkForTransmissionFail(TestMessage msg, int numXmits, int millis) throws InterruptedException {
+ Assert.assertFalse(msg.getName() + " had at least " + numXmits + " transmissions",
+ msg.checkForTransmissions(accessor, numXmits, millis));
+ }
+
+ public boolean inRange(int target, int tolerance, int actual) {
+ return Math.abs(actual - target) <= tolerance;
+ }
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/other/TestEnumElementOperations.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/other/TestEnumElementOperations.java
new file mode 100644
index 000000000..74a657812
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/other/TestEnumElementOperations.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.other;
+
+import static org.eclipse.osee.ote.message.mock.TestEnum.VAL_0;
+import static org.eclipse.osee.ote.message.mock.TestEnum.VAL_1;
+import static org.eclipse.osee.ote.message.mock.TestEnum.VAL_10;
+import static org.eclipse.osee.ote.message.mock.TestEnum.VAL_2;
+import static org.eclipse.osee.ote.message.mock.TestEnum.VAL_3;
+import static org.eclipse.osee.ote.message.mock.TestEnum.VAL_4;
+import static org.eclipse.osee.ote.message.mock.TestEnum.VAL_5;
+import static org.eclipse.osee.ote.message.mock.TestEnum.VAL_6;
+import static org.eclipse.osee.ote.message.mock.TestEnum.VAL_7;
+import static org.eclipse.osee.ote.message.mock.TestEnum.VAL_8;
+import static org.eclipse.osee.ote.message.mock.TestEnum.VAL_9;
+import java.util.EnumSet;
+import org.eclipse.osee.ote.message.mock.TestEnum;
+import org.eclipse.osee.ote.message.mock.TestMessage;
+import org.eclipse.osee.ote.message.mock.UnitTestSupport;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TestEnumElementOperations {
+
+ private UnitTestSupport support;
+
+ @BeforeClass
+ public static void setUpBeforeClass() throws Exception {
+ }
+
+ @AfterClass
+ public static void tearDownAfterClass() throws Exception {
+ }
+
+ @Before
+ public void setUp() throws Exception {
+ support = new UnitTestSupport();
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ support.cleanup();
+ }
+
+ @Test
+ public void testCheckWaitForValue() throws InterruptedException {
+ TestMessage msg = new TestMessage();
+ support.activateMsg(msg);
+ support.genericTestCheckWaitForValue(msg.ENUM_ELEMENT_1, EnumSet.of(VAL_0, VAL_9).toArray(new TestEnum[] {}),
+ VAL_10);
+
+ support.genericTestCheckWaitForValue(msg.ENUM_ELEMENT_1, EnumSet.of(VAL_1, VAL_10).toArray(new TestEnum[] {}),
+ VAL_0);
+ }
+
+ @Test
+ public void testCheckNot() throws InterruptedException {
+ TestMessage msg = new TestMessage();
+ support.activateMsg(msg);
+ support.genericTestCheckNot(msg.ENUM_ELEMENT_1, TestEnum.values());
+ }
+
+ @Test
+ public void testCheckMaintain() throws InterruptedException {
+ TestMessage msg = new TestMessage();
+ support.activateMsg(msg);
+ support.genericCheckMaintain(msg.ENUM_ELEMENT_1, TestEnum.values());
+ }
+
+ @Test
+ public void testCheckList() throws InterruptedException {
+ TestMessage msg = new TestMessage();
+ support.activateMsg(msg);
+
+ support.genericTestCheckList(msg.ENUM_ELEMENT_1, new TestEnum[] {VAL_0, VAL_2, VAL_4, VAL_6, VAL_8, VAL_10},
+ new TestEnum[] {VAL_1, VAL_3, VAL_5, VAL_7, VAL_9});
+ }
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/other/TestFloat32Operations.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/other/TestFloat32Operations.java
new file mode 100644
index 000000000..f8aa274d5
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/other/TestFloat32Operations.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.other;
+
+import org.eclipse.osee.ote.message.mock.TestMessage;
+import org.eclipse.osee.ote.message.mock.UnitTestSupport;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TestFloat32Operations {
+ private UnitTestSupport support;
+
+ @BeforeClass
+ public static void setUpBeforeClass() throws Exception {
+ }
+
+ @AfterClass
+ public static void tearDownAfterClass() throws Exception {
+ }
+
+ @Before
+ public void setUp() throws Exception {
+ support = new UnitTestSupport();
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ support.cleanup();
+ }
+
+ @Test
+ public void testCheckWaitForValue() throws InterruptedException {
+ TestMessage msg = new TestMessage();
+ support.activateMsg(msg);
+
+ support.genericTestCheckWaitForValue(msg.FLOAT32_ELEMENT_1, new Double[] {
+ new Double(0.0f),
+ new Double(0.2f),
+ new Double(100.0f),
+ new Double(999.00075f)}, new Double(33.4001f));
+
+ }
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/other/TestIntegerOperations.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/other/TestIntegerOperations.java
new file mode 100644
index 000000000..923d372b3
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/other/TestIntegerOperations.java
@@ -0,0 +1,333 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.other;
+
+import org.eclipse.osee.ote.message.elements.IntegerElement;
+import org.eclipse.osee.ote.message.mock.TestMessage;
+import org.eclipse.osee.ote.message.mock.UnitTestSupport;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TestIntegerOperations {
+
+ private UnitTestSupport support;
+
+ @BeforeClass
+ public static void setUpBeforeClass() throws Exception {
+ }
+
+ @AfterClass
+ public static void tearDownAfterClass() throws Exception {
+ }
+
+ @Before
+ public void setUp() throws Exception {
+ support = new UnitTestSupport();
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ support.cleanup();
+ }
+
+ /**
+ * Not sure how this is even supposed to work.
+ *
+ * @throws InterruptedException
+ */
+ @Ignore
+ @Test
+ public void testCheckWaitForValue() throws InterruptedException {
+ TestMessage msg = new TestMessage();
+ support.activateMsg(msg);
+ int maxElementValue = getMaxIntValue(msg.INT_ELEMENT_1);
+ support.genericTestCheckWaitForValue(msg.INT_ELEMENT_1, new Integer[] {
+ 10,
+ 30,
+ 31,
+ 30,
+ 50,
+ 75,
+ maxElementValue,
+ maxElementValue,
+ 400,
+ 1,
+ maxElementValue,
+ 0,
+ maxElementValue,
+ 1,
+ 0,
+ 1,
+ 2}, 49);
+ }
+
+ @Test
+ public void testCheckNot() throws InterruptedException {
+ TestMessage msg = new TestMessage();
+ support.activateMsg(msg);
+ int maxElementValue = getMaxIntValue(msg.INT_ELEMENT_1);
+ support.genericTestCheckNot(msg.INT_ELEMENT_1, new Integer[] {0, maxElementValue, 10, 100, 1000, 5});
+ }
+
+ @Test
+ public void testCheckMaintain() throws InterruptedException {
+ TestMessage msg = new TestMessage();
+ support.activateMsg(msg);
+ int maxElementValue = getMaxIntValue(msg.INT_ELEMENT_1);
+ support.genericCheckMaintain(msg.INT_ELEMENT_1, new Integer[] {
+ 0,
+ maxElementValue,
+ 0,
+ 0,
+ maxElementValue,
+ maxElementValue,
+ 1000,
+ 5,
+ 1,
+ maxElementValue - 1});
+ }
+
+ @Test
+ public void testCheckRange() throws InterruptedException {
+ TestMessage msg = new TestMessage();
+ support.activateMsg(msg);
+
+ msg.INT_ELEMENT_1.setValue(50);
+ support.checkRange(msg.INT_ELEMENT_1, 0, true, 100, true, 100);
+
+ // test lower bound, inclusive
+ msg.INT_ELEMENT_1.setValue(0);
+ support.checkRangeFail(msg.INT_ELEMENT_1, 1, true, 100, true, 100);
+ support.setAfter(msg.INT_ELEMENT_1, 1, 50);
+ support.checkRange(msg.INT_ELEMENT_1, 1, true, 100, true, 100);
+
+ // test upper bound, inclusive
+ msg.INT_ELEMENT_1.setValue(101);
+ support.checkRangeFail(msg.INT_ELEMENT_1, 1, true, 100, true, 100);
+ support.setAfter(msg.INT_ELEMENT_1, 100, 50);
+ support.checkRange(msg.INT_ELEMENT_1, 1, true, 100, true, 100);
+
+ // test middle
+ msg.INT_ELEMENT_1.setValue(1000);
+ support.setAfter(msg.INT_ELEMENT_1, 50, 50);
+ support.checkRange(msg.INT_ELEMENT_1, 1, true, 100, true, 100);
+
+ // test lower bound, exclusive
+ msg.INT_ELEMENT_1.setValue(1);
+ support.checkRangeFail(msg.INT_ELEMENT_1, 1, false, 100, false, 100); // make sure lower bound is exclusive
+ support.setAfter(msg.INT_ELEMENT_1, 2, 50);
+ support.checkRange(msg.INT_ELEMENT_1, 1, false, 100, false, 100);
+
+ // test upper bound, exclusive
+ msg.INT_ELEMENT_1.setValue(100);
+ support.checkRangeFail(msg.INT_ELEMENT_1, 1, false, 100, false, 100); // make sure upper bound is exclusive
+ support.setAfter(msg.INT_ELEMENT_1, 99, 50);
+ support.checkRange(msg.INT_ELEMENT_1, 1, false, 100, false, 100);
+
+ // check multiple out of range values
+ msg.INT_ELEMENT_1.setValue(10);
+ support.setAfter(msg.INT_ELEMENT_1, 100, 20);
+ support.setAfter(msg.INT_ELEMENT_1, 9, 40);
+ support.setAfter(msg.INT_ELEMENT_1, 101, 60);
+ support.checkRangeFail(msg.INT_ELEMENT_1, 10, false, 100, false, 160);
+ support.checkWaitForValue(msg.INT_ELEMENT_1, 101, 0); // make sure we did not fail before we should have
+ }
+
+ @Test
+ public void testCheckMaintainRange() throws InterruptedException {
+ TestMessage msg = new TestMessage();
+ support.activateMsg(msg);
+
+ msg.INT_ELEMENT_1.setValue(50);
+ support.checkMaintainRange(msg.INT_ELEMENT_1, 0, true, 100, true, 100);
+
+ msg.INT_ELEMENT_1.setValue(0);
+ support.checkMaintainRange(msg.INT_ELEMENT_1, 0, true, 100, true, 100);
+
+ msg.INT_ELEMENT_1.setValue(100);
+ support.checkMaintainRange(msg.INT_ELEMENT_1, 0, true, 100, true, 100);
+
+ // check lower bound, inclusive
+ msg.INT_ELEMENT_1.setValue(10);
+ support.setAfter(msg.INT_ELEMENT_1, 9, 50);
+ support.checkMaintainRangeFail(msg.INT_ELEMENT_1, 10, true, 100, true, 100);
+
+ // check upper bound, inclusive
+ msg.INT_ELEMENT_1.setValue(100);
+ support.setAfter(msg.INT_ELEMENT_1, 101, 50);
+ support.checkMaintainRangeFail(msg.INT_ELEMENT_1, 10, true, 100, true, 100);
+ support.checkWaitForValue(msg.INT_ELEMENT_1, 101, 0);
+
+ // check lower bound, exclusive
+ msg.INT_ELEMENT_1.setValue(1);
+ support.setAfter(msg.INT_ELEMENT_1, 0, 50);
+ support.checkMaintainRangeFail(msg.INT_ELEMENT_1, 0, false, 100, false, 100);
+ support.checkWaitForValue(msg.INT_ELEMENT_1, 0, 0);
+
+ // check upper bound, exclusive
+ msg.INT_ELEMENT_1.setValue(99);
+ support.setAfter(msg.INT_ELEMENT_1, 100, 50);
+ support.checkMaintainRangeFail(msg.INT_ELEMENT_1, 0, false, 100, false, 100);
+
+ // check bouncing between upper and lower inclusive
+ msg.INT_ELEMENT_1.setValue(0);
+ support.setAfter(msg.INT_ELEMENT_1, 100, 20);
+ support.setAfter(msg.INT_ELEMENT_1, 50, 40);
+ support.setAfter(msg.INT_ELEMENT_1, 1, 60);
+ support.checkMaintainRange(msg.INT_ELEMENT_1, 0, true, 100, true, 100);
+ support.checkWaitForValue(msg.INT_ELEMENT_1, 1, 0);
+
+ // check approaching upper fail boundary
+ msg.INT_ELEMENT_1.setValue(97);
+ support.setAfter(msg.INT_ELEMENT_1, 98, 20);
+ support.setAfter(msg.INT_ELEMENT_1, 99, 40);
+ support.setAfter(msg.INT_ELEMENT_1, 100, 60);
+ support.checkMaintainRangeFail(msg.INT_ELEMENT_1, 0, false, 100, false, 100);
+
+ // check approaching lower fail boundary
+ msg.INT_ELEMENT_1.setValue(3);
+ support.setAfter(msg.INT_ELEMENT_1, 2, 20);
+ support.setAfter(msg.INT_ELEMENT_1, 1, 40);
+ support.setAfter(msg.INT_ELEMENT_1, 0, 60);
+ support.checkMaintainRangeFail(msg.INT_ELEMENT_1, 0, false, 100, false, 100);
+
+ // check mixed inclusive, exclusive
+ msg.INT_ELEMENT_1.setValue(1);
+ support.setAfter(msg.INT_ELEMENT_1, 100, 60);
+ support.checkMaintainRange(msg.INT_ELEMENT_1, 0, false, 100, true, 100);
+
+ // check mixed inclusive, exclusive
+ msg.INT_ELEMENT_1.setValue(99);
+ support.setAfter(msg.INT_ELEMENT_1, 0, 60);
+ support.checkMaintainRange(msg.INT_ELEMENT_1, 0, true, 100, false, 100);
+
+ // check bouncing between upper and lower exclusive
+ support.setSequence(msg.INT_ELEMENT_1, new Integer[] {1, 99, 50, 2, 2, 2, 1, 2, 1, 2, 44});
+ support.checkMaintainRange(msg.INT_ELEMENT_1, 0, false, 100, false, 240);
+ support.checkWaitForValue(msg.INT_ELEMENT_1, 44, 0);
+
+ // check fail fast behavior
+ msg.INT_ELEMENT_1.setValue(1);
+ support.setAfter(msg.INT_ELEMENT_1, 100, 30);
+ support.setAfter(msg.INT_ELEMENT_1, 50, 60);
+ support.checkMaintainRangeFail(msg.INT_ELEMENT_1, 0, false, 100, false, 100);
+ support.checkWaitForValue(msg.INT_ELEMENT_1, 100, 0); // should immediately check value since it should have caused the above to fail
+ support.checkWaitForValue(msg.INT_ELEMENT_1, 50, 100);
+ }
+
+ @Test
+ public void testCheckMaintainNotRange() throws InterruptedException {
+ TestMessage msg = new TestMessage();
+ support.activateMsg(msg);
+
+ // bounce around boundaries, make sure it doesn't fail, inclusive
+ support.setSequence(msg.INT_ELEMENT_1, new Integer[] {0, 101, 9, 102, 8, 102, 101, 101, 101, 9, 9, 101, 9});
+ support.checkMaintainNotRange(msg.INT_ELEMENT_1, 10, true, 100, true, 400);
+
+ // bounce around boundaries, make sure it doesn't fail, exclusive
+ msg.INT_ELEMENT_1.setValue(0);
+ support.setAfter(msg.INT_ELEMENT_1, 100, 20);
+ support.setAfter(msg.INT_ELEMENT_1, 10, 40);
+ support.setAfter(msg.INT_ELEMENT_1, 101, 60);
+ support.setAfter(msg.INT_ELEMENT_1, 9, 80);
+ support.checkMaintainNotRange(msg.INT_ELEMENT_1, 10, false, 100, false, 200);
+
+ // explore boundary then cause failure, exclusive
+ msg.INT_ELEMENT_1.setValue(10);
+ support.setAfter(msg.INT_ELEMENT_1, 100, 20);
+ support.setAfter(msg.INT_ELEMENT_1, 55, 80);
+ support.checkMaintainNotRangeFail(msg.INT_ELEMENT_1, 10, false, 100, false, 200);
+ support.checkWaitForValue(msg.INT_ELEMENT_1, 55, 0); // make sure our plan failure actually caused it to fail
+
+ // explore boundary then cause failure, inclusive
+ support.setSequence(msg.INT_ELEMENT_1, new Integer[] {9, 9, 101, 101, 9, 101, 55});
+ support.checkMaintainNotRangeFail(msg.INT_ELEMENT_1, 10, true, 100, true, 200);
+ support.checkWaitForValue(msg.INT_ELEMENT_1, 55, 0); // make sure our planned failure actually caused it to fail
+
+ // check transition to upper boundary causes failure, inclusive
+ support.maintain(msg.INT_ELEMENT_1, 105, 100, 50);
+ support.checkMaintainNotRangeFail(msg.INT_ELEMENT_1, 10, true, 100, true, 200);
+ support.checkWaitForValue(msg.INT_ELEMENT_1, 100, 0); // make sure our planned failure actually caused it to fail
+
+ // check transition to upper boundary causes failure, exclusive
+ support.maintain(msg.INT_ELEMENT_1, 100, 99, 50);
+ support.checkMaintainNotRangeFail(msg.INT_ELEMENT_1, 10, false, 100, false, 200);
+ support.checkWaitForValue(msg.INT_ELEMENT_1, 99, 0); // make sure our planned failure actually caused it to fail
+
+ // check transition to lower boundary causes failure, inclusive
+ support.maintain(msg.INT_ELEMENT_1, 9, 10, 50);
+ support.checkMaintainNotRangeFail(msg.INT_ELEMENT_1, 10, true, 100, true, 200);
+ support.checkWaitForValue(msg.INT_ELEMENT_1, 10, 0); // make sure our planned failure actually caused it to fail
+
+ // check transition to lower boundary causes failure, exclusive
+ support.maintain(msg.INT_ELEMENT_1, 10, 11, 50);
+ support.checkMaintainNotRangeFail(msg.INT_ELEMENT_1, 10, false, 100, false, 200);
+ support.checkWaitForValue(msg.INT_ELEMENT_1, 11, 0); // make sure our planned failure actually caused it to fail
+ }
+
+ @Test
+ public void testCheckList() throws InterruptedException {
+ TestMessage msg = new TestMessage();
+ support.activateMsg(msg);
+
+ support.genericTestCheckList(msg.INT_ELEMENT_1, new Integer[] {20, 40, 50, 60, 80, 100}, new Integer[] {
+ 200,
+ 300,
+ 400,
+ 500,
+ 600});
+ }
+
+ @Test
+ public void testCheckNotInList() throws InterruptedException {
+ TestMessage msg = new TestMessage();
+ support.activateMsg(msg);
+
+ support.genericTestCheckNotList(msg.INT_ELEMENT_1, new Integer[] {20, 40, 50, 60, 80, 100}, new Integer[] {
+ 200,
+ 300,
+ 400,
+ 500,
+ 600});
+ }
+
+ @Test
+ public void testCheckMaintainList() throws InterruptedException {
+ TestMessage msg = new TestMessage();
+ support.activateMsg(msg);
+
+ Integer[] values = {20, 40, 50, 60, 80};
+ support.genericTestCheckMaintainList(msg.INT_ELEMENT_1, values, 999);
+ }
+
+ @Test
+ public void testCheckPulse() throws InterruptedException {
+ TestMessage msg = new TestMessage();
+ support.activateMsg(msg);
+
+ support.setSequence(msg.INT_ELEMENT_1, new Integer[] {2, 100, 33, 100, 2, 99});
+ support.checkPulse(msg.INT_ELEMENT_1, 100, 99);
+
+ support.setSequence(msg.INT_ELEMENT_1, new Integer[] {100, 100, 99});
+ support.checkPulse(msg.INT_ELEMENT_1, 100, 99);
+ }
+
+ private int getMaxIntValue(IntegerElement e) {
+ return (1 << e.getBitLength()) - 1;
+ }
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/other/TestMessageOperations.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/other/TestMessageOperations.java
new file mode 100644
index 000000000..c064a747b
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/other/TestMessageOperations.java
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.other;
+
+import org.eclipse.osee.framework.jdk.core.util.benchmark.Benchmark;
+import org.eclipse.osee.ote.message.MessageSystemException;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.listener.IOSEEMessageListener;
+import org.eclipse.osee.ote.message.mock.TestMessage;
+import org.eclipse.osee.ote.message.mock.UnitTestSupport;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TestMessageOperations {
+ private UnitTestSupport support;
+
+ @BeforeClass
+ public static void setUpBeforeClass() throws Exception {
+ }
+
+ @AfterClass
+ public static void tearDownAfterClass() throws Exception {
+ }
+
+ @Before
+ public void setUp() throws Exception {
+ support = new UnitTestSupport();
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ support.cleanup();
+ }
+
+ /**
+ * We noticed this failing due to being overly picky about timing, needs to be evaluated to be fixed or removed.
+ *
+ * @throws InterruptedException
+ */
+ @Ignore
+ @Test
+ public void testTransmissionRate() throws InterruptedException {
+ Benchmark.setBenchmarkingEnabled(true);
+ TestMessage msg = new TestMessage();
+ final Benchmark bm = new Benchmark("transmission rate");
+ msg.addListener(new IOSEEMessageListener() {
+ @Override
+ public void onDataAvailable(MessageData data, DataType type) throws MessageSystemException {
+ bm.samplePoint();
+ }
+
+ @Override
+ public void onInitListener() throws MessageSystemException {
+
+ }
+
+ });
+ int time = 5000; // 5 seconds
+ support.activateMsg(msg);
+ int period = (int) Math.round(1000.0 / msg.getRate());
+ int expectedXmits = (int) Math.round(msg.getRate()) * (time / 1000);
+ Thread.sleep(time + 10);
+ Assert.assertEquals(expectedXmits, bm.getTotalSamples());
+ long avg = bm.getAverage() / 1000;
+ Assert.assertTrue("period is out of range:expected " + period + ", actual " + avg,
+ support.inRange(period, 1, (int) avg));
+ }
+
+ @Test
+ public void testCheckForTransmission() throws InterruptedException {
+ TestMessage msg = new TestMessage();
+ support.activateMsg(msg);
+ int time = 1000;
+ int expectedXmits = (int) Math.round(msg.getRate()) * (time / 1000);
+ support.checkForTransmission(msg, expectedXmits, time + 10);
+
+ support.checkForTransmissionFail(msg, expectedXmits, time - 10);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/other/TestStringOperations.java b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/other/TestStringOperations.java
new file mode 100644
index 000000000..0cb060b9a
--- /dev/null
+++ b/org.eclipse.osee.ote.core.test/src/org/eclipse/osee/ote/message/other/TestStringOperations.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.other;
+
+import org.eclipse.osee.ote.message.mock.TestMessage;
+import org.eclipse.osee.ote.message.mock.UnitTestSupport;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TestStringOperations {
+
+ private UnitTestSupport support;
+
+ @BeforeClass
+ public static void setUpBeforeClass() throws Exception {
+ }
+
+ @AfterClass
+ public static void tearDownAfterClass() throws Exception {
+ }
+
+ @Before
+ public void setUp() throws Exception {
+ support = new UnitTestSupport();
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ support.cleanup();
+ }
+
+ @Test
+ public void testCheckWaitForValue() throws InterruptedException {
+ TestMessage msg = new TestMessage();
+ support.activateMsg(msg);
+ support.genericTestCheckWaitForValue(msg.STRING_ELEMENT_1, new String[] {
+ "Expected 1",
+ " Expected",
+ "Expected ",
+ "",
+ "expected",
+ "EXPECTED",
+ "Expected",
+ "Expected",
+ "01234",
+ "x"}, "abc");
+ }
+
+ @Test
+ public void testCheckNot() throws InterruptedException {
+ TestMessage msg = new TestMessage();
+ support.activateMsg(msg);
+ String values[] = new String[] {" ", "a", " ", "hi", "by", "123456789ABCDEF", "1"};
+ support.genericTestCheckNot(msg.STRING_ELEMENT_1, values);
+ }
+
+ @Test
+ public void testCheckList() throws InterruptedException {
+ TestMessage msg = new TestMessage();
+ support.activateMsg(msg);
+ String[] good = new String[] {"a b c d e f g", "b", "_", "hello", "test"};
+ String[] bad = new String[] {"a b c d e f g e", "c", " ", "\t", "hellO", "t\0est"};
+ support.genericTestCheckList(msg.STRING_ELEMENT_1, good, bad);
+ }
+
+ @Test
+ public void testStringEmpty() throws InterruptedException {
+ TestMessage msg = new TestMessage();
+ msg.STRING_ELEMENT_1.zeroize();
+ Assert.assertTrue("string is not empty", msg.STRING_ELEMENT_1.isEmpty());
+ msg.STRING_ELEMENT_1.setValue("hi");
+ Assert.assertFalse("string is empty", msg.STRING_ELEMENT_1.isEmpty());
+ msg.STRING_ELEMENT_1.setValue("\0");
+ Assert.assertTrue("string is not empty", msg.STRING_ELEMENT_1.isEmpty());
+ msg.STRING_ELEMENT_1.setValue("0123456789");
+ Assert.assertFalse("string is empty", msg.STRING_ELEMENT_1.isEmpty());
+
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/.classpath b/org.eclipse.osee.ote.core/.classpath
new file mode 100644
index 000000000..1fa3e6803
--- /dev/null
+++ b/org.eclipse.osee.ote.core/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.ote.core/.cvsignore b/org.eclipse.osee.ote.core/.cvsignore
new file mode 100644
index 000000000..ba077a403
--- /dev/null
+++ b/org.eclipse.osee.ote.core/.cvsignore
@@ -0,0 +1 @@
+bin
diff --git a/org.eclipse.osee.ote.core/.pmd b/org.eclipse.osee.ote.core/.pmd
new file mode 100644
index 000000000..c7b0a9fb3
--- /dev/null
+++ b/org.eclipse.osee.ote.core/.pmd
@@ -0,0 +1,925 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<pmd>
+ <useProjectRuleSet>false</useProjectRuleSet>
+ <ruleSetFile>.ruleset</ruleSetFile>
+ <rules>
+ <rule>
+ <name>LooseCoupling</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneMethodMustImplementCloneable</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedImports</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SignatureDeclareThrowsException</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IfStmtsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>WhileLoopsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IfElseStmtsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ForLoopsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseSingleton</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanReturns</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanExpressions</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SwitchStmtsShouldHaveDefault</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDeeplyNestedIfStmts</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidReassigningParameters</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SwitchDensity</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConstructorCallsOverridableMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AccessorClassGeneration</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalFieldCouldBeStatic</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloseResource</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonStaticInitializer</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DefaultLabelNotLastInSwitchStmt</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonCaseLabelInSwitchStatement</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>OptimizableToArrayCall</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BadComparison</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EqualsNull</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConfusingTernary</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InstantiationToGetClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IdempotentOperations</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimpleDateFormatNeedsLocale</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ImmutableField</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseLocaleWithCaseConversions</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidProtectedFieldInFinalClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AssignmentToNonFinalStatic</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingStaticMethodInNonInstantiatableClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidSynchronizedAtMethodLevel</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingBreakInSwitch</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseNotifyAllInsteadOfNotify</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidInstanceofChecksInCatchClause</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractClassWithoutAbstractMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyConditional</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CompareObjectsWithEquals</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PositionLiteralsFirstInComparisons</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryLocalBeforeReturn</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonThreadSafeSingleton</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UncommentedEmptyMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UncommentedEmptyConstructor</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidConstantsInterface</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnsynchronizedStaticDateFormatter</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PreserveStackTrace</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseCollectionIsEmpty</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassWithOnlyPrivateConstructorsShouldBeFinal</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyMethodInAbstractClassShouldBeAbstract</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SingularField</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReturnEmptyArrayRatherThanNull</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractClassWithoutAnyMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooFewBranchesForASwitchStatement</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCatchingThrowable</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SignatureDeclareThrowsException</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExceptionAsFlowControl</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCatchingNPE</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingRawExceptionTypes</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingNullPointerException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidRethrowingException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotExtendJavaLangError</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotThrowExceptionInFinally</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingNewInstanceOfSameException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedPrivateField</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedLocalVariable</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedPrivateMethod</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedFormalParameter</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MoreThanOneLogger</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LoggerIsNotStaticFinal</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SystemPrintln</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidPrintStackTrace</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDuplicateLiterals</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringInstantiation</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringToString</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InefficientStringBuffering</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryCaseChange</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseStringBufferLength</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AppendCharacterWithChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConsecutiveLiteralAppends</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseIndexOfChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InefficientEmptyStringCheck</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InsufficientStringBufferDeclaration</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessStringValueOf</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringBufferInstantiationWithChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseEqualsToCompareStrings</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidStringBufferField</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceVectorWithList</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceHashtableWithMap</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceEnumerationWithIterator</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidEnumAsIdentifier</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidAssertAsIdentifier</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IntegerInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ByteInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ShortInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LongInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseBeforeAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseAfterAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseTestAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4SuitesShouldUseSuiteAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitUseExpected</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseProperClassLoader</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MDBAndSessionBeanNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>RemoteSessionInterfaceNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LocalInterfaceSessionNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LocalHomeNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>RemoteInterfaceNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotCallSystemExit</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StaticEJBFieldShouldBeFinal</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotUseThreads</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidInstantiatingObjectsInLoops</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseArrayListInsteadOfVector</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyStartsWith</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseStringBufferForStringAppends</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseArraysAsList</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidArrayLoops</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryWrapperObjectCreation</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AddEmptyString</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyCatchBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyIfStmt</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyWhileStmt</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyTryBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyFinallyBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptySwitchStatements</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JumbledIncrementer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ForLoopShouldBeWhileLoop</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryConversionTemporary</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>OverrideBothEqualsAndHashcode</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoubleCheckedLocking</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReturnFromFinallyBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptySynchronizedBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryReturn</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyStaticInitializer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnconditionalIfStatement</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyStatementNotInLoop</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanInstantiation</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryFinalModifier</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CollapsibleIfStatements</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessOverridingMethod</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassCastExceptionWithToArray</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDecimalLiteralsInBigDecimalConstructor</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessOperationOnImmutable</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MisplacedNullCheck</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedNullCheckInEquals</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThreadGroup</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BrokenNullCheck</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BigIntegerInstantiation</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingOctalValues</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingHardCodedIP</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CheckResultSet</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidMultipleUnaryOperators</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyInitializer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodReturnsInternalArray</name>
+ <ruleset>Security Code Guidelines</ruleset>
+ </rule>
+ <rule>
+ <name>ArrayIsStoredDirectly</name>
+ <ruleset>Security Code Guidelines</ruleset>
+ </rule>
+ <rule>
+ <name>CouplingBetweenObjects</name>
+ <ruleset>Coupling Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveImports</name>
+ <ruleset>Coupling Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LooseCoupling</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DuplicateImports</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DontImportJavaLang</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedImports</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ImportFromSamePackage</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyStaticImports</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitStaticSuite</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitSpelling</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitAssertionsShouldIncludeMessage</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitTestsShouldIncludeAssert</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TestClassWithoutTestCases</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryBooleanAssertion</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertEqualsInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertSameInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertNullInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanAssertion</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NullAssignment</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedModifier</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AssignmentInOperand</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AtLeastOneConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DontImportSun</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousOctalEscape</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CallSuperInConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryParentheses</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DefaultPackage</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanInversion</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DataflowAnomalyAnalysis</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFinalLocalVariable</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingShortType</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingVolatile</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingNativeCode</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidAccessibilityAlteration</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotCallGarbageCollectionExplicitly</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodNamingConventions</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassNamingConventions</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractNaming</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDollarSigns</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodWithSameNameAsEnclosingClass</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousHashcodeMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousConstantFieldName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousEqualsMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFieldNameMatchingTypeName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFieldNameMatchingMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NoPackage</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PackageCase</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MisleadingVariableName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanGetMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NPathComplexity</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveMethodLength</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveParameterList</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveClassLength</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CyclomaticComplexity</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessivePublicCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyFields</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssMethodCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssTypeCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssConstructorCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyMethods</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyFinalizer</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeOnlyCallsSuperFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeOverloaded</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeDoesNotCallSuperFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeShouldBeProtected</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCallingFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseCorrectExceptionLogging</name>
+ <ruleset>Jakarta Commons Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ProperLogger</name>
+ <ruleset>Jakarta Commons Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingSerialVersionUID</name>
+ <ruleset>JavaBean Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ProperCloneImplementation</name>
+ <ruleset>Clone Implementation Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneThrowsCloneNotSupportedException</name>
+ <ruleset>Clone Implementation Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneMethodMustImplementCloneable</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ </rules>
+ <includeDerivedFiles>false</includeDerivedFiles>
+ <violationsAsErrors>true</violationsAsErrors>
+</pmd>
diff --git a/org.eclipse.osee.ote.core/.project b/org.eclipse.osee.ote.core/.project
new file mode 100644
index 000000000..99558be65
--- /dev/null
+++ b/org.eclipse.osee.ote.core/.project
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ote.core</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ds.core.builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.core/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.core/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..deb33f17a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/META-INF/MANIFEST.MF
@@ -0,0 +1,95 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OSEE Test Core Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.core;singleton:=true
+Bundle-Version: 0.25.3.qualifier
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Export-Package: org.eclipse.osee.ote,
+ org.eclipse.osee.ote.classserver,
+ org.eclipse.osee.ote.core,
+ org.eclipse.osee.ote.core.annotations,
+ org.eclipse.osee.ote.core.cmd,
+ org.eclipse.osee.ote.core.enums,
+ org.eclipse.osee.ote.core.environment,
+ org.eclipse.osee.ote.core.environment.command,
+ org.eclipse.osee.ote.core.environment.config,
+ org.eclipse.osee.ote.core.environment.console,
+ org.eclipse.osee.ote.core.environment.console.cmd,
+ org.eclipse.osee.ote.core.environment.interfaces,
+ org.eclipse.osee.ote.core.environment.jini,
+ org.eclipse.osee.ote.core.environment.status,
+ org.eclipse.osee.ote.core.environment.status.msg,
+ org.eclipse.osee.ote.core.framework,
+ org.eclipse.osee.ote.core.framework.adapter,
+ org.eclipse.osee.ote.core.framework.command,
+ org.eclipse.osee.ote.core.framework.event,
+ org.eclipse.osee.ote.core.framework.prompt,
+ org.eclipse.osee.ote.core.framework.saxparse,
+ org.eclipse.osee.ote.core.framework.saxparse.elements,
+ org.eclipse.osee.ote.core.framework.testrun,
+ org.eclipse.osee.ote.core.framework.thread,
+ org.eclipse.osee.ote.core.log,
+ org.eclipse.osee.ote.core.log.record,
+ org.eclipse.osee.ote.core.log.record.json,
+ org.eclipse.osee.ote.core.model,
+ org.eclipse.osee.ote.core.test.shells,
+ org.eclipse.osee.ote.core.test.tags,
+ org.eclipse.osee.ote.core.testPoint,
+ org.eclipse.osee.ote.endpoint,
+ org.eclipse.osee.ote.message,
+ org.eclipse.osee.ote.message.commands,
+ org.eclipse.osee.ote.message.condition,
+ org.eclipse.osee.ote.message.data,
+ org.eclipse.osee.ote.message.elements,
+ org.eclipse.osee.ote.message.elements.nonmapping,
+ org.eclipse.osee.ote.message.enums,
+ org.eclipse.osee.ote.message.event,
+ org.eclipse.osee.ote.message.event.send,
+ org.eclipse.osee.ote.message.instrumentation,
+ org.eclipse.osee.ote.message.interfaces,
+ org.eclipse.osee.ote.message.listener,
+ org.eclipse.osee.ote.message.log.record,
+ org.eclipse.osee.ote.message.timer,
+ org.eclipse.osee.ote.message.tool,
+ org.eclipse.osee.ote.message.tool.rec,
+ org.eclipse.osee.ote.message.tool.rec.entry,
+ org.eclipse.osee.ote.remote.messages
+Require-Bundle: org.eclipse.osee.framework.jdk.core,
+ org.eclipse.core.runtime,
+ org.apache.commons.net,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.osee.ote.connection.service,
+ net.jini;bundle-version="2.1.0"
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-Activator: org.eclipse.osee.ote.core.internal.Activator
+Import-Package: javax.xml.parsers,
+ org.apache.xml.serialize,
+ org.codehaus.jackson;version="1.9.13",
+ org.codehaus.jackson.annotate;version="1.9.13",
+ org.codehaus.jackson.map;version="1.9.13",
+ org.codehaus.jackson.map.annotate;version="1.9.13",
+ org.codehaus.jackson.map.module;version="1.9.13",
+ org.eclipse.osee.framework.core.data,
+ org.eclipse.osee.framework.core.exception,
+ org.eclipse.osee.framework.core.util,
+ org.eclipse.osee.framework.plugin.core.util,
+ org.eclipse.osee.ote.connection.jini,
+ org.eclipse.osee.ote.io,
+ org.eclipse.osee.ote.messaging.dds,
+ org.eclipse.osee.ote.messaging.dds.condition,
+ org.eclipse.osee.ote.messaging.dds.entity,
+ org.eclipse.osee.ote.messaging.dds.listener,
+ org.eclipse.osee.ote.messaging.dds.qos,
+ org.eclipse.osee.ote.messaging.dds.service,
+ org.eclipse.osee.ote.messaging.dds.status,
+ org.eclipse.osee.ote.messaging.dds.test,
+ org.eclipse.osee.ote.messaging.dds.test.data,
+ org.eclipse.osee.ote.properties,
+ org.osgi.service.event;version="1.3.0",
+ org.w3c.dom,
+ org.xml.sax,
+ org.xml.sax.ext,
+ org.xml.sax.helpers
+Service-Component: OSGI-INF/*.xml
+
diff --git a/org.eclipse.osee.ote.core/OSGI-INF/StatusBoardComponent.xml b/org.eclipse.osee.ote.core/OSGI-INF/StatusBoardComponent.xml
new file mode 100644
index 000000000..66a3b1428
--- /dev/null
+++ b/org.eclipse.osee.ote.core/OSGI-INF/StatusBoardComponent.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="start" deactivate="stop" immediate="true" name="org.eclipse.osee.ote.core.statusboard">
+ <implementation class="org.eclipse.osee.ote.core.environment.status.StatusBoard"/>
+ <reference bind="bindEventAdmin" cardinality="1..1" interface="org.osgi.service.event.EventAdmin" name="EventAdmin" policy="static" unbind="unbindEventAdmin"/>
+ <service>
+ <provide interface="org.eclipse.osee.ote.core.environment.status.OTEStatusBoard"/>
+ </service>
+</scr:component>
diff --git a/org.eclipse.osee.ote.core/OSGI-INF/message.service.handler.xml b/org.eclipse.osee.ote.core/OSGI-INF/message.service.handler.xml
new file mode 100644
index 000000000..cd8ac35ea
--- /dev/null
+++ b/org.eclipse.osee.ote.core/OSGI-INF/message.service.handler.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="start" deactivate="stop" name="org.eclipse.osee.ote.internal.RemoteMessageServiceHandler">
+ <implementation class="org.eclipse.osee.ote.internal.RemoteMessageServiceHandler"/>
+ <reference bind="bindIRemoteMessageService" cardinality="1..1" interface="org.eclipse.osee.ote.message.interfaces.IRemoteMessageService" name="IRemoteMessageService" policy="static" unbind="unbindIRemoteMessageService"/>
+ <reference bind="bindEventAdmin" cardinality="1..1" interface="org.osgi.service.event.EventAdmin" name="EventAdmin" policy="static" unbind="unbindEventAdmin"/>
+</scr:component>
diff --git a/org.eclipse.osee.ote.core/OSGI-INF/org.eclipse.osee.ote.io.xml b/org.eclipse.osee.ote.core/OSGI-INF/org.eclipse.osee.ote.io.xml
new file mode 100644
index 000000000..315052b5f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/OSGI-INF/org.eclipse.osee.ote.io.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="start" deactivate="stop" name="org.eclipse.osee.ote.core.systemoutconnection">
+ <implementation class="org.eclipse.osee.ote.internal.OTESystemOutConnection"/>
+ <reference bind="bindOteUdpEndpoint" cardinality="1..1" interface="org.eclipse.osee.ote.endpoint.OteUdpEndpoint" name="OteUdpEndpoint" policy="static" unbind="unbindOteUdpEndpoint"/>
+ <reference bind="bindSystemOutput" cardinality="1..1" interface="org.eclipse.osee.ote.io.SystemOutput" name="SystemOutput" policy="static" unbind="unbindSystemOutput"/>
+</scr:component>
diff --git a/org.eclipse.osee.ote.core/OSGI-INF/ote.api.component.xml b/org.eclipse.osee.ote.core/OSGI-INF/ote.api.component.xml
new file mode 100644
index 000000000..63fa06ed3
--- /dev/null
+++ b/org.eclipse.osee.ote.core/OSGI-INF/ote.api.component.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="start" deactivate="stop" name="org.eclipse.osee.ote.api">
+ <implementation class="org.eclipse.osee.ote.internal.OTEApiImpl"/>
+ <service>
+ <provide interface="org.eclipse.osee.ote.OTEApi"/>
+ </service>
+ <reference bind="bindRuntimeLibraryManager" cardinality="1..1" interface="org.eclipse.osee.ote.core.environment.interfaces.IRuntimeLibraryManager" name="IRuntimeLibraryManager" policy="static" unbind="unbindRuntimeLibraryManager"/>
+ <reference bind="bindOTEServerFolder" cardinality="1..1" interface="org.eclipse.osee.ote.io.OTEServerFolder" name="OTEServerFolder" policy="static" unbind="unbindOTEServerFolder"/>
+ <reference bind="bindOTEServerRuntimeCache" cardinality="1..1" interface="org.eclipse.osee.ote.OTEServerRuntimeCache" name="OTEServerRuntimeCache" policy="static" unbind="unbindOTEServerRuntimeCache"/>
+ <reference bind="bindTestEnvironmentInterface" cardinality="0..1" interface="org.eclipse.osee.ote.core.environment.TestEnvironmentInterface" name="TestEnvironmentInterface" policy="dynamic" unbind="unbindTestEnvironmentInterface"/>
+ <reference bind="bindIModelManager" cardinality="0..1" interface="org.eclipse.osee.ote.core.model.IModelManager" name="IModelManager" policy="dynamic" unbind="unbindIModelManager"/>
+ <reference bind="bindIRemoteMessageService" cardinality="0..1" interface="org.eclipse.osee.ote.message.interfaces.IRemoteMessageService" name="IRemoteMessageService" policy="dynamic" unbind="unbindIRemoteMessageService"/>
+ <reference bind="bindIHostTestEnvironment" cardinality="0..1" interface="org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment" name="IHostTestEnvironment" policy="dynamic" unbind="unbindIHostTestEnvironment"/>
+</scr:component>
diff --git a/org.eclipse.osee.ote.core/OSGI-INF/ote.endpoint.component.xml b/org.eclipse.osee.ote.core/OSGI-INF/ote.endpoint.component.xml
new file mode 100644
index 000000000..b88c82f1b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/OSGI-INF/ote.endpoint.component.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="start" deactivate="stop" immediate="true" name="org.eclipse.osee.ote.endpoint">
+ <implementation class="org.eclipse.osee.ote.internal.endpoint.EndpointComponent"/>
+ <service>
+ <provide interface="org.eclipse.osee.ote.endpoint.OteUdpEndpoint"/>
+ </service>
+ <reference bind="addDataProcessor" cardinality="0..n" interface="org.eclipse.osee.ote.endpoint.EndpointDataProcessor" name="EndpointDataProcessor" policy="dynamic" unbind="removeDataProcessor"/>
+ <reference cardinality="1..1" interface="org.osgi.service.event.EventAdmin" name="EventAdmin" policy="static"/>
+</scr:component>
diff --git a/org.eclipse.osee.ote.core/OSGI-INF/ote.runtime.manager.xml b/org.eclipse.osee.ote.core/OSGI-INF/ote.runtime.manager.xml
new file mode 100644
index 000000000..1ecc26649
--- /dev/null
+++ b/org.eclipse.osee.ote.core/OSGI-INF/ote.runtime.manager.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" enabled="true" immediate="true" name="org.eclipse.osee.ote.runtimeManager">
+ <implementation class="org.eclipse.osee.ote.internal.OTEBundleLoader"/>
+
+ <reference bind="bindOTEServerRuntimeCache" cardinality="1..1" interface="org.eclipse.osee.ote.OTEServerRuntimeCache" name="OTEServerRuntimeCache" policy="static" unbind="unbindOTEServerRuntimeCache"/> <service>
+ <provide interface="org.eclipse.osee.ote.core.environment.interfaces.IRuntimeLibraryManager"/>
+ </service>
+</scr:component>
diff --git a/org.eclipse.osee.ote.core/OSGI-INF/ote.server.runtime.cache.component.xml b/org.eclipse.osee.ote.core/OSGI-INF/ote.server.runtime.cache.component.xml
new file mode 100644
index 000000000..0f9a7fc2d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/OSGI-INF/ote.server.runtime.cache.component.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="start" deactivate="stop" immediate="true" name="org.eclipse.osee.ote.server.runtime.cache">
+ <implementation class="org.eclipse.osee.ote.internal.OTEServerRuntimeCacheImpl"/>
+ <reference bind="bindOTEServerFolder" cardinality="1..1" interface="org.eclipse.osee.ote.io.OTEServerFolder" name="OTEServerFolder" policy="static" unbind="unbindOTEServerFolder"/>
+ <service>
+ <provide interface="org.eclipse.osee.ote.OTEServerRuntimeCache"/>
+ </service>
+</scr:component>
diff --git a/org.eclipse.osee.ote.core/OSGI-INF/ote.sessions.xml b/org.eclipse.osee.ote.core/OSGI-INF/ote.sessions.xml
new file mode 100644
index 000000000..0f59c9859
--- /dev/null
+++ b/org.eclipse.osee.ote.core/OSGI-INF/ote.sessions.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="org.eclipse.osee.ote.core.OTESessionManager">
+ <implementation class="org.eclipse.osee.ote.core.internal.OTESessionManagerImpl"/>
+ <service>
+ <provide interface="org.eclipse.osee.ote.core.OTESessionManager"/>
+ </service>
+</scr:component>
diff --git a/org.eclipse.osee.ote.core/OSGI-INF/oteapi.handler.xml b/org.eclipse.osee.ote.core/OSGI-INF/oteapi.handler.xml
new file mode 100644
index 000000000..bc4426d8d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/OSGI-INF/oteapi.handler.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="start" deactivate="stop">
+ <implementation class="org.eclipse.osee.ote.internal.RemoteOteApiHandler"/>
+ <reference bind="bindOTEApi" cardinality="1..1" interface="org.eclipse.osee.ote.OTEApi" name="OTEApi" policy="static" unbind="unbindOTEApi"/>
+ <reference bind="bindEventAdmin" cardinality="1..1" interface="org.osgi.service.event.EventAdmin" name="EventAdmin" policy="static" unbind="unbindEventAdmin"/>
+ <reference bind="bindOteUdpEndpoint" cardinality="1..1" interface="org.eclipse.osee.ote.endpoint.OteUdpEndpoint" name="OteUdpEndpoint" policy="static" unbind="unbindOteUdpEndpoint"/>
+</scr:component>
diff --git a/org.eclipse.osee.ote.core/build.properties b/org.eclipse.osee.ote.core/build.properties
new file mode 100644
index 000000000..2655a11f0
--- /dev/null
+++ b/org.eclipse.osee.ote.core/build.properties
@@ -0,0 +1,8 @@
+output.. = bin/
+bin.includes = plugin.xml,\
+ META-INF/,\
+ images/,\
+ .,\
+ OSGI-INF/,\
+ OSGI-INF/org.eclipse.osee.ote.io.xml
+source.. = src/
diff --git a/org.eclipse.osee.ote.core/images/laser_16_16.gif b/org.eclipse.osee.ote.core/images/laser_16_16.gif
new file mode 100644
index 000000000..b29b25ee4
--- /dev/null
+++ b/org.eclipse.osee.ote.core/images/laser_16_16.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.core/plugin.xml b/org.eclipse.osee.ote.core/plugin.xml
new file mode 100644
index 000000000..af99d2318
--- /dev/null
+++ b/org.eclipse.osee.ote.core/plugin.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+
+ <extension
+ id="server"
+ name="OTE Server"
+ point="org.eclipse.core.runtime.applications">
+ <application
+ cardinality="singleton-global"
+ thread="main"
+ visible="true">
+ <run
+ class="org.eclipse.osee.ote.core.ServerApplication">
+ </run>
+ </application>
+ </extension>
+ <extension
+ id="server"
+ point="org.eclipse.core.runtime.products">
+ <product
+ application="org.eclipse.osee.ote.core.server"
+ name="OteServerStandalone">
+ <property
+ name="appName"
+ value="OteServerStandalone">
+ </property>
+ </product>
+ </extension>
+</plugin>
diff --git a/org.eclipse.osee.ote.core/pom.xml b/org.eclipse.osee.ote.core/pom.xml
new file mode 100644
index 000000000..ea7e026d8
--- /dev/null
+++ b/org.eclipse.osee.ote.core/pom.xml
@@ -0,0 +1,35 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.osee</groupId>
+ <artifactId>org.eclipse.osee.ote.parent</artifactId>
+ <version>0.25.3-SNAPSHOT</version>
+ <relativePath>../org.eclipse.osee.ote.parent</relativePath>
+ </parent>
+
+ <artifactId>org.eclipse.osee.ote.core</artifactId>
+ <packaging>eclipse-plugin</packaging>
+ <name>OTE Core (Incubation)</name>
+
+ <build>
+ <!-- workaround for https://issues.sonatype.org/browse/TYCHO-168 -->
+ <resources>
+ <resource>
+ <directory>src</directory>
+ <excludes>
+ <exclude>**/*.java</exclude>
+ </excludes>
+ </resource>
+ </resources>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-source-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/Configuration.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/Configuration.java
new file mode 100644
index 000000000..e92606ed5
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/Configuration.java
@@ -0,0 +1,31 @@
+package org.eclipse.osee.ote;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * This defines the bundles to be loaded into the OTE Server.
+ *
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class Configuration implements Serializable {
+
+ private static final long serialVersionUID = -3395485777990884086L;
+
+ private ArrayList<ConfigurationItem> items;
+
+ public Configuration() {
+ items = new ArrayList<>();
+ }
+
+ public List<ConfigurationItem> getItems() {
+ return items;
+ }
+
+ public void addItem(ConfigurationItem config) {
+ items.add(config);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/ConfigurationItem.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/ConfigurationItem.java
new file mode 100644
index 000000000..0eb7fa72d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/ConfigurationItem.java
@@ -0,0 +1,47 @@
+package org.eclipse.osee.ote;
+
+import java.io.Serializable;
+
+/**
+ * This defines the bundle to be loaded by the OTE Server.
+ *
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class ConfigurationItem implements Serializable {
+
+ private static final long serialVersionUID = -2805353994429454202L;
+ private String url;
+ private String version;
+ private String symbolicName;
+ private String md5;
+ private boolean isOsgiBundle;
+
+ public ConfigurationItem(String url, String version, String symbolicName, String md5, boolean isOsgiBundle) {
+ this.url = url;
+ this.version = version;
+ this.symbolicName = symbolicName;
+ this.md5 = md5;
+ }
+
+ public boolean isOsgiBundle() {
+ return isOsgiBundle;
+ }
+
+ public String getSymbolicName() {
+ return symbolicName;
+ }
+
+ public String getMd5Digest() {
+ return md5;
+ }
+
+ public String getVersion() {
+ return version;
+ }
+
+ public String getLocationUrl() {
+ return url;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/ConfigurationStatus.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/ConfigurationStatus.java
new file mode 100644
index 000000000..8a537147d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/ConfigurationStatus.java
@@ -0,0 +1,32 @@
+package org.eclipse.osee.ote;
+
+public class ConfigurationStatus {
+
+ private Configuration configuration;
+ private boolean success;
+ private String message;
+
+ public ConfigurationStatus(Configuration configuration, boolean success, String message) {
+ this.configuration = configuration;
+ this.success = success;
+ this.message = message;
+ }
+
+ public void setFail(String message) {
+ success = false;
+ this.message = message;
+ }
+
+ public boolean isSuccess(){
+ return success;
+ }
+
+ public String getMessage(){
+ return message;
+ }
+
+ public Configuration getConfiguration(){
+ return configuration;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/ConfigurationStatusCallback.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/ConfigurationStatusCallback.java
new file mode 100644
index 000000000..9458c9a80
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/ConfigurationStatusCallback.java
@@ -0,0 +1,9 @@
+package org.eclipse.osee.ote;
+
+public interface ConfigurationStatusCallback {
+
+ public void success();
+
+ public void failure(String errorLog);
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/HostServerProperties.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/HostServerProperties.java
new file mode 100644
index 000000000..61a4dc475
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/HostServerProperties.java
@@ -0,0 +1,20 @@
+package org.eclipse.osee.ote;
+
+
+public enum HostServerProperties {
+ name,
+ station,
+ version,
+ type,
+ maxUsers,
+ comment,
+ date,
+ group,
+ owner,
+ id,
+ activeMq,
+ appServerURI,
+ oteUdpEndpoint,
+ serverLaunchWorkingDir,
+ isSim
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/NonRemoteUserSession.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/NonRemoteUserSession.java
new file mode 100644
index 000000000..0c5090bcd
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/NonRemoteUserSession.java
@@ -0,0 +1,98 @@
+package org.eclipse.osee.ote;
+
+import java.io.Serializable;
+import java.util.UUID;
+
+import org.eclipse.osee.ote.core.IRemoteUserSession;
+import org.eclipse.osee.ote.core.OSEEPerson1_4;
+import org.eclipse.osee.ote.core.framework.prompt.IPassFailPromptResponse;
+import org.eclipse.osee.ote.core.framework.prompt.IResumeResponse;
+import org.eclipse.osee.ote.core.framework.prompt.IUserInputPromptResponse;
+import org.eclipse.osee.ote.core.framework.prompt.IYesNoPromptResponse;
+
+public class NonRemoteUserSession implements IRemoteUserSession, Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = -4094993884862781475L;
+
+ private OSEEPerson1_4 user;
+ private String address;
+
+ public NonRemoteUserSession(OSEEPerson1_4 user, String address){
+ this.user = user;
+ this.address = address;
+ }
+
+ @Override
+ public OSEEPerson1_4 getUser() {
+ return user;
+ }
+
+ @Override
+ public String getAddress() {
+ return address;
+ }
+
+ @Override
+ public byte[] getFile(String workspacePath) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public long getFileDate(String workspacePath) {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ @Override
+ public void initiateInformationalPrompt(String message) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void initiatePassFailPrompt(IPassFailPromptResponse prompt) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void initiateYesNoPrompt(IYesNoPromptResponse prompt) throws Exception {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void initiateUserInputPrompt(IUserInputPromptResponse prompt) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void initiateResumePrompt(IResumeResponse prompt) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void cancelPrompts() throws Exception {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public boolean isAlive() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public UUID getUserId() throws Exception {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/OTEApi.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/OTEApi.java
new file mode 100644
index 000000000..b21c52e72
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/OTEApi.java
@@ -0,0 +1,132 @@
+package org.eclipse.osee.ote;
+
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+
+import org.eclipse.osee.ote.core.environment.TestEnvironmentInterface;
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+import org.eclipse.osee.ote.core.model.IModelManager;
+import org.eclipse.osee.ote.io.OTEServerFolder;
+import org.eclipse.osee.ote.message.interfaces.IRemoteMessageService;
+
+/**
+ * This is an API that exposes some of the key test environment interfaces and operations. It is expected
+ * that clients of OTE will operate either directly through this API or indirectly using a remote REST or
+ * Event API that makes use of this API.
+ *
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public interface OTEApi {
+
+ /**
+ * Returns the OTEServerFolder service that enables management of the ote server folder area on
+ * the machine local to the server.
+ *
+ * @return the OTEServerFolder service
+ */
+ OTEServerFolder getServerFolder();
+
+ /**
+ * Returns the OTEServerJarCache that can be used for saving and getting files from the local
+ * ote server data store.
+ *
+ * @return the OTEServerJarCache service
+ */
+ OTEServerRuntimeCache getRuntimeCache();
+
+ /**
+ * Returns the IModelManager service that will give access to generic model controls. It depends on the TestEnvironmentInterface exisiting or it
+ * will be a null value.
+ *
+ * @return null or a valid IModelManager service
+ */
+ IModelManager getModelManager();
+
+ /**
+ * Returns the TestEnvironmentInterface service that is a top level object for interacting with the
+ * environment. It depends on a valid TestEnvironmentInterface getting registered. If we do not
+ * have a valid test environment it will return null. Generally a valid test environment will exist
+ * as long as a configuration has been loaded, this can happen if a user connects to a shell server
+ * or if we have an RCP that contains all the required startup information and bundles.
+ *
+ * @return null or a valid TestEnvironmentInterface service
+ */
+ TestEnvironmentInterface getTestEnvironment();
+
+ /**
+ * Returns a reference to the Environment implementation of the Remote message service, which allows clients
+ * to view environment message data.
+ *
+ * @return null or a valid IRemoteMessageService
+ */
+ IRemoteMessageService getRemoteMessageService();
+
+ /**
+ * This method will make sure that the requested configuration is available to the server and then install them.
+ * Only jars that are proper OSGI bundles will be loaded. This also means that if configuration items are
+ * not currently available to the server it will acquire them from the client using the URL in the configuration item.
+ *
+ * @param configuration
+ * @param callable
+ * @return
+ * @throws InterruptedException
+ * @throws ExecutionException
+ */
+ Future<ConfigurationStatus> loadConfiguration(Configuration configuration, OTEStatusCallback<ConfigurationStatus> callable) throws InterruptedException, ExecutionException;
+
+ /**
+ * This method will uninstall the previous bundle configuration.
+ *
+ * @param callable
+ * @return
+ * @throws InterruptedException
+ * @throws ExecutionException
+ */
+ Future<ConfigurationStatus> resetConfiguration(OTEStatusCallback<ConfigurationStatus> callable) throws InterruptedException, ExecutionException;
+
+ /**
+ * Gets the current test environment configuration.
+ *
+ * @return
+ */
+ Future<ConfigurationStatus> getConfiguration();
+
+ /**
+ * This method will make all bundles defined in the configuration available to the server. This means the server will attempt to use the URL in the configuration item
+ * to download any bundles not currently in its cache.
+ *
+ * @param configuration
+ * @param callable
+ * @return
+ * @throws InterruptedException
+ * @throws ExecutionException
+ */
+ Future<ConfigurationStatus> downloadConfigurationJars(Configuration configuration, OTEStatusCallback<ConfigurationStatus> callable) throws InterruptedException, ExecutionException;
+
+ /**
+ * Attempt to load a class from currently installed bundles and then from the script classpath.
+ *
+ * @param clazz
+ * @return the requested Class
+ * @throws ClassNotFoundException
+ */
+ Class<?> loadFromScriptClassLoader(String clazz) throws ClassNotFoundException;
+
+ /**
+ * Attempt to load a class from any currently installed bundled.
+ *
+ * @param clazz
+ * @return the requested Class
+ * @throws ClassNotFoundException
+ */
+ Class<?> loadFromRuntimeLibraryLoader(String clazz) throws ClassNotFoundException;
+
+ /**
+ * Get the host test environment. This method will return null if one has not yet been registered,
+ * so users need to check for null.
+ *
+ * @return the host environment or null if one is not created
+ */
+ IHostTestEnvironment getIHostTestEnvironment();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/OTEException.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/OTEException.java
new file mode 100644
index 000000000..db0e103cd
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/OTEException.java
@@ -0,0 +1,21 @@
+package org.eclipse.osee.ote;
+
+
+public class OTEException extends RuntimeException {
+
+ private static final long serialVersionUID = 8430838531056913404L;
+
+ public OTEException(String format, Throwable t) {
+ super(format, t);
+ }
+
+ public OTEException(String string) {
+ super(string);
+ }
+
+ public OTEException(Throwable e) {
+ super(e);
+ }
+
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/OTEServerRuntimeCache.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/OTEServerRuntimeCache.java
new file mode 100644
index 000000000..1dcb52272
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/OTEServerRuntimeCache.java
@@ -0,0 +1,26 @@
+package org.eclipse.osee.ote;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * Store, find and remove jars that are used when running an OTE test server.
+ *
+ * The format is <pre>
+ * rootFolder/symbolicName/md5.jar - the jar
+ * rootFolder/symbolicName/md5.jar.date - the last time it was accessed
+ * </pre>
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public interface OTEServerRuntimeCache {
+
+ void clearJarCache();
+
+ File save(String symbolicName, String md5Digest, InputStream servedBundleIn) throws IOException;
+
+ File get(String symbolicName, String md5Digest) throws FileNotFoundException;
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/OTEStatusCallback.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/OTEStatusCallback.java
new file mode 100644
index 000000000..28a15115b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/OTEStatusCallback.java
@@ -0,0 +1,18 @@
+package org.eclipse.osee.ote;
+
+
+public interface OTEStatusCallback<V> {
+
+ void complete(V done);
+
+ void setTotalUnitsOfWork(int totalUnitsOfWork);
+
+ void incrememtUnitsWorked(int count);
+
+ void log(String message);
+
+ void error(String message, Throwable th);
+
+ void error(String message);
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/OTETestEnvironmentClient.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/OTETestEnvironmentClient.java
new file mode 100644
index 000000000..7743f7bd5
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/OTETestEnvironmentClient.java
@@ -0,0 +1,388 @@
+package org.eclipse.osee.ote;
+
+import java.io.File;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.URISyntaxException;
+import java.rmi.RemoteException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadFactory;
+import java.util.logging.Level;
+
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.framework.jdk.core.type.PropertyStore;
+import org.eclipse.osee.framework.jdk.core.util.EnhancedProperties;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.network.PortUtil;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.ExportClassLoader;
+import org.eclipse.osee.ote.classserver.HeadlessClassServer;
+import org.eclipse.osee.ote.core.BundleInfo;
+import org.eclipse.osee.ote.core.ConnectionRequestResult;
+import org.eclipse.osee.ote.core.IRemoteUserSession;
+import org.eclipse.osee.ote.core.ServiceUtility;
+import org.eclipse.osee.ote.core.environment.TestEnvironmentConfig;
+import org.eclipse.osee.ote.core.framework.command.ICommandHandle;
+import org.eclipse.osee.ote.core.framework.command.ITestCommandResult;
+import org.eclipse.osee.ote.core.framework.command.RunTests;
+import org.eclipse.osee.ote.endpoint.OteEndpointUtil;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpoint;
+import org.eclipse.osee.ote.filetransfer.TcpFileTransfer;
+import org.eclipse.osee.ote.filetransfer.TcpFileTransferHandle;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.message.event.send.OteEndpointSendEventMessage;
+import org.eclipse.osee.ote.message.event.send.OteEventMessageFuture;
+import org.eclipse.osee.ote.message.event.send.OteSendEventMessage;
+import org.eclipse.osee.ote.properties.OtePropertiesCore;
+import org.eclipse.osee.ote.remote.messages.BooleanResponse;
+import org.eclipse.osee.ote.remote.messages.ConfigurationAndResponse;
+import org.eclipse.osee.ote.remote.messages.DisconnectRemoteTestEnvironment;
+import org.eclipse.osee.ote.remote.messages.RequestHostEnvironmentProperties;
+import org.eclipse.osee.ote.remote.messages.RequestRemoteTestEnvironment;
+import org.eclipse.osee.ote.remote.messages.RunTestsCancel;
+import org.eclipse.osee.ote.remote.messages.RunTestsGetCommandResultReq;
+import org.eclipse.osee.ote.remote.messages.RunTestsGetCommandResultResp;
+import org.eclipse.osee.ote.remote.messages.RunTestsIsCancelled;
+import org.eclipse.osee.ote.remote.messages.RunTestsIsDone;
+import org.eclipse.osee.ote.remote.messages.RunTestsSerialized;
+import org.eclipse.osee.ote.remote.messages.SerializedConfigurationAndResponse;
+import org.eclipse.osee.ote.remote.messages.SerializedConnectionRequestResult;
+import org.eclipse.osee.ote.remote.messages.SerializedDisconnectRemoteTestEnvironment;
+import org.eclipse.osee.ote.remote.messages.SerializedEnhancedProperties;
+import org.eclipse.osee.ote.remote.messages.SerializedOTEJobStatus;
+import org.eclipse.osee.ote.remote.messages.SerializedRequestRemoteTestEnvironment;
+import org.eclipse.osee.ote.remote.messages.TestEnvironmentServerShutdown;
+import org.eclipse.osee.ote.remote.messages.TestEnvironmentSetBatchMode;
+import org.eclipse.osee.ote.remote.messages.TestEnvironmentTransferFile;
+import org.osgi.service.event.EventAdmin;
+
+public class OTETestEnvironmentClient {
+
+ private OteUdpEndpoint service;
+ private InetSocketAddress destinationAddress;
+ private ExecutorService pool;
+
+ public static OTETestEnvironmentClient getInstance(String endpoint){
+ return new OTETestEnvironmentClient(ServiceUtility.getService(OteUdpEndpoint.class), OteEndpointUtil.getAddress(endpoint));
+ }
+
+ public OTETestEnvironmentClient(OteUdpEndpoint service, InetSocketAddress destinationAddress) {
+ this.service = service;
+ this.destinationAddress = destinationAddress;
+ this.pool = Executors.newCachedThreadPool(new ThreadFactory() {
+
+ @Override
+ public Thread newThread(Runnable arg0) {
+ Thread th = new Thread(arg0);
+ th.setName("OTETestEnvironmentClient Thread");
+ return th;
+ }
+ });
+ }
+
+ public void shutdownServer(String serverId){
+ TestEnvironmentServerShutdown shutdown = new TestEnvironmentServerShutdown();
+ shutdown.SERVER_ID.setValue(serverId);
+ OteEndpointSendEventMessage sendit = new OteEndpointSendEventMessage(service, destinationAddress);
+ sendit.asynchSend(shutdown);
+ }
+
+ public boolean getServerFile(File localFile, File serverFile) throws IOException, ExecutionException, InterruptedException{
+ TcpFileTransferHandle receiveFile = TcpFileTransfer.receiveFile(pool, localFile, 0);
+ TestEnvironmentTransferFile transferFile = new TestEnvironmentTransferFile();
+ transferFile.ADDRESS.setAddress(receiveFile.getLocalAddress().getAddress());
+ transferFile.ADDRESS.setPort(receiveFile.getLocalAddress().getPort());
+ transferFile.FILE_PATH.setValue(serverFile.getAbsolutePath());
+ OteEventMessageUtil.sendEvent(transferFile);
+ return receiveFile.awaitCompletion();
+ }
+
+ public void setBatchMode(boolean batchMode) throws URISyntaxException, InterruptedException, ExecutionException, IOException {
+ TestEnvironmentSetBatchMode setBatchMode = new TestEnvironmentSetBatchMode();
+ setBatchMode.SET_BATCH_MODE.setValue(batchMode);
+ OteEventMessageUtil.postEvent(setBatchMode);
+ }
+
+ public ICommandHandle runScripts(UUID sessionId, PropertyStore globalProperties, List<IPropertyStore> scriptProperties, boolean useOTEBuilderJars, File rootFolderForOTEBuilderJars, SubProgressMonitor monitor, String serverId, ConfigurationStatusCallback configurationStatusCallback) throws URISyntaxException, InterruptedException, ExecutionException, IOException {
+ Configuration configuration = null;
+ if(useOTEBuilderJars){
+ configuration = configureEnvironment(serverId, rootFolderForOTEBuilderJars, monitor, configurationStatusCallback);
+ }
+ RunTests runTests = new RunTests(UUID.randomUUID().toString(), sessionId, configuration, globalProperties, scriptProperties);
+
+ OteEventMessageUtil.postEvent(new RunTestsSerialized(runTests));
+ return new EventRunTestsHandle(runTests.getGUID(), new OteSendEventMessage(ServiceUtility.getService(EventAdmin.class)));
+ }
+
+ public Configuration configureEnvironment(String serverId, final List<File> bundlesToSend, final boolean installBundles, final SubProgressMonitor monitor, final ConfigurationStatusCallback configurationStatusCallback) {
+ HeadlessClassServer classServer = null;
+ Configuration localConfiguration = new Configuration();
+ try{
+
+ classServer = new HeadlessClassServer(PortUtil.getInstance().getValidPort(), InetAddress.getLocalHost(), bundlesToSend);
+ for (BundleInfo bundleInfo : classServer.getBundles()) {
+ ConfigurationItem item = new ConfigurationItem(bundleInfo.getServerBundleLocation().toString(),bundleInfo.getVersion(),bundleInfo.getSymbolicName(), bundleInfo.getMd5Digest(), installBundles);
+ localConfiguration.addItem(item);
+ }
+
+ if(service != null){
+ InetSocketAddress address = service.getLocalEndpoint();
+ ConfigurationAndResponse configAndResponse = new ConfigurationAndResponse(address.getAddress().getHostAddress(), address.getPort(), localConfiguration, installBundles, serverId);
+ SerializedConfigurationAndResponse ser = new SerializedConfigurationAndResponse();
+ ser.setObject(configAndResponse);
+ ser.getHeader().RESPONSE_TOPIC.setValue(SerializedOTEJobStatus.EVENT);
+
+ OteEndpointSendEventMessage sendit = new OteEndpointSendEventMessage(service, destinationAddress);
+ service.removeBroadcast(null);
+ service.addBroadcast(service.getOteEndpointSender(destinationAddress));//so we can communicate via console before connect
+ WaitForCompletion completion = new WaitForCompletion(monitor);
+ final OteEventMessageFuture<SerializedConfigurationAndResponse, SerializedOTEJobStatus> asynchSendAndResponse = sendit.asynchSendAndMultipleResponse(SerializedOTEJobStatus.class, ser, completion, 1000 * 60 * 10);
+ Thread th = new Thread(new Runnable(){
+ @Override
+ public void run() {
+ while(true){
+ if(monitor != null && monitor.isCanceled()){
+ asynchSendAndResponse.complete();
+ return;
+ } else if (asynchSendAndResponse.isDone()){
+ return;
+ } else {
+ try {
+ Thread.sleep(2000);
+ } catch (InterruptedException e) {
+ }
+ }
+ }
+ }
+ });
+ th.setDaemon(true);
+ th.start();
+ asynchSendAndResponse.waitForCompletion();
+ if(!asynchSendAndResponse.isTimedOut() && completion.getStatus() != null){
+ if(completion.getStatus().isSuccess()){
+ configurationStatusCallback.success();
+ } else {
+ String errorLog = completion.getStatus().getErrorLog();
+ if(errorLog.length() > 0){
+ configurationStatusCallback.failure(errorLog);
+ } else {//no diff report, must be the same version
+ configurationStatusCallback.success();
+ }
+ }
+ }
+ }
+ } catch (Throwable th){
+ th.printStackTrace();
+ } finally {
+ if(classServer != null){
+ classServer.stop();
+ }
+ }
+ return localConfiguration;
+ }
+
+ private Configuration configureEnvironment(String serverId, final File oteBuilderRootFolder, final SubProgressMonitor monitor, final ConfigurationStatusCallback configurationStatusCallback) {
+ HeadlessClassServer classServer = null;
+ Configuration localConfiguration = new Configuration();
+ try{
+ List<File> bundlesToSend = new ArrayList<>();
+ bundlesToSend.add(oteBuilderRootFolder);
+ classServer = new HeadlessClassServer(PortUtil.getInstance().getValidPort(), InetAddress.getLocalHost(), bundlesToSend);
+ File[] jars = oteBuilderRootFolder.listFiles(new FilenameFilter(){
+ @Override
+ public boolean accept(File arg0, String arg1) {
+ return arg1.endsWith(".jar");
+ }
+ });
+ for (File jar : jars) {
+ try{
+ ConfigurationItem item = new ConfigurationItem(classServer.getHostName() + jar.getName(), "1.0", jar.getName(), Lib.fileToString(new File(jar.getAbsolutePath() + ".md5")), false);
+ localConfiguration.addItem(item);
+ } catch (IOException ex) {
+ OseeLog.log(OTETestEnvironmentClient.class, Level.SEVERE, ex);
+ }
+ }
+
+ if(service != null){
+ InetSocketAddress address = service.getLocalEndpoint();
+ ConfigurationAndResponse configAndResponse = new ConfigurationAndResponse(address.getAddress().getHostAddress(), address.getPort(), localConfiguration, false, serverId);
+ SerializedConfigurationAndResponse ser = new SerializedConfigurationAndResponse();
+ ser.setObject(configAndResponse);
+ ser.getHeader().RESPONSE_TOPIC.setValue(SerializedOTEJobStatus.EVENT);
+
+ OteEndpointSendEventMessage sendit = new OteEndpointSendEventMessage(service, destinationAddress);
+ WaitForCompletion completion = new WaitForCompletion(monitor);
+ final OteEventMessageFuture<SerializedConfigurationAndResponse, SerializedOTEJobStatus> asynchSendAndResponse = sendit.asynchSendAndMultipleResponse(SerializedOTEJobStatus.class, ser, completion, 1000 * 60 * 10);
+ Thread th = new Thread(new Runnable(){
+ @Override
+ public void run() {
+ while(true){
+ if(monitor.isCanceled()){
+ asynchSendAndResponse.complete();
+ return;
+ } else if (asynchSendAndResponse.isDone()){
+ return;
+ } else {
+ try {
+ Thread.sleep(2000);
+ } catch (InterruptedException e) {
+ }
+ }
+ }
+ }
+ });
+ th.setDaemon(true);
+ th.start();
+ asynchSendAndResponse.waitForCompletion();
+ if(!asynchSendAndResponse.isTimedOut() && completion.getStatus() != null){
+ if(completion.getStatus().isSuccess()){
+ configurationStatusCallback.success();
+ } else {
+ String errorLog = completion.getStatus().getErrorLog();
+ if(errorLog.length() > 0){
+ configurationStatusCallback.failure(errorLog);
+ } else {//no diff report, must be the same version
+ configurationStatusCallback.success();
+ }
+ }
+ }
+ }
+ } catch (Throwable th){
+ th.printStackTrace();
+ } finally {
+ if(classServer != null){
+ classServer.stop();
+ }
+ }
+ return localConfiguration;
+ }
+
+ private static class EventRunTestsHandle implements ICommandHandle {
+
+ private String guid;
+ private OteSendEventMessage sendit;
+
+ public EventRunTestsHandle(String guid, OteSendEventMessage sendit){
+ this.guid = guid;
+ this.sendit = sendit;
+ }
+
+ @Override
+ public boolean cancelAll(boolean mayInterruptIfRunning) {
+ RunTestsCancel cancel = new RunTestsCancel();
+ cancel.CANCEL_ALL.setValue(true);
+ cancel.GUID.setValue(guid);
+ sendit.asynchSend(cancel);
+ return true;
+ }
+
+ @Override
+ public boolean cancelSingle(boolean mayInterruptIfRunning) {
+ RunTestsCancel cancel = new RunTestsCancel();
+ cancel.CANCEL_ALL.setValue(false);
+ cancel.GUID.setValue(guid);
+ sendit.asynchSend(cancel);
+ return true;
+ }
+
+ @Override
+ public ITestCommandResult get() {
+ RunTestsGetCommandResultReq req = new RunTestsGetCommandResultReq();
+ RunTestsGetCommandResultResp resp = new RunTestsGetCommandResultResp();
+ req.GUID.setValue(guid);
+ resp = sendit.synchSendAndResponse(resp, req, 30000);
+ ITestCommandResult result = null;
+ try {
+ result = resp.getObject();
+ } catch (IOException e) {
+ e.printStackTrace();
+ } catch (ClassNotFoundException e) {
+ e.printStackTrace();
+ }
+ return result;
+ }
+
+ @Override
+ public boolean isCancelled() {
+ BooleanResponse booleanResponse = new BooleanResponse();
+ RunTestsIsCancelled req = new RunTestsIsCancelled();
+ req.GUID.setValue(guid);
+ booleanResponse = sendit.synchSendAndResponse(booleanResponse, req, 20000);
+ return booleanResponse.VALUE.getValue();
+ }
+
+ @Override
+ public boolean isDone() {
+ BooleanResponse booleanResponse = new BooleanResponse();
+ RunTestsIsDone req = new RunTestsIsDone();
+ req.GUID.setValue(guid);
+ booleanResponse = sendit.synchSendAndResponse(booleanResponse, req, 20000);
+ return booleanResponse.VALUE.getValue();
+ }
+
+ @Override
+ public String getCommandKey() {
+ return guid;
+ }
+
+ }
+
+ public EnhancedProperties getProperties(long timeout) {
+ SerializedEnhancedProperties props = new SerializedEnhancedProperties();
+ RequestHostEnvironmentProperties req = new RequestHostEnvironmentProperties();
+ OteEndpointSendEventMessage sendit = new OteEndpointSendEventMessage(service, destinationAddress);
+ props = sendit.synchSendAndResponse(props, req, timeout);
+ EnhancedProperties returnVal = null;
+ try {
+ if(props != null){
+ returnVal = props.getObject();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ } catch (ClassNotFoundException e) {
+ e.printStackTrace();
+ }
+ return returnVal;
+ }
+
+ public ConnectionRequestResult requestEnvironment(IRemoteUserSession session, UUID id, TestEnvironmentConfig config) throws RemoteException {
+ Thread.currentThread().setContextClassLoader(new ExportClassLoader());
+ try {
+ SerializedRequestRemoteTestEnvironment req = new SerializedRequestRemoteTestEnvironment(new RequestRemoteTestEnvironment(session, id, config));
+ SerializedConnectionRequestResult result = new SerializedConnectionRequestResult();
+ OteEndpointSendEventMessage sendit = new OteEndpointSendEventMessage(service, destinationAddress);
+ result = sendit.synchSendAndResponse(result, req, OtePropertiesCore.serverConnectionTimeout.getLongValue(1000 * 30));
+ if(result != null){
+ return result.getObject();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ } catch (ClassNotFoundException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ public void disconnect(UUID sessionId) throws RemoteException {
+ try {
+ SerializedDisconnectRemoteTestEnvironment req = new SerializedDisconnectRemoteTestEnvironment(new DisconnectRemoteTestEnvironment(sessionId));
+ OteEndpointSendEventMessage sendit = new OteEndpointSendEventMessage(service, destinationAddress);
+ sendit.asynchSend(req);
+ if(service != null){
+ service.removeBroadcast(service.getOteEndpointSender(destinationAddress));
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/OseeLogStatusCallback.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/OseeLogStatusCallback.java
new file mode 100644
index 000000000..d33f6413b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/OseeLogStatusCallback.java
@@ -0,0 +1,39 @@
+package org.eclipse.osee.ote;
+
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+
+public class OseeLogStatusCallback implements OTEStatusCallback<ConfigurationStatus> {
+
+ @Override
+ public void complete(ConfigurationStatus done) {
+ OseeLog.log(getClass(), Level.INFO, done.getMessage());
+ }
+
+ @Override
+ public void setTotalUnitsOfWork(int totalUnitsOfWork) {
+
+ }
+
+ @Override
+ public void incrememtUnitsWorked(int count) {
+
+ }
+
+ @Override
+ public void log(String message) {
+ OseeLog.log(getClass(), Level.INFO, message);
+ }
+
+ @Override
+ public void error(String message, Throwable th) {
+ OseeLog.log(getClass(), Level.SEVERE, message, th);
+ }
+
+ @Override
+ public void error(String message) {
+ OseeLog.log(getClass(), Level.SEVERE, message);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/WaitForCompletion.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/WaitForCompletion.java
new file mode 100644
index 000000000..883d1208f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/WaitForCompletion.java
@@ -0,0 +1,67 @@
+package org.eclipse.osee.ote;
+
+import java.io.IOException;
+
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.osee.ote.message.event.send.OteEventMessageCallable;
+import org.eclipse.osee.ote.message.event.send.OteEventMessageFuture;
+import org.eclipse.osee.ote.remote.messages.JobStatus;
+import org.eclipse.osee.ote.remote.messages.SerializedConfigurationAndResponse;
+import org.eclipse.osee.ote.remote.messages.SerializedOTEJobStatus;
+
+class WaitForCompletion implements OteEventMessageCallable<SerializedConfigurationAndResponse, SerializedOTEJobStatus> {
+
+ private SubProgressMonitor monitor;
+ private int lastUnitsWorked = 0;
+ private boolean firstTime = true;
+ private JobStatus status;
+
+ WaitForCompletion(SubProgressMonitor monitor) {
+ this.monitor = monitor;
+ }
+
+ @Override
+ public void call(SerializedConfigurationAndResponse transmitted, SerializedOTEJobStatus recieved, OteEventMessageFuture<?, ?> future) {
+
+ try {
+ this.status = recieved.getObject();
+ reportStatus(status, future);
+ } catch (IOException e) {
+ e.printStackTrace();
+ } catch (ClassNotFoundException e) {
+ e.printStackTrace();
+ }
+ }
+
+ private synchronized void reportStatus(JobStatus status, OteEventMessageFuture<?, ?> future) {
+ if(monitor != null){
+ if(monitor.isCanceled() || status.isJobComplete()){
+ monitor.done();
+ future.complete();
+ return;
+ }
+ if(firstTime){
+ monitor.beginTask("Configure Test Server", status.getTotalUnitsOfWork());
+ firstTime = false;
+ } else {
+ monitor.worked(status.getUnitsWorked() - lastUnitsWorked);
+ lastUnitsWorked = status.getUnitsWorked();
+ }
+ } else {
+ if(status.isJobComplete()){
+ future.complete();
+ return;
+ }
+ }
+ }
+
+ @Override
+ public void timeout(SerializedConfigurationAndResponse transmitted) {
+ System.out.println("timed out");
+ }
+
+ public JobStatus getStatus(){
+ return this.status;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/BundleResourceFinder.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/BundleResourceFinder.java
new file mode 100644
index 000000000..0d01b461b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/BundleResourceFinder.java
@@ -0,0 +1,34 @@
+package org.eclipse.osee.ote.classserver;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.List;
+
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.ote.classserver.ResourceFinder;
+import org.eclipse.osee.ote.core.BundleInfo;
+
+public class BundleResourceFinder extends ResourceFinder {
+
+ private final List<BundleInfo> bundleInfo;
+
+ public BundleResourceFinder(List<BundleInfo> bundleInfo) {
+ super();
+ this.bundleInfo = bundleInfo;
+ }
+
+ @Override
+ public byte[] find(String path) throws IOException {
+ for (BundleInfo info : bundleInfo) {
+ if (info.getSymbolicName().equals(path) || info.getFile().getName().equals(path)) {
+ return Lib.inputStreamToBytes(new FileInputStream(info.getFile()));
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public void dispose() {
+ //
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/ClassFinder.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/ClassFinder.java
new file mode 100644
index 000000000..24914a549
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/ClassFinder.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.classserver;
+
+import java.io.IOException;
+import org.eclipse.osee.framework.plugin.core.util.ExportClassLoader;
+import org.osgi.framework.Bundle;
+
+public class ClassFinder extends ResourceFinder {
+
+ private final ExportClassLoader loader = new ExportClassLoader();
+
+ @Override
+ public void dispose() {
+ }
+
+ @Override
+ public byte[] find(String path) throws IOException {
+ Bundle bundle = loader.getExportingBundle(path);
+ if (bundle != null) {
+ return getBytes(bundle.getResource(path).openStream());
+ }
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/ClassServer.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/ClassServer.java
new file mode 100644
index 000000000..10d605f91
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/ClassServer.java
@@ -0,0 +1,318 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.classserver;
+
+import java.io.BufferedInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.Inet6Address;
+import java.net.InetAddress;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadFactory;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+
+public class ClassServer extends Thread {
+ private ServerSocket server;
+ private URL hostName;
+ private List<ResourceFinder> resourceFinders;
+
+ private ExecutorService socketThreads;
+
+ /**
+ * Construct a server
+ *
+ * @param port the port to use
+ * @throws IOException if the server socket cannot be created
+ */
+ public ClassServer(int port, InetAddress address) throws IOException {
+ server = new ServerSocket(port, 50, address);
+ socketThreads = Executors.newCachedThreadPool(new ThreadFactory() {
+
+ @Override
+ public Thread newThread(Runnable arg0) {
+ Thread th = new Thread(arg0, "ClassServer Task");
+ th.setDaemon(true);
+ return th;
+ }
+ });
+ if(address instanceof Inet6Address){
+ hostName = new URL("http://[" + address.getHostAddress() + "]:" + server.getLocalPort() + "/");
+ } else {
+ hostName = new URL("http://" + address.getHostAddress() + ":" + server.getLocalPort() + "/");
+ }
+ this.setName("OSEE ClassServer");
+ this.resourceFinders = new ArrayList<>();
+ }
+
+ public void addResourceFinder(ResourceFinder finder) {
+ this.resourceFinders.add(finder);
+ }
+
+ /**
+ * Spawn a thread for each connection requesting service
+ */
+ @Override
+ public void run() {
+
+ String msg = "ClassServer started [";
+
+ msg += "port ";
+ msg += Integer.toString(getPort());
+ msg += "]";
+
+ OseeLog.log(ClassServer.class, Level.INFO, msg);
+ try {
+ while (true) {
+ Socket socket = server.accept();
+ socketThreads.submit(new Task(socket));
+ }
+ } catch (IOException e) {
+ synchronized (this) {
+ if (!server.isClosed()) {
+ OseeLog.log(ClassServer.class, Level.SEVERE, "accepting connection", e);
+ terminate();
+ OseeLog.log(ClassServer.class, Level.WARNING, "ClassServer Terminated");
+ }
+ }
+ }
+ }
+
+ /**
+ * Terminate Server - perform cleanup
+ */
+ public synchronized void terminate() {
+ try {
+ server.close();
+ } catch (IOException e) {
+ // do nothing
+ }
+ final Iterator<ResourceFinder> iter = resourceFinders.iterator();
+ while (iter.hasNext()) {
+ final ResourceFinder resFinder = iter.next();
+ resFinder.dispose();
+ }
+
+ }
+
+ /** Returns the port on which this server is listening. */
+ public int getPort() {
+ return server.getLocalPort();
+ }
+
+ /** Read up to CRLF, return false if EOF */
+ private static boolean readLine(InputStream in, StringBuffer buf) throws IOException {
+ while (true) {
+ int c = in.read();
+ if (c < 0) {
+ return buf.length() > 0;
+ }
+ if (c == '\r') {
+ in.mark(1);
+ c = in.read();
+ if (c != '\n') {
+ in.reset();
+ }
+ return true;
+ }
+ if (c == '\n') {
+ return true;
+ }
+ buf.append((char) c);
+ }
+ }
+
+ /** Read the request/response and return the initial line. */
+ private static String getInput(Socket sock, boolean isRequest) throws IOException {
+ BufferedInputStream in = new BufferedInputStream(sock.getInputStream(), 256);
+ StringBuffer buf = new StringBuffer(80);
+ do {
+ if (!readLine(in, buf)) {
+ return null;
+ }
+ } while (isRequest && buf.length() == 0);
+ String initial = buf.toString();
+ do {
+ buf.setLength(0);
+ } while (readLine(in, buf) && buf.length() > 0);
+ return initial;
+ }
+
+ /**
+ * This method provides a way for subclasses to be notified when a file has been completely downloaded.
+ *
+ * @param fp The path to the file that was downloaded.
+ */
+ protected void fileDownloaded(String fp, InetAddress addr) {
+ }
+
+ public URL getHostName() {
+ return hostName;
+ }
+
+ private class Task implements Runnable {// Thread {
+
+ private final Socket sock;
+
+ public Task(Socket sock) {
+ this.sock = sock;
+ // setDaemon(true);
+ }
+
+ /**
+ * Get bytes from path Returns the bytes of the requested file, or null if not found.
+ */
+ private byte[] getBytes(String path) throws IOException {
+ byte[] bytes = null;
+ for (int i = 0; i < resourceFinders.size(); i++) {
+ ResourceFinder finder = resourceFinders.get(i);
+ bytes = finder.find(path);
+ if (bytes != null) {
+ return bytes;
+ }
+ }
+ OseeLog.log(ClassServer.class, Level.INFO, "requested file: '" + path + "' was not found.");
+ return null;
+ }
+
+ /** Parse % HEX HEX from s starting at i */
+ private char decode(String s, int i) {
+ return (char) Integer.parseInt(s.substring(i + 1, i + 3), 16);
+ }
+
+ private String getCanonicalizedPath(String path) {
+ try {
+ if (path.regionMatches(true, 0, "http://", 0, 7)) {
+ int i = path.indexOf('/', 7);
+ if (i < 0) {
+ path = "/";
+ } else {
+ path = path.substring(i);
+ }
+ }
+ for (int i = path.indexOf('%'); i >= 0; i = path.indexOf('%', i + 1)) {
+ char c = decode(path, i);
+ int n = 3;
+ if ((c & 0x80) != 0) {
+ switch (c >> 4) {
+ case 0xC:
+ case 0xD:
+ n = 6;
+ c = (char) ((c & 0x1F) << 6 | decode(path, i + 3) & 0x3F);
+ break;
+ case 0xE:
+ n = 9;
+ c = (char) ((c & 0x0f) << 12 | (decode(path, i + 3) & 0x3F) << 6 | decode(path, i + 6) & 0x3F);
+ break;
+ default:
+ return null;
+ }
+ }
+ path = path.substring(0, i) + c + path.substring(i + n);
+ }
+ } catch (Exception e) {
+ return null;
+ }
+ if (path.length() == 0 || path.charAt(0) != '/') {
+ return null;
+ }
+ return path.substring(1);
+ }
+
+ @Override
+ public void run() {
+ try {
+ DataOutputStream out = new DataOutputStream(sock.getOutputStream());
+ String req;
+ try {
+ req = getInput(sock, true);
+ } catch (Exception e) {
+ OseeLog.log(ClassServer.class, Level.INFO, "reading request", e);
+ return;
+ }
+ if (req == null) {
+ return;
+ }
+ if (req.startsWith("SHUTDOWN *")) {
+ out.writeBytes("HTTP/1.0 403 Forbidden\r\n\r\n");
+ out.flush();
+ return;
+ }
+ String[] args = null;
+ boolean get = req.startsWith("GET ");
+ if (!get && !req.startsWith("HEAD ")) {
+ OseeLog.log(ClassServer.class, Level.FINE, "bad request \"{0}\" from {1}:{2}");
+ out.writeBytes("HTTP/1.0 400 Bad Request\r\n\r\n");
+ out.flush();
+ return;
+ }
+ String path = req.substring(get ? 4 : 5);
+ int i = path.indexOf(' ');
+ if (i > 0) {
+ path = path.substring(0, i);
+ }
+ path = getCanonicalizedPath(path);
+ if (path == null) {
+ OseeLog.log(ClassServer.class, Level.FINE, "bad request \"{0}\" from {1}:{2}");
+ out.writeBytes("HTTP/1.0 400 Bad Request\r\n\r\n");
+ out.flush();
+ return;
+ }
+ if (args != null) {
+ args[0] = path;
+ }
+ OseeLog.log(ClassServer.class, Level.FINER,
+ get ? "{0} requested from {1}:{2}" : "{0} probed from {1}:{2}");
+ byte[] bytes;
+ try {
+ bytes = getBytes(path);
+ } catch (Exception e) {
+ OseeLog.log(ClassServer.class, Level.WARNING, "getting bytes", e);
+ out.writeBytes("HTTP/1.0 500 Internal Error\r\n\r\n");
+ out.flush();
+ return;
+ }
+ if (bytes == null) {
+ OseeLog.logf(ClassServer.class, Level.FINE, "%s not found", path);
+ out.writeBytes("HTTP/1.0 404 Not Found\r\n\r\n");
+ out.flush();
+ return;
+ }
+ out.writeBytes("HTTP/1.0 200 OK\r\n");
+ out.writeBytes("Content-Length: " + bytes.length + "\r\n");
+ out.writeBytes("Content-Type: application/java\r\n\r\n");
+ if (get) {
+ out.write(bytes);
+ }
+ out.flush();
+ if (get) {
+ fileDownloaded(path, sock.getInetAddress());
+ }
+ } catch (Exception e) {
+ OseeLog.log(ClassServer.class, Level.INFO, "writing response", e);
+ } finally {
+ try {
+ sock.close();
+ } catch (IOException e) {
+ }
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/ClassServerPermissions.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/ClassServerPermissions.java
new file mode 100644
index 000000000..3047dc666
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/ClassServerPermissions.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.classserver;
+
+import java.security.Permission;
+import java.security.PermissionCollection;
+import java.util.ArrayList;
+import java.util.Enumeration;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class ClassServerPermissions extends PermissionCollection {
+
+ private static final long serialVersionUID = 7752469678730039503L;
+ private final ArrayList<Permission> list;
+
+ public ClassServerPermissions() {
+ list = new ArrayList<>();
+ }
+
+ @Override
+ public void add(Permission permission) {
+ list.add(permission);
+ }
+
+ @Override
+ public boolean implies(Permission permission) {
+ for (int i = 0; i < list.size(); i++) {
+ if (list.get(i).implies(permission)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public Enumeration<Permission> elements() {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/FrameworkResourceFinder.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/FrameworkResourceFinder.java
new file mode 100644
index 000000000..c5260fd86
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/FrameworkResourceFinder.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.classserver;
+
+import java.io.IOException;
+import java.net.URL;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.FrameworkUtil;
+
+public class FrameworkResourceFinder extends ResourceFinder{
+
+ @Override
+ public byte[] find(String path) throws IOException {
+ for(Bundle bundle:FrameworkUtil.getBundle(getClass()).getBundleContext().getBundles()){
+ URL url = bundle.getResource(path);
+ if (url != null) {
+ return getBytes(url.openStream());
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public void dispose() {
+
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/HeadlessClassServer.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/HeadlessClassServer.java
new file mode 100644
index 000000000..2988e3f82
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/HeadlessClassServer.java
@@ -0,0 +1,88 @@
+package org.eclipse.osee.ote.classserver;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.osee.ote.core.BundleInfo;
+
+
+
+public class HeadlessClassServer {
+
+ private ClassServer classServer;
+ private List<BundleInfo> jars;
+
+ public HeadlessClassServer(int port, InetAddress address, List<File> bundleFolders) throws IOException{
+// Thread.currentThread().setName("BundleClassServer");
+ classServer = new ClassServer(port, address);
+ jars = new ArrayList<>();
+ for(File dir:bundleFolders){
+ if(dir.exists() && dir.isDirectory()){
+ findJarFiles(dir, jars);
+ } else if(dir.exists()){//it may be a jar
+ BundleInfo info = getBundleInfo(dir);
+ if(info != null){
+ jars.add(info);
+ }
+ }
+ }
+ BundleResourceFinder bundleResourceFinder = new BundleResourceFinder(jars);
+ classServer.addResourceFinder(bundleResourceFinder);
+ classServer.start();
+
+ }
+
+ public void stop(){
+ classServer.terminate();
+ }
+
+ public List<BundleInfo> getBundles(){
+ return jars;
+ }
+
+ private void findJarFiles(File dir, final List<BundleInfo> jars) {
+ dir.listFiles(new FileFilter(){
+ @Override
+ public boolean accept(File pathname) {
+ if(pathname.isDirectory()){
+ findJarFiles(pathname, jars);
+ } else {
+ BundleInfo info = getBundleInfo(pathname);
+ if(info != null){
+ jars.add(info);
+ }
+ }
+ return false;
+ }
+ });
+ }
+
+ private BundleInfo getBundleInfo(File file){
+ BundleInfo bundleInfo = null;
+ try {
+ if(file.getAbsolutePath().endsWith(".jar")){
+ bundleInfo = new BundleInfo(file.toURI().toURL(), getHostName().toExternalForm(), true);
+ if(bundleInfo.getSymbolicName() != null && !bundleInfo.getSymbolicName().equalsIgnoreCase("unknown") && bundleInfo.getVersion() != null){
+ if(bundleInfo.getManifest() == null){
+ bundleInfo = null;
+ }
+ }
+ }
+ } catch (MalformedURLException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return bundleInfo;
+ }
+
+ public URL getHostName(){
+ return classServer.getHostName();
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/PathResourceFinder.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/PathResourceFinder.java
new file mode 100644
index 000000000..31b8dc227
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/PathResourceFinder.java
@@ -0,0 +1,255 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.classserver;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FilePermission;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.StringTokenizer;
+import java.util.jar.Attributes;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+import java.util.jar.Manifest;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+public class PathResourceFinder extends ResourceFinder {
+
+ private final HashSet<JarFile> jars = new HashSet<>(128);
+ private final HashSet<String> dirs = new HashSet<>(128);
+ private final HashMap<String, JarFile[]> map = new HashMap<>(128);
+ private final boolean trees;
+ private final ClassServerPermissions perm;
+ private static final int NUMBER_OF_FILE_READ_ATTEMPTS = 20;
+
+ public PathResourceFinder(String[] dirsToAdd, boolean trees) {
+ this.trees = trees;
+ perm = new ClassServerPermissions();
+ if (dirsToAdd != null) {
+ addPaths(dirsToAdd);
+ }
+ }
+
+ @Override
+ public byte[] find(String path) throws IOException {
+
+ int i = path.indexOf('/');
+ if (i > 0) {
+ JarFile[] jfs = map.get(path.substring(0, i));
+ if (jfs != null) {
+ String jpath = path.substring(i + 1);
+ for (i = 0; i < jfs.length; i++) {
+ JarEntry je = jfs[i].getJarEntry(jpath);
+ if (je != null) {
+ return getBytes(jfs[i].getInputStream(je), je.getSize());
+ }
+ }
+ }
+ }
+ synchronized (jars) {
+ Iterator<JarFile> it = jars.iterator();
+ while (it.hasNext()) {
+ JarFile jar = it.next();
+ JarEntry je = jar.getJarEntry(path);
+ if (je != null) {
+ return getBytes(jar.getInputStream(je), je.getSize());
+ }
+ }
+ }
+ boolean exists = false;
+ File f = null;
+ synchronized (dirs) {
+ for (int j = 0; j < NUMBER_OF_FILE_READ_ATTEMPTS; j++) { // we'll retry in case there is a
+ // compile going on
+ Iterator<String> it = dirs.iterator();
+ while (it.hasNext()) {
+ String dirString = it.next();
+ f = new File(dirString + File.separatorChar + path.replace('/', File.separatorChar));
+ if (f.exists()) {
+ exists = true;
+ break;
+ }
+ }
+ if (!exists) {
+ try {
+ synchronized (this) {
+ this.wait(1000);
+ }
+ System.err.println(String.format("trying to find :%s %d", path, j));
+ } catch (InterruptedException ex) {
+ }
+ } else {
+ break;
+ }
+ }
+ }
+
+ if (exists) {
+ if (perm.implies(new FilePermission(f.getPath(), "read"))) {
+ try {
+ return getBytes(new FileInputStream(f), f.length());
+ } catch (FileNotFoundException e) {
+ }
+ }
+ }
+ return null;
+ }
+
+ public void addPaths(String[] paths) {
+
+ for (int i = 0; i < paths.length; i++) {
+ String path = paths[i];
+
+ if (path.startsWith("file:\\")) {
+ path = path.substring(6);
+ }
+
+ if (path.endsWith(".jar")) {
+ try {
+ synchronized (jars) {
+ jars.add(new JarFile(new File(path)));
+ }
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ continue;
+ }
+ } else {
+ if (dirs.add(path)) {
+ perm.add(new FilePermission(path + File.separator + '-', "read"));
+ }
+ }
+
+ if (trees) {
+ File fdir = new File(path);
+ String[] files = fdir.list();
+ if (files != null) {
+ try {
+ URL base = fdir.toURI().toURL();
+ for (int j = 0; j < files.length; j++) {
+ String jar = files[j];
+ if (jar.endsWith(".jar") || jar.endsWith(".zip")) {
+ ArrayList<JarFile> jfs = new ArrayList<>(10);
+ try {
+ addJar(jar, jfs, base);
+ map.put(jar.substring(0, jar.length() - 4), jfs.toArray(new JarFile[jfs.size()]));
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ }
+ }
+ }
+ } catch (MalformedURLException ex) {
+ ex.printStackTrace();
+ }
+ }
+ }
+ }
+ }
+
+ /** Add transitive Class-Path JARs to jfs. */
+ private void addJar(String jar, ArrayList<JarFile> jfs, URL base) throws IOException {
+ base = new URL(base, jar);
+ jar = base.getFile().replace('/', File.separatorChar);
+ for (int i = jfs.size(); --i >= 0;) {
+ if (jar.equals(jfs.get(i).getName())) {
+ return;
+ }
+ }
+
+ JarFile jf = new JarFile(jar);
+ jfs.add(jf);
+ try {
+ Manifest man = jf.getManifest();
+ if (man == null) {
+ return;
+ }
+ Attributes attrs = man.getMainAttributes();
+ if (attrs == null) {
+ return;
+ }
+ String val = attrs.getValue(Attributes.Name.CLASS_PATH);
+ if (val == null) {
+ return;
+ }
+ for (StringTokenizer st = new StringTokenizer(val); st.hasMoreTokens();) {
+ addJar(st.nextToken(), jfs, base);
+ }
+ } catch (IOException ex) {
+ jfs.remove(jf);
+ jf.close();
+ throw ex;
+ }
+ }
+
+ /**
+ * Finds the jarFile if it is being served.
+ *
+ * @param name The name of the jar file
+ * @return The jar represented as a File, or null if the jar was not found.
+ */
+ public File getJarFile(String name) {
+ File jarFileReturn = null;
+ synchronized (jars) {
+ Iterator<JarFile> it = jars.iterator();
+ while (it.hasNext()) {
+ JarFile jarFile = it.next();
+ if (jarFile.getName().endsWith(File.separator + name)) {
+ jarFileReturn = new File(jarFile.getName());
+ break;
+ }
+ }
+ }
+ return jarFileReturn;
+ }
+
+ public void removeJarFile(String name) {
+ synchronized (jars) {
+ Iterator<JarFile> it = jars.iterator();
+ while (it.hasNext()) {
+ JarFile jarFile = it.next();
+ if (jarFile.getName().endsWith(File.separator + name)) {
+ try {
+ OseeLog.log(ClassServer.class, Level.INFO, "removing JAR file " + name);
+ jarFile.close();
+ } catch (IOException ex) {
+ // do nothing
+ }
+ it.remove();
+ return;
+ }
+ }
+ }
+ }
+
+ @Override
+ public void dispose() {
+ synchronized (jars) {
+ OseeLog.log(ClassServer.class, Level.INFO, "disposing path resource finder's cached JAR files");
+ Iterator<JarFile> it = jars.iterator();
+ while (it.hasNext()) {
+ JarFile jarFile = it.next();
+ try {
+ jarFile.close();
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ }
+ }
+ jars.clear();
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/ResourceFinder.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/ResourceFinder.java
new file mode 100644
index 000000000..ae6a68d4e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/ResourceFinder.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.classserver;
+
+import java.io.DataInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+public abstract class ResourceFinder {
+
+ public abstract byte[] find(String path) throws IOException;
+
+ public byte[] getBytes(InputStream in, long length) throws IOException {
+ DataInputStream din = new DataInputStream(in);
+ byte[] bytes = new byte[(int) length];
+ try {
+ din.readFully(bytes);
+ } finally {
+ din.close();
+ }
+ return bytes;
+ }
+
+ public byte[] getBytes(InputStream stream) throws IOException {
+ return getBytes(stream, stream.available());
+ }
+
+ public abstract void dispose();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/classserver.properties b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/classserver.properties
new file mode 100644
index 000000000..d9c2d56f8
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/classserver/classserver.properties
@@ -0,0 +1,15 @@
+
+
+
+classserver.jar:{0}
+classserver.inputerror:exception reading request from {0}:{1}
+classserver.request:{0} requested from {1}:{2}
+classserver.probe:{0} probed from {1}:{2}
+classserver.badrequest:bad request "{0}" from {1}:{2}
+classserver.shutdown:shutdown request from {0}:{1}
+classserver.notfound:{0} not found
+classserver.usage:[-port <port>] [-dir <dir>] [-stoppable] [-verbose] [-trees]\
+\n or\
+\n[-port <port>] -stop
+classserver.forbidden:stop request denied
+classserver.status:HTTP status code: {0} {1}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/collections/ObjectPool.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/collections/ObjectPool.java
new file mode 100644
index 000000000..e16ba4174
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/collections/ObjectPool.java
@@ -0,0 +1,32 @@
+package org.eclipse.osee.ote.collections;
+
+import java.util.concurrent.ArrayBlockingQueue;
+
+public class ObjectPool<T> {
+
+ private final ArrayBlockingQueue<T> objs;
+ private final ObjectPoolConfiguration<T> config;
+
+ public ObjectPool(ObjectPoolConfiguration<T> config) {
+ this.config = config;
+ objs = new ArrayBlockingQueue<>(config.getMaxSize());
+ if(config.preallocate()){
+ for(int i = 0; i < config.getMaxSize(); i++){
+ objs.offer(config.make());
+ }
+ }
+ }
+
+ public T getObject(){
+ T obj = objs.poll();
+ if(obj == null){
+ obj = config.make();
+ }
+ return obj;
+ }
+
+ public void returnObj(T obj){
+ objs.offer(obj);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/collections/ObjectPoolConfiguration.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/collections/ObjectPoolConfiguration.java
new file mode 100644
index 000000000..7a4b76b63
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/collections/ObjectPoolConfiguration.java
@@ -0,0 +1,23 @@
+package org.eclipse.osee.ote.collections;
+
+public abstract class ObjectPoolConfiguration<T> {
+
+ private int maxSize;
+ private boolean preallocate;
+
+ public ObjectPoolConfiguration(int maxSize, boolean preallocate){
+ this.maxSize = maxSize;
+ this.preallocate = preallocate;
+ }
+
+ public int getMaxSize(){
+ return maxSize;
+ }
+
+ public boolean preallocate(){
+ return preallocate;
+ }
+
+ abstract public T make();
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/AbstractRemoteSession.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/AbstractRemoteSession.java
new file mode 100644
index 000000000..40be86eda
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/AbstractRemoteSession.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core;
+
+import java.rmi.RemoteException;
+
+public abstract class AbstractRemoteSession implements IRemoteUserSession {
+
+ private final OSEEPerson1_4 user;
+
+ protected AbstractRemoteSession(OSEEPerson1_4 user) {
+ this.user = user;
+ }
+
+ @Override
+ public OSEEPerson1_4 getUser() {
+ return user;
+ }
+
+ @Override
+ public abstract String getAddress() throws RemoteException;
+
+ @Override
+ public abstract byte[] getFile(String workspacePath) throws RemoteException;
+
+ @Override
+ public abstract long getFileDate(String workspacePath) throws RemoteException;
+
+ @Override
+ public abstract boolean isAlive() throws RemoteException;
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/BaseUdpReceiveRunnable.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/BaseUdpReceiveRunnable.java
new file mode 100644
index 000000000..ad800487e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/BaseUdpReceiveRunnable.java
@@ -0,0 +1,88 @@
+package org.eclipse.osee.ote.core;
+
+import java.io.IOException;
+import java.io.InterruptedIOException;
+import java.net.BindException;
+import java.net.InetSocketAddress;
+import java.nio.ByteBuffer;
+import java.nio.channels.ClosedByInterruptException;
+import java.nio.channels.DatagramChannel;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.OTEException;
+
+public abstract class BaseUdpReceiveRunnable implements Runnable {
+
+ private static final int DATA_SIZE = 65536;
+ private static final int UDP_TIMEOUT = 240000; // 4 MINUTES
+ private static final int ONE_MEG = 1024 * 1024;
+
+ private volatile boolean run = true;
+ private Class<BaseUdpReceiveRunnable> logger = BaseUdpReceiveRunnable.class;
+ private InetSocketAddress address;
+
+ public BaseUdpReceiveRunnable(InetSocketAddress address){
+ this.address = address;
+ }
+
+ public void stop(){
+ run = false;
+ }
+
+ @Override
+ public void run() {
+ ByteBuffer buffer = ByteBuffer.allocateDirect(DATA_SIZE);
+ DatagramChannel channel = null;
+ try{
+ while(run){
+ try {
+ channel = DatagramChannel.open();
+ channel.socket().setReuseAddress(true);
+ channel.socket().bind(address);
+ channel.socket().setSoTimeout(UDP_TIMEOUT);
+ channel.socket().setReceiveBufferSize(ONE_MEG);
+ channel.configureBlocking(true);
+
+ while (run) {
+ buffer.clear();
+ channel.receive(buffer);
+ buffer.flip();
+ processBuffer(buffer);
+ }
+ } catch (BindException ex) {
+ OseeLog.log(logger, Level.FINEST, ex);
+ channel.close();
+ Thread.sleep(1000);
+ }
+ }
+ }catch (InterruptedIOException ex) {
+ Thread.interrupted();
+ if (run) {
+ OseeLog.log(logger, Level.WARNING, "Unexpected interruption", ex);
+ }
+ } catch (ClosedByInterruptException ie) {
+ Thread.interrupted();
+ if (run) {
+ OseeLog.log(logger, Level.WARNING, "Unexpected interruption", ie);
+ }
+ } catch (Throwable t) {
+ throw new OTEException(t);
+ } finally {
+ try {
+ if (channel != null) {
+ channel.close();
+ }
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ }
+ }
+ }
+
+ protected abstract void processBuffer(ByteBuffer buffer);
+
+ public InetSocketAddress getAddress() {
+ return address;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/BundleInfo.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/BundleInfo.java
new file mode 100644
index 000000000..eeed594d9
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/BundleInfo.java
@@ -0,0 +1,171 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.security.NoSuchAlgorithmException;
+import java.util.jar.JarFile;
+import java.util.jar.Manifest;
+
+import org.eclipse.osee.framework.jdk.core.util.ChecksumUtil;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class BundleInfo {
+ private final String symbolicName;
+ private final String version;
+ private final URL systemLocation;
+ private final URL bundleServerLocation;
+ private final File file;
+ private final Manifest manifest;
+ private final boolean systemLibrary;
+ private String md5Digest;
+
+ public BundleInfo(URL systemLocation, String bundleServerBaseLocation, boolean systemLibrary) throws IOException {
+ File tmpFile;
+ try {
+ tmpFile = new File(systemLocation.toURI());
+ } catch (URISyntaxException ex) {
+ tmpFile = new File(systemLocation.getPath());
+ }
+ this.file = tmpFile;
+
+ JarFile jarFile = new JarFile(file);
+ this.manifest = jarFile.getManifest();
+ this.symbolicName = generateBundleName(manifest);
+ this.version = manifest.getMainAttributes().getValue("Bundle-Version");
+
+ this.systemLocation = systemLocation;
+ this.bundleServerLocation = new URL(bundleServerBaseLocation + symbolicName);
+ this.systemLibrary = systemLibrary;
+ this.md5Digest = null;
+ }
+
+ public BundleInfo(URL systemLocation) throws IOException {
+ File tmpFile;
+ try {
+ tmpFile = new File(systemLocation.toURI());
+ } catch (URISyntaxException ex) {
+ tmpFile = new File(systemLocation.getPath());
+ }
+ this.file = tmpFile;
+
+ JarFile jarFile = new JarFile(file);
+ this.manifest = jarFile.getManifest();
+ this.symbolicName = generateBundleName(manifest);
+ this.version = manifest.getMainAttributes().getValue("Bundle-Version");
+
+ this.systemLocation = systemLocation;
+ this.bundleServerLocation = systemLocation;
+ this.systemLibrary = true;
+ this.md5Digest = null;
+ }
+
+ /**
+ * @return the name of the bundle
+ */
+ public static String generateBundleName(Manifest jarManifest) {
+ String nameEntry = jarManifest.getMainAttributes().getValue("Bundle-SymbolicName");
+ if(nameEntry == null){
+ return "unknown";
+ }
+ // Sometimes there's a semicolon then extra info - ignore this
+ int index = nameEntry.indexOf(';');
+ if (index != -1) {
+ nameEntry = nameEntry.substring(0, index);
+ }
+
+ return nameEntry;
+ }
+
+ /**
+ * @return the symbolicName
+ */
+ public String getSymbolicName() {
+ return symbolicName;
+ }
+
+ /**
+ * @return the version
+ */
+ public String getVersion() {
+ return version;
+ }
+
+ /**
+ * @return the location
+ */
+ public URL getSystemLocation() {
+ return systemLocation;
+ }
+
+ /**
+ * @return the bundleServerLocation
+ */
+ public URL getServerBundleLocation() {
+ return bundleServerLocation;
+ }
+
+ /**
+ * @return the file
+ */
+ public File getFile() {
+ return file;
+ }
+
+ /**
+ * @return the manifest
+ */
+ public Manifest getManifest() {
+ return manifest;
+ }
+
+ @Override
+ public String toString() {
+ return getSymbolicName() + ":" + getVersion();
+ }
+
+ /**
+ * @return the systemLibrary
+ */
+ public boolean isSystemLibrary() {
+ return systemLibrary;
+ }
+
+ /**
+ * @return the md5Digest
+ */
+ public String getMd5Digest() {
+ // Do lazy calculation of this since it can be costly
+ // and does not get read for all bundle info's
+ if (md5Digest == null) {
+ try {
+ InputStream in = systemLocation.openStream();
+
+ md5Digest = ChecksumUtil.createChecksumAsString(in, "MD5");
+
+ in.close();
+ } catch (NoSuchAlgorithmException ex) {
+ throw new IllegalStateException("Always expect MD5 to be available", ex);
+ } catch (IOException ex) {
+ throw new IllegalStateException("Always expect local jar file to be available", ex);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ return md5Digest;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ConnectionRequestResult.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ConnectionRequestResult.java
new file mode 100644
index 000000000..ba38789b7
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ConnectionRequestResult.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core;
+
+import java.io.Serializable;
+import java.util.UUID;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironment;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class ConnectionRequestResult implements Serializable {
+ private static final long serialVersionUID = -2269465634573908989L;
+ private final ITestEnvironment environment;
+ private final UUID sessionKey;
+ private final ReturnStatus status;
+
+ public ConnectionRequestResult(ITestEnvironment environment, UUID sessionId, ReturnStatus status) {
+ this.environment = environment;
+ this.sessionKey = sessionId;
+ this.status = status;
+ }
+
+ /**
+ * @return the environment
+ */
+ public ITestEnvironment getEnvironment() {
+ return environment;
+ }
+
+ /**
+ * @return the sessionKey
+ */
+ public UUID getSessionKey() {
+ return sessionKey;
+ }
+
+ /**
+ * @return the status
+ */
+ public ReturnStatus getStatus() {
+ return status;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/CopyOnWriteNoIteratorList.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/CopyOnWriteNoIteratorList.java
new file mode 100644
index 000000000..d5c0a6f99
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/CopyOnWriteNoIteratorList.java
@@ -0,0 +1,128 @@
+package org.eclipse.osee.ote.core;
+
+import java.lang.reflect.Array;
+import java.util.Collection;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * This class is useful for cases where frequent looping and thread safety happen.
+ * It forces you to get a reference to the backing array and expects you to do a
+ * non Iterator based loop so that no Iterator objects are created to minimized GC churn.
+ *
+ * @author Andrew M Finkbeiner
+ *
+ * @param <E>
+ */
+public class CopyOnWriteNoIteratorList<E> {
+
+ private ReentrantLock lock = new ReentrantLock();
+ private AtomicReference<E[]> data = new AtomicReference<>();
+ private Class<E> type;
+
+ public CopyOnWriteNoIteratorList(Class<E> type){
+ this.type = type;
+ data.set(newArray(0));
+ }
+
+ @SuppressWarnings("unchecked")
+ private E[] newArray(int size){
+ return (E[]) Array.newInstance(type, size);
+ }
+
+ public void add(E item){
+ try{
+ lock.lock();
+ E[] ref = data.get();
+ E[] newdata = newArray(ref.length + 1);
+ System.arraycopy(ref, 0, newdata, 0, ref.length);
+ newdata[newdata.length-1] = item;
+ data.set(newdata);
+ } finally{
+ lock.unlock();
+ }
+ }
+
+ public boolean remove(E item){
+ boolean returnvalue = false;
+ try{
+ lock.lock();
+ int index = -1;
+ E[] ref = data.get();
+ for(int i = 0; i < ref.length; i++){
+ if(item.equals(ref[i])){
+ index = i;
+ break;
+ }
+ }
+ if(index > -1){
+ E[] newdata = newArray(ref.length - 1);
+ if(index == 0){
+ System.arraycopy(ref, 1, newdata, 0, newdata.length);
+ } else if (index == (ref.length - 1)){
+ System.arraycopy(ref, 0, newdata, 0, newdata.length);
+ } else {
+ System.arraycopy(ref, 0, newdata, 0, index);
+ System.arraycopy(ref, index+1, newdata, index, ref.length - (index + 1));
+ }
+ data.set(newdata);
+ returnvalue = true;
+ }
+ } finally {
+ lock.unlock();
+ }
+ return returnvalue;
+ }
+
+ public boolean contains(E item){
+ boolean returnValue = false;
+ try{
+ lock.lock();
+ int index = -1;
+ E[] ref = data.get();
+ for(int i = 0; i < ref.length; i++){
+ if(item.equals(ref[i])){
+ index = i;
+ break;
+ }
+ }
+ if(index > -1){
+ returnValue = true;
+ }
+ } finally {
+ lock.unlock();
+ }
+ return returnValue;
+ }
+
+ public E[] get(){
+ return data.get();
+ }
+
+ public int length() {
+ return data.get().length;
+ }
+
+ public void clear() {
+ try{
+ lock.lock();
+ data.set(newArray(0));
+ } finally{
+ lock.unlock();
+ }
+ }
+
+ public Collection<E> fillCollection(Collection<E> arrayList) {
+ try{
+ lock.lock();
+ E[] ref = data.get();
+ for(int i = 0; i < ref.length; i++){
+ arrayList.add(ref[i]);
+ }
+ } finally {
+ lock.unlock();
+ }
+ return arrayList;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ExecutionUnitException.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ExecutionUnitException.java
new file mode 100644
index 000000000..ae472754b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ExecutionUnitException.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core;
+
+import java.util.logging.Level;
+
+public class ExecutionUnitException extends TestException {
+
+ private static final long serialVersionUID = -9119275292591321042L;
+
+ public ExecutionUnitException(String message, Level level, Throwable cause) {
+ super(message, level, cause);
+ }
+
+ public ExecutionUnitException(String message, Level level) {
+ super(message, level);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/GCHelper.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/GCHelper.java
new file mode 100644
index 000000000..14205dd57
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/GCHelper.java
@@ -0,0 +1,118 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core;
+
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeSet;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class GCHelper {
+
+ private static boolean enableGcHelper = Boolean.parseBoolean(System.getProperty("ote.gc.helper", "false"));
+
+ private final ConcurrentHashMap<String, WeakReference<Object>> map;
+ private static GCHelper singleton;
+
+ public GCHelper() {
+ super();
+ map = new ConcurrentHashMap<>(1024);
+ }
+
+ public static GCHelper getGCHelper() {
+ if (singleton == null) {
+ singleton = new GCHelper();
+ }
+ return singleton;
+ }
+
+ public void addRefWatch(Object obj) {
+ if(enableGcHelper){
+ String key = obj.toString() + " [ " + obj.hashCode() + " ] ";
+ map.put(key, new WeakReference<Object>(obj));
+ }
+ }
+
+ public void printLiveReferences() {
+
+ StringBuilder builder = new StringBuilder(8000);
+ if(!enableGcHelper){
+ builder.append("GCHelper disabled. Enable with '-Dote.gc.helper=true'\n");
+ }
+ writeGCResults(builder);
+ OseeLog.log(GCHelper.class, Level.INFO, builder.toString());
+ }
+
+ public void writeGCResults(StringBuilder builder) {
+ TreeSet<String> live = new TreeSet<>();
+ System.gc();
+ for (Map.Entry<String, WeakReference<Object>> entry : map.entrySet()) {
+ if (entry.getValue().get() != null) {
+ entry.getValue().get();
+ live.add(entry.getKey());
+ }
+ }
+
+ builder.append("Live References:\n");
+ for (String key : live) {
+ builder.append(" ");
+ builder.append(key);
+ builder.append("\n");
+ }
+ }
+
+ public List getInstancesOfType(Class type) {
+ List<Object> listOfObjects = new ArrayList<>();
+ System.gc();
+ for (Map.Entry<String, WeakReference<Object>> entry : map.entrySet()) {
+ if (entry.getValue().get() != null) {
+ if (type.isInstance(entry.getValue().get())) {
+ listOfObjects.add(entry.getValue().get());
+ }
+ }
+ }
+ return listOfObjects;
+ }
+
+ public void collectGarbage() {
+ long memBefore = Runtime.getRuntime().freeMemory();
+ long timeBefore = System.currentTimeMillis();
+ Runtime.getRuntime().runFinalization();
+ Runtime.getRuntime().gc();
+ System.out.println("Garbage Collection --- Memory Released: " + (Runtime.getRuntime().freeMemory() - memBefore) + " -- Time Elapsed: " + (System.currentTimeMillis() - timeBefore));
+ }
+
+ public void collectGarbageAndPrintStats() {
+ new Thread(new Runnable() {
+
+ @Override
+ public void run() {
+ try {
+ Thread.sleep(5000);
+ collectGarbage();
+ printLiveReferences();
+ } catch (InterruptedException ex) {
+ }
+
+ }
+
+ }).start();
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/IRemoteUserSession.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/IRemoteUserSession.java
new file mode 100644
index 000000000..cd179ec12
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/IRemoteUserSession.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+
+import org.eclipse.osee.ote.core.framework.prompt.IPassFailPromptResponse;
+import org.eclipse.osee.ote.core.framework.prompt.IResumeResponse;
+import org.eclipse.osee.ote.core.framework.prompt.IUserInputPromptResponse;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IRemoteUserSession extends Remote, IUserSession {
+ @Override
+ public String getAddress() throws RemoteException;
+
+ @Override
+ public OSEEPerson1_4 getUser() throws RemoteException;
+
+ @Override
+ public byte[] getFile(String workspacePath) throws RemoteException;
+
+ @Override
+ public long getFileDate(String workspacePath) throws RemoteException;
+
+ @Override
+ public void initiatePassFailPrompt(IPassFailPromptResponse prompt) throws RemoteException;
+
+ @Override
+ public void initiateUserInputPrompt(IUserInputPromptResponse prompt) throws RemoteException;
+
+ @Override
+ public void initiateResumePrompt(IResumeResponse prompt) throws RemoteException;
+
+ @Override
+ public void initiateInformationalPrompt(String message) throws RemoteException;
+
+ @Override
+ public boolean isAlive() throws RemoteException;
+
+// @Override
+// public void sendMessageToClient(Message message) throws RemoteException;
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ITestClient.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ITestClient.java
new file mode 100644
index 000000000..e492fc752
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ITestClient.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironment;
+import org.eclipse.osee.ote.core.environment.status.SequentialCommandEnded;
+
+public interface ITestClient {
+
+ ITestEnvironment getEnvironment();
+
+ void notifyCmdEmded(SequentialCommandEnded data);
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/IUserSession.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/IUserSession.java
new file mode 100644
index 000000000..7919f1ab3
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/IUserSession.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core;
+
+import java.util.UUID;
+
+import org.eclipse.osee.ote.core.framework.prompt.IPassFailPromptResponse;
+import org.eclipse.osee.ote.core.framework.prompt.IResumeResponse;
+import org.eclipse.osee.ote.core.framework.prompt.IUserInputPromptResponse;
+import org.eclipse.osee.ote.core.framework.prompt.IYesNoPromptResponse;
+
+public interface IUserSession {
+
+ public OSEEPerson1_4 getUser() throws Exception;
+
+ public String getAddress() throws Exception;
+
+ /**
+ * returns the contents of the requested file on the client session
+ *
+ * @return the byte contents of the requested file or null if it does not exist
+ */
+ public byte[] getFile(String workspacePath) throws Exception;
+
+ public long getFileDate(String workspacePath) throws Exception;
+
+ public void initiateInformationalPrompt(String message) throws Exception;
+
+ public void initiatePassFailPrompt(IPassFailPromptResponse prompt) throws Exception;
+
+ public void initiateYesNoPrompt(IYesNoPromptResponse prompt) throws Exception;
+
+ public void initiateUserInputPrompt(IUserInputPromptResponse prompt) throws Exception;
+
+ public void initiateResumePrompt(IResumeResponse prompt) throws Exception;
+
+// public void sendMessageToClient(Message message) throws Exception;
+
+ public void cancelPrompts() throws Exception;
+
+ public boolean isAlive() throws Exception;
+
+ public UUID getUserId() throws Exception;
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/MethodFormatter.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/MethodFormatter.java
new file mode 100644
index 000000000..58d7c3143
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/MethodFormatter.java
@@ -0,0 +1,158 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.eclipse.osee.framework.jdk.core.persistence.XmlizableStream;
+import org.eclipse.osee.framework.jdk.core.util.EnumBase;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.jdk.core.util.xml.XMLStreamWriterUtil;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Charles Shaw
+ * @author Robert A. Fisher
+ */
+public class MethodFormatter implements Xmlizable, XmlizableStream {
+ private final Collection<Argument> arguments = new ArrayList<>();
+
+ public final class Argument {
+ public final String Class;
+ public final String Value;
+
+ public Argument(final String Class, final String Value) {
+ this.Class = Class;
+ this.Value = Value;
+ }
+
+ @Override
+ public String toString() {
+ return "<" + Class + ">" + Value;
+ }
+ }
+
+ public MethodFormatter add(float value) {
+ arguments.add(new Argument(float.class.getName(), Double.toString(value)));
+ return this;
+ }
+
+ public MethodFormatter add(double value) {
+ arguments.add(new Argument(double.class.getName(), Double.toString(value)));
+ return this;
+ }
+
+ public MethodFormatter add(byte value) {
+ arguments.add(new Argument(byte.class.getName(), Double.toString(value)));
+ return this;
+ }
+
+ public MethodFormatter add(short value) {
+ arguments.add(new Argument(short.class.getName(), Double.toString(value)));
+ return this;
+ }
+
+ public MethodFormatter add(int value) {
+ arguments.add(new Argument(int.class.getName(), Integer.toString(value)));
+ return this;
+ }
+
+ public MethodFormatter add(long value) {
+ arguments.add(new Argument(long.class.getName(), Double.toString(value)));
+ return this;
+ }
+
+ public MethodFormatter add(char value) {
+ arguments.add(new Argument(char.class.getName(), Integer.toString(value)));
+ return this;
+ }
+
+ public MethodFormatter add(boolean value) {
+ arguments.add(new Argument(boolean.class.getName(), Boolean.toString(value)));
+ return this;
+ }
+
+ public MethodFormatter add(EnumBase value) {
+ arguments.add(new Argument(EnumBase.class.getName(), value.getName()));
+ return this;
+ }
+
+ public MethodFormatter add(EnumBase[] value) {
+ final String sep = ", ";
+ StringBuilder sb = new StringBuilder();
+ sb.append("[");
+ for (int i = 0; i < value.length; i++) {
+ sb.append(value[i].getName()).append(sep);
+ }
+ if (sb.length() > sep.length()) {
+ sb.setLength(sb.length() - sep.length());
+ }
+ sb.append("]");
+ arguments.add(new Argument(EnumBase[].class.getName(), sb.toString()));
+ return this;
+ }
+
+ public MethodFormatter add(Object value) {
+ arguments.add(new Argument(value.getClass().getName(), value.toString()));
+ return this;
+ }
+
+ @Override
+ public String toString() {
+ final String sep = ", ";
+ StringBuilder sb = new StringBuilder();
+ for (Argument argument : arguments) {
+ sb.append(argument.toString()).append(sep);
+ }
+ if (sb.length() > sep.length()) {
+ sb.setLength(sb.length() - sep.length());
+ }
+ return sb.toString();
+ }
+
+ @Override
+ public Element toXml(Document doc) {
+ Element toReturn = doc.createElement("MethodArguments");
+ for (Argument argument : arguments) {
+ Element element = doc.createElement("Argument");
+ element.appendChild(Jaxp.createElement(doc, "Type", argument.Class));
+ String toLog = argument.Value != null ? XmlSupport.format(argument.Value) : "null";
+ element.appendChild(Jaxp.createElement(doc, "Value", toLog));
+ toReturn.appendChild(element);
+ }
+ return toReturn;
+ }
+
+ @Override
+ public void toXml(XMLStreamWriter writer) throws XMLStreamException {
+ writer.writeStartElement("MethodArguments");
+ for (Argument argument : arguments) {
+ writer.writeStartElement("Argument");
+ XMLStreamWriterUtil.writeElement(writer, "Type", argument.Class);
+ String toLog = argument.Value != null ? XmlSupport.format(argument.Value) : "null";
+ XMLStreamWriterUtil.writeElement(writer, "Value", toLog);
+ writer.writeEndElement();
+ }
+ writer.writeEndElement();
+ }
+
+ @JsonProperty
+ public Collection<Argument> getMethodArguments() {
+ return arguments;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OSEEPerson1_4.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OSEEPerson1_4.java
new file mode 100644
index 000000000..9c0d1f55b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OSEEPerson1_4.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core;
+
+import java.io.Serializable;
+
+public class OSEEPerson1_4 implements Serializable {
+
+ private static final long serialVersionUID = 6345874159597384661L;
+
+ private final String name;
+
+ private final String email;
+
+ private final String id;
+
+ public OSEEPerson1_4(String name, String email, String id) {
+ this.name = name;
+ this.email = email;
+ this.id = id;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public boolean equals(Object arg0) {
+ if (arg0 instanceof OSEEPerson1_4) {
+ OSEEPerson1_4 person = (OSEEPerson1_4) arg0;
+ return person.name.equals(this.name) && person.email.equals(this.email) && person.id.equals(this.id);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ int hashCode = 0;
+ if (name != null) {
+ hashCode += name.hashCode();
+ }
+ if (email != null) {
+ hashCode += email.hashCode();
+ }
+ if (id != null) {
+ hashCode += id.hashCode();
+ }
+ return hashCode;
+ }
+
+ @Override
+ public String toString() {
+ return name + ":" + email + ":" + id + " hash=" + hashCode();
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OTESessionManager.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OTESessionManager.java
new file mode 100644
index 000000000..51dbdae9b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OTESessionManager.java
@@ -0,0 +1,13 @@
+package org.eclipse.osee.ote.core;
+
+import java.util.Set;
+import java.util.UUID;
+
+public interface OTESessionManager {
+ void add(UUID sessionId, IUserSession session);
+ void remove(UUID sessionId);
+ IUserSession get(UUID sessionId);
+ Set<UUID> get();
+ IUserSession getActiveUser();//??
+ void setActiveUser(UUID sessionId);//??
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OseeTestThread.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OseeTestThread.java
new file mode 100644
index 000000000..e444d94cb
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OseeTestThread.java
@@ -0,0 +1,167 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core;
+
+import java.lang.ref.WeakReference;
+import java.util.Calendar;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.internal.Activator;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public abstract class OseeTestThread {
+
+ private static final Logger logger = Logger.getLogger("osee.test.core.OseeTestThread");
+ private final Thread thread;
+ private final WeakReference<TestEnvironment> env;
+ private static final HashSet<OseeTestThread> threadList = new HashSet<>(32);
+ private volatile Throwable causeOfDeath = null;
+ private volatile Date timeOfDeath = null;
+
+ /**
+ * Creates the thread with the given name and as a non daemon thread
+ */
+ public OseeTestThread(String name, TestEnvironment env) {
+ this(name, false, null, env);
+ }
+
+ public OseeTestThread(String name, ThreadGroup group, TestEnvironment env) {
+ this(name, false, group, env);
+ }
+
+ public Thread.State getState() {
+ return thread.getState();
+ }
+
+ /**
+ * Creates the thread with the given name and daemon flag
+ *
+ * @param name the name of this thread
+ * @param isDaemon marks the thread as a daemon thread
+ */
+ public OseeTestThread(String name, boolean isDaemon, ThreadGroup group, TestEnvironment env) {
+ GCHelper.getGCHelper().addRefWatch(this);
+ this.env = new WeakReference<>(env);
+ thread = new Thread(group, name) {
+
+ @Override
+ public void run() {
+ try {
+ OseeTestThread.this.run();
+ synchronized (threadList) {
+ threadList.remove(OseeTestThread.this);
+ }
+ } catch (TestException e) {
+ OseeLog.log(Activator.class, e.getLevel(),
+ "TestException in " + e.getThreadName() + ": " + e.getMessage(), e);
+ cleanupAfterException(e);
+ } catch (Throwable t) {
+ OseeLog.log(Activator.class, Level.SEVERE, "Unhandled exception in " + thread.getName(), t);
+ cleanupAfterException(t);
+ }
+ }
+ };
+ thread.setDaemon(isDaemon);
+ threadList.add(this);
+ }
+
+ /**
+ * Starts the thread
+ */
+ public void start() {
+ thread.start();
+ }
+
+ public void setName(String name) {
+ thread.setName(name);
+ }
+
+ public String getName() {
+ return thread.getName();
+ }
+
+ public boolean isAlive() {
+ return thread.isAlive();
+ }
+
+ public void interrupt() {
+ thread.interrupt();
+ }
+
+ private static final class Trace extends RuntimeException {
+ private static final long serialVersionUID = 8520935964300439490L;
+
+ Trace() {
+ super("call trace");
+ }
+ }
+
+ /**
+ * This method will be called upon thread execution
+ */
+ protected abstract void run() throws Exception;
+
+ public void join() throws InterruptedException {
+ thread.join();
+ }
+
+ public void join(int milliseconds) throws InterruptedException {
+ thread.join(milliseconds);
+ }
+
+ public TestEnvironment getEnvironment() {
+ return OseeTestThread.this.env.get();
+ }
+
+ public static Collection<OseeTestThread> getThreads() {
+ return threadList;
+ }
+
+ private synchronized void cleanupAfterException(Throwable t) {
+ causeOfDeath = t;
+ timeOfDeath = Calendar.getInstance().getTime();
+ this.env.get().handleException(t, Level.OFF);
+ }
+
+ public Throwable getCauseOfDeath() {
+ return causeOfDeath;
+ }
+
+ public Date getTimeOfDeath() {
+ return timeOfDeath;
+ }
+
+ public static void clearThreadReferences() {
+ synchronized (threadList) {
+ threadList.clear();
+ }
+ }
+
+ public boolean isInterrupted() {
+ return thread.isInterrupted();
+ }
+
+ public void setDaemon(boolean isDaemon) {
+ thread.setDaemon(isDaemon);
+ }
+
+ public Thread getThread() {
+ return thread;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OseeURLClassLoader.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OseeURLClassLoader.java
new file mode 100644
index 000000000..785f3e272
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OseeURLClassLoader.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core;
+
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.net.URLStreamHandlerFactory;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.ExportClassLoader;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class OseeURLClassLoader extends URLClassLoader {
+
+ private final String name;
+ private final ExportClassLoader exportClassLoader;
+
+ public OseeURLClassLoader(String name, URL[] urls, ClassLoader parent) {
+ super(urls, parent);
+ this.name = name;
+ GCHelper.getGCHelper().addRefWatch(this);
+ exportClassLoader = ExportClassLoader.getInstance();
+
+ }
+
+ public OseeURLClassLoader(String name, URL[] urls) {
+ super(urls);
+ GCHelper.getGCHelper().addRefWatch(this);
+ this.name = name;
+ exportClassLoader = ExportClassLoader.getInstance();
+ }
+
+ public OseeURLClassLoader(String name, URL[] urls, ClassLoader parent, URLStreamHandlerFactory factory) {
+ super(urls, parent, factory);
+ GCHelper.getGCHelper().addRefWatch(this);
+ this.name = name;
+ exportClassLoader = ExportClassLoader.getInstance();
+ }
+
+ @Override
+ public Class<?> loadClass(String clazz) throws ClassNotFoundException{
+ try {
+ return exportClassLoader.loadClass(clazz);
+ } catch (Exception ex2) {
+ int timesTriedToLoad = 0;
+ while(timesTriedToLoad < 10){
+ try {
+ return super.loadClass(clazz);
+ } catch (ClassNotFoundException ex) {
+ System.out.println("Retrying to load from OseeURLClassLoader for class = "+ clazz);
+ timesTriedToLoad++; //Try to load again
+ try {
+ Thread.sleep(1);
+ } catch (InterruptedException ex1) {
+ OseeLog.log(OseeURLClassLoader.class, Level.SEVERE, ex1.toString(), ex1);
+ }
+ }
+ }
+ throw new ClassNotFoundException("Class = " + clazz);
+ }
+ }
+
+ @Override
+ public String toString() {
+ return this.getClass().getName() + " [ " + name + " ] ";
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OteBundleLocator.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OteBundleLocator.java
new file mode 100644
index 000000000..2ab24ef5c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OteBundleLocator.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core;
+
+import java.io.IOException;
+import java.util.Collection;
+import org.eclipse.core.runtime.CoreException;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface OteBundleLocator {
+
+ Collection<BundleInfo> getRuntimeLibs() throws IOException, CoreException;
+
+ Collection<BundleInfo> consumeModifiedLibs() throws IOException, CoreException;
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OteLevel.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OteLevel.java
new file mode 100644
index 000000000..d17376920
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OteLevel.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core;
+
+import java.util.logging.Level;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class OteLevel extends Level {
+
+ private static final long serialVersionUID = -1545385440588581634L;
+
+ public static final Level TEST_EVENT = new OteLevel("TEST_EVENT", SEVERE.intValue() + 50);
+ public static final Level TEST_SEVERE = new OteLevel("TEST_SEVERE", SEVERE.intValue() + 100);
+ public static final Level ENV_SEVERE = new OteLevel("ENV_SEVERE", SEVERE.intValue() + 200);
+
+ protected OteLevel(String name, int value) {
+ super(name, value);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OteProperties.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OteProperties.java
new file mode 100644
index 000000000..5ba9981b5
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/OteProperties.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core;
+
+import org.eclipse.osee.framework.jdk.core.util.OseeProperties;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OteProperties extends OseeProperties {
+ private static final OteProperties instance = new OteProperties();
+ private static final String OSEE_BENCHMARK = "osee.ote.benchmark";
+ private static final String OSEE_CMD_CONSOLE = "osee.ote.cmd.console";
+ private static final String OSEE_OTE_SERVER_TITLE = "osee.ote.server.title";
+ private static final String OSEE_OTE_BATCH = "osee.ote.batch";
+ private static final String OSEE_OTE_LOG_FILE_PATH = "osee.ote.logfilepath";
+ private static final String OSEE_PAUSE_ON_FAIL = "ote.pause.on.fail";
+ private static final String OSEE_PRINT_FAIL_TO_CONSOLE = "ote.print.fail.to.console";
+
+ private OteProperties() {
+ super();
+ }
+
+ public static String getOseeOteServerTitle() {
+ return System.getProperty(OSEE_OTE_SERVER_TITLE, "");
+ }
+
+ public static boolean isOseeOteInBatchModeEnabled() {
+ return System.getProperty(OSEE_OTE_BATCH) != null;
+ }
+
+ public static String getOseeOteLogFilePath() {
+ return System.getProperty(OSEE_OTE_LOG_FILE_PATH);
+ }
+
+ public static boolean isBenchmarkingEnabled() {
+ return System.getProperty(OSEE_BENCHMARK) != null ? true : false;
+ }
+
+ public static boolean isOteCmdConsoleEnabled() {
+ return System.getProperty(OSEE_CMD_CONSOLE) != null ? true : false;
+ }
+
+ public static boolean isPauseOnFailEnabled(){
+ return System.getProperty(OSEE_PAUSE_ON_FAIL) != null ? true : false;
+ }
+
+ public static boolean isPrintFailToConsoleEnabled(){
+ return System.getProperty(OSEE_PRINT_FAIL_TO_CONSOLE) != null ? true : false;
+ }
+ /**
+ * A string representation of all the property setting specified by this class
+ *
+ * @return settings for all properties specified by this class
+ */
+ public static String getAllSettings() {
+ return instance.toString();
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ReturnFormatter.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ReturnFormatter.java
new file mode 100644
index 000000000..3022ba1b8
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ReturnFormatter.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.eclipse.osee.framework.jdk.core.persistence.XmlizableStream;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.jdk.core.util.xml.XMLStreamWriterUtil;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Charles Shaw
+ * @author Robert A. Fisher
+ */
+public class ReturnFormatter implements Xmlizable, XmlizableStream {
+
+ private String returnValue;
+
+ public void set(float value) {
+ returnValue = Double.toString(value);
+ }
+
+ public void add(double value) {
+ returnValue = Double.toString(value);
+ }
+
+ public void add(byte value) {
+ returnValue = Double.toString(value);
+ }
+
+ public void add(short value) {
+ returnValue = Double.toString(value);
+ }
+
+ public void add(int value) {
+ returnValue = Integer.toString(value);
+ }
+
+ public void add(long value) {
+ returnValue = Double.toString(value);
+ }
+
+ public void add(char value) {
+ returnValue = Integer.toString(value);
+ }
+
+ public void add(boolean value) {
+ returnValue = Boolean.toString(value);
+ }
+
+ public void add(Object value) {
+ returnValue = value == null ? "null" : value.toString();
+ }
+
+ @Override
+ public String toString() {
+ return returnValue;
+ }
+
+ @Override
+ public Element toXml(Document doc) {
+ return Jaxp.createElement(doc, "ReturnValue", returnValue);
+ }
+
+ @Override
+ public void toXml(XMLStreamWriter writer) throws XMLStreamException {
+ if (returnValue != null) {
+ XMLStreamWriterUtil.writeElement(writer, "ReturnValue", XmlSupport.format(returnValue));
+ }
+ }
+
+ public String getValue() {
+ return returnValue;
+ }
+
+ @JsonProperty
+ public String getReturnValue() {
+ return returnValue;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ReturnStatus.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ReturnStatus.java
new file mode 100644
index 000000000..164db8510
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ReturnStatus.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core;
+
+import java.io.Serializable;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class ReturnStatus implements Serializable {
+
+ private static final long serialVersionUID = -7774073812320127561L;
+
+ private final boolean status;
+ private final String message;
+
+ public ReturnStatus(String message, boolean status) {
+ this.status = status;
+ this.message = message;
+ }
+
+ public boolean getStatus() {
+ return status;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ServerApplication.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ServerApplication.java
new file mode 100644
index 000000000..3b1f5db57
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ServerApplication.java
@@ -0,0 +1,23 @@
+package org.eclipse.osee.ote.core;
+
+import org.eclipse.equinox.app.IApplication;
+import org.eclipse.equinox.app.IApplicationContext;
+
+public class ServerApplication implements IApplication {
+
+ @Override
+ public Object start(IApplicationContext context) throws Exception {
+ while(true){
+ synchronized (this) {
+ this.wait();
+ }
+ }
+ }
+
+ @Override
+ public void stop() {
+ // TODO Auto-generated method stub
+
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ServiceUtility.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ServiceUtility.java
new file mode 100644
index 000000000..5251df885
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/ServiceUtility.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core;
+
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+/**
+ * @author Michael P. Masterson
+ */
+public class ServiceUtility {
+ public static Class<ServiceUtility> getClazz(){
+ return ServiceUtility.class;
+ }
+
+ public static <T> T getService(Class<T> clazz){
+ return getService(clazz, true);
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ public static <T> T[] getServices(Class<T> clazz) throws InvalidSyntaxException{
+ ServiceReference[] serviceReferences = getContext().getServiceReferences(clazz.getName(), null);
+ T[] data = (T[])new Object[serviceReferences.length];
+ for(int i = 0; i < serviceReferences.length; i ++){
+ data[i] = (T)getContext().getService(serviceReferences[i]);
+ }
+ return data;
+ }
+
+ public static BundleContext getContext(){
+ Bundle bundle = FrameworkUtil.getBundle(getClazz());
+ if(bundle == null){
+ return null;
+ }
+ return bundle.getBundleContext();
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ public static Object getService(String clazz) {
+ BundleContext context = getContext();
+ if(context == null){
+ OseeLog.log(ServiceUtility.class, Level.SEVERE, "Unable to get service " + clazz);
+ return null;
+ }
+ ServiceReference serviceReference = context.getServiceReference(clazz);
+ if(serviceReference == null){
+ OseeLog.log(ServiceUtility.class, Level.SEVERE, "Unable to get service " + clazz);
+ return null;
+ }
+ Object obj = getContext().getService(serviceReference);
+ if(obj == null){
+ OseeLog.log(ServiceUtility.class, Level.SEVERE, "Unable to get service " + clazz);
+ }
+ return obj;
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ public static <T> T getService(Class<T> clazz, boolean logit) {
+ BundleContext context = getContext();
+ if(context == null){
+ if(logit){
+ OseeLog.log(ServiceUtility.class, Level.SEVERE, "Unable to get service " + clazz.getName());
+ }
+ return null;
+ }
+ ServiceReference serviceReference = context.getServiceReference(clazz.getName());
+ if(serviceReference == null){
+ if(logit){
+ OseeLog.log(ServiceUtility.class, Level.SEVERE, "Unable to get service " + clazz.getName());
+ }
+ return null;
+ }
+ T obj = (T)getContext().getService(serviceReference);
+ if(obj == null && logit){
+ OseeLog.log(ServiceUtility.class, Level.SEVERE, "Unable to get service " + clazz.getName());
+ }
+ return obj;
+ }
+
+ public static <T> T getService(Class<T> clazz, int waitTimeMs) {
+ int count = 1;
+ if(waitTimeMs > 50){
+ count = waitTimeMs/50;
+ }
+
+ T obj = getService(clazz, false);
+ if(obj == null){
+ for(int i = 0; i < count && obj == null; i++){
+ try{
+ Thread.sleep(50);
+ } catch (InterruptedException ex){
+ }
+ obj = getService(clazz, false);
+ }
+ }
+ return obj;
+ }
+}
+
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/StandardShell.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/StandardShell.java
new file mode 100644
index 000000000..62d51aa92
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/StandardShell.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.InterruptedIOException;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.environment.console.ConsoleCommand;
+import org.eclipse.osee.ote.core.environment.console.ConsoleShell;
+import org.eclipse.osee.ote.core.environment.console.ICommandManager;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class StandardShell extends ConsoleShell {
+
+ private final Thread thread;
+ private volatile boolean run = true;
+
+ public StandardShell(ICommandManager manager) {
+ super(manager);
+ thread = new Thread(new Runnable() {
+ @Override
+ public void run() {
+ InputStreamReader stdin = new InputStreamReader(System.in);
+ BufferedReader consoleIn = new BufferedReader(stdin);
+ while (run) {
+ try {
+ final String line = consoleIn.readLine();
+ if (line == null) {
+ OseeLog.log(StandardShell.class, Level.INFO, "INput stream closed, standard shell closing...");
+ run = false;
+ break;
+ }
+ if (line.equals("")) {
+ continue;
+ }
+ parseAndExecuteCmd(line);
+
+ } catch (InterruptedIOException ioe) {
+ if (run) {
+ println("Command console interrupted abnormally");
+ }
+ } catch (Throwable t) {
+ printStackTrace(t);
+ }
+ }
+ }
+ }, "LBA Test Server Console");
+ {
+
+ }
+ ;
+ }
+
+ @Override
+ public void println(String string) {
+ System.out.println(string);
+ }
+
+ @Override
+ public void print(String string) {
+ System.out.print(string);
+ }
+
+ @Override
+ public void println() {
+ System.out.println();
+ }
+
+ public void onCommandComplete(ConsoleCommand cmd) {
+ System.out.flush();
+ }
+
+ public void start() {
+ thread.start();
+ OseeLog.log(StandardShell.class, Level.INFO, "The Standard Command Console has been started");
+ }
+
+ public void shutdown() {
+ run = false;
+ thread.interrupt();
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestCase.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestCase.java
new file mode 100644
index 000000000..fef03f986
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestCase.java
@@ -0,0 +1,461 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core;
+
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.eclipse.osee.framework.jdk.core.persistence.XmlizableStream;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.jdk.core.util.xml.XMLStreamWriterUtil;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.enums.PromptResponseType;
+import org.eclipse.osee.ote.core.environment.EnvironmentTask;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.ICancelTimer;
+import org.eclipse.osee.ote.core.environment.interfaces.IExecutionUnitManagement;
+import org.eclipse.osee.ote.core.environment.interfaces.IScriptControl;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestLogger;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestStation;
+import org.eclipse.osee.ote.core.environment.interfaces.ITimeout;
+import org.eclipse.osee.ote.core.environment.interfaces.ITimerControl;
+import org.eclipse.osee.ote.core.log.record.RequirementRecord;
+import org.eclipse.osee.ote.core.log.record.TestCaseRecord;
+import org.eclipse.osee.ote.core.log.record.TestDescriptionRecord;
+import org.eclipse.osee.ote.core.log.record.TestRecord;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * TestCase is the abstract base class for all test cases. This class provides the interfaces necessary for a TestCase
+ * to be part of a {@link org.eclipse.osee.ote.core.TestScript TestScript}.
+ * <p>
+ * The TestCase class contains the following information:
+ * <ul>
+ * <li><b>Standalone</b> - This is used to determine if a TestCase can be used in a selective run list.
+ * <ul>
+ * <li><b>true</b> - The TestCase runs as expected regardless of order.
+ * <li><b>false</b> - The TestCase must be run in a given order with other test cases to work as expected.
+ * </ul>
+ * <li><b>Test Case Number</b> - A serial number automatically assigned at the time of construction.
+ * <li><b>Tracability</b> - The requirements that are tested by this TestCase.
+ * </ul>
+ * <p>
+ * When building a new TestCase object it is important to remember that the object contains information describing the
+ * test case in addition to the run time code. It is also important to understand that the when writing classes which
+ * within a TestScript that the object must be instantiated (typically done in the constructor) with a reference to the
+ * TestScript it is within or else it will not be executed.
+ * <p>
+ * The following sample should be followed closely when building TestCase objects. <br>
+ * <br>
+ * <code>
+ * public class OipCase extends TestCase {
+ * <ul style="list-style: none">
+ * <li> public OipCase(TestScript parent) {
+ * <ul style="list-style: none">
+ * <li> </code><i>Use <b>one</b> of the following constructors based on if this TestCase is standalone</i><code>
+ * <li> super(parent);</code> <i>Standalone defaulted to <b>false</b></i><code>
+ * <li> super(parent, true);</code><i>Standalone explicitly set to <b>true</b></i><code>
+ * <li>
+ * <li> </code><i>All requirements tested in the test case should be noted here with the </i>
+ * <code>{@link org.eclipse.osee.ote.core.TestCase#addTracability(String) addTracability}</code><i> method.</i> <code>
+ * </ul>
+ * <li> }
+ * <li>
+ * <li> </code><i><b>Note:</b>It is very important that </i><code>doTestCase</code><i> always has the </i>
+ * <code>throws InterrupedException</code><i> in the method declaration. The ability to abort a script relies on this
+ * statement, and without it many calls would have to be wrapped with a try/catch block.</i><code>
+ * <li> public void doTestCase(ITestEnvironmentAccessor environment, ITestLogger logger) throws InterruptedException {
+ * <ul style="list-style: none">
+ * <li> </code><i>Place all of the runtime code for the test case here.</i><code>
+ * </ul>
+ * <li> }
+ * </ul>
+ * }
+ * </code>
+ *
+ * @see org.eclipse.osee.ote.core.TestScript
+ * @author Ryan D. Brooks
+ * @author Robert A. Fisher
+ */
+public abstract class TestCase implements ITestEnvironmentAccessor, Xmlizable, XmlizableStream {
+ protected ITestLogger logger;
+ private final ITestEnvironmentAccessor environment;
+ private final boolean standAlone;
+ private final WeakReference<TestScript> testScript;
+ private final TestDescriptionRecord testDescription;
+ @JsonProperty
+ public int number;
+ protected List<RequirementRecord> traceability = new ArrayList<>();
+
+ /**
+ * TestCase Constructor.
+ */
+ public TestCase(TestScript testScript) {
+ this(testScript, false);
+ }
+
+ /**
+ * TestCase Constructor.
+ */
+ public TestCase(TestScript testScript, boolean standAlone) {
+ this(testScript, standAlone, true);
+ }
+
+ /**
+ * TestCase Constructor.
+ */
+ protected TestCase(TestScript testScript, boolean standAlone, boolean addToRunList) {
+ super();
+ this.testDescription = new TestDescriptionRecord(testScript.getTestEnvironment());
+ this.standAlone = standAlone;
+ if (addToRunList) {
+ this.number = testScript.addTestCase(this);
+ }
+ this.testScript = new WeakReference<>(testScript);
+ this.environment = testScript.getTestEnvironment();
+ GCHelper.getGCHelper().addRefWatch(this);
+ }
+
+ public TestCase(ITestEnvironmentAccessor accessor) {
+ this.testDescription = new TestDescriptionRecord(accessor);
+
+ // TODO we have two different traceability tags here.... we need to combine these or get rid
+ // of them all together since define and the artifact framework specifies traceability
+ // this.tracability = new ArrayList();
+ this.traceability = new ArrayList<>();
+
+ this.standAlone = false;
+ ;
+ this.number = 1;
+ this.testScript = null;
+ this.environment = accessor;
+
+ }
+
+ /**
+ * Called by baseDoTestCase(). This is implemented by the tester's in each test case in the test script.
+ *
+ * @param environment The Test environment.
+ */
+ public abstract void doTestCase(ITestEnvironmentAccessor environment, ITestLogger logger) throws InterruptedException;
+
+ public Element getTastCaseNumberXml(Document doc) {
+ return Jaxp.createElement(doc, "Number", String.valueOf(number));
+ }
+
+ public void writeTestCaseNumber(XMLStreamWriter writer) throws XMLStreamException {
+ XMLStreamWriterUtil.writeElement(writer, "Number", String.valueOf(number));
+ }
+
+ public void writeTestCaseClassName(XMLStreamWriter writer) throws XMLStreamException {
+ String name = this.getClass().getName();
+ if (name == null || name.length() == 0) {
+ name = "";
+ }
+ XMLStreamWriterUtil.writeElement(writer, "Name", name);
+ }
+
+ @JsonProperty
+ public String getName() {
+ return this.getClass().getName();
+ }
+
+ public void writeTracability(XMLStreamWriter writer) throws XMLStreamException {
+ writer.writeStartElement("Tracability");
+ for (RequirementRecord record : traceability) {
+ record.toXml(writer);
+ }
+ writer.writeEndElement();
+ }
+
+ public Element getTestCaseClassName(Document doc) {
+ String name = this.getClass().getName();
+ if (name == null || name.length() == 0) {
+ name = "";
+ }
+ return Jaxp.createElement(doc, "Name", name);
+ }
+
+ public String getTestCaseClassName() {
+ return this.getClass().getName();
+ }
+
+ public TestCase getTestCase() {
+ return this;
+ }
+
+ /**
+ * @return Returns the testCaseNumber.
+ */
+ public int getTestCaseNumber() {
+ return number;
+ }
+
+ public ITestEnvironmentAccessor getTestEnvironment() {
+ return environment;
+ }
+
+ public TestRecord getTestRecord() {
+ return new TestCaseRecord(getTestEnvironment(), this);
+ }
+
+ /**
+ * @return Returns the testScript.
+ */
+ @Override
+ public TestScript getTestScript() {
+ return testScript.get();
+ }
+
+ public Element getTracabilityXml(Document doc) {
+ Element traceElement = doc.createElement("Tracability");
+ for (RequirementRecord record : traceability) {
+ traceElement.appendChild(record.toXml(doc));
+
+ }
+ return traceElement;
+ }
+
+ /**
+ * @return Returns the standAlone.
+ */
+ public boolean isStandAlone() {
+ return standAlone;
+ }
+
+ public void prompt() throws InterruptedException {
+ getTestScript().prompt();
+ }
+
+ public void prompt(String message) throws InterruptedException {
+ getTestScript().prompt(new TestPrompt(message, PromptResponseType.NONE));
+ }
+
+ public void promptPassFail(String message) throws InterruptedException {
+ getTestScript().getLogger().methodCalled(getTestScript().getTestEnvironment(), new MethodFormatter().add(message));
+
+ getTestScript().promptPassFail(message);
+
+ getTestScript().getLogger().methodEnded(getTestScript().getTestEnvironment());
+ }
+
+ public void promptPause(String message) throws InterruptedException {
+ getTestScript().promptPause(message);
+ }
+
+ public void promptStep(String message) throws InterruptedException {
+ getTestScript().prompt(new TestPrompt(message, PromptResponseType.SCRIPT_STEP));
+ }
+
+ public String promptInput(String message) throws InterruptedException {
+ return getTestScript().prompt(new TestPrompt(message, PromptResponseType.USER_INPUT));
+ }
+
+ /**
+ * Logs the results of a test point.
+ *
+ * @param passed boolean T/F
+ * @param expected The expected information
+ * @param actual The actual information
+ */
+ public void testpoint(boolean passed, String testPointName, String expected, String actual) {
+ logger.testpoint(this.getTestEnvironment(), this.getTestScript(), this, passed, testPointName, expected, actual);
+ }
+
+ @Override
+ public String toString() {
+ String description = getTestScript().getClass().getName() + "Test Case " + number + ":";
+ if (traceability != null) {
+ for (RequirementRecord record : traceability) {
+ description += "\n\t" + record;
+ }
+ }
+ return description;
+ }
+
+ @Override
+ public Element toXml(Document doc) {
+ Element testCaseElement = doc.createElement("TestCase");
+ testCaseElement.appendChild(getTastCaseNumberXml(doc));
+ testCaseElement.appendChild(getTestCaseClassName(doc));
+ testCaseElement.appendChild(getTracabilityXml(doc));
+ return testCaseElement;
+ }
+
+ @Override
+ public void toXml(XMLStreamWriter writer) throws XMLStreamException {
+ writer.writeStartElement("TestCase");
+ writeTestCaseNumber(writer);
+ writeTestCaseClassName(writer);
+ writeTracability(writer);
+ }
+
+ /**
+ * Starts running the test case. Calls doTestCase(), which is implemented by the tester in each test case.
+ *
+ * @param environment The Test Enviornment.
+ */
+ public void baseDoTestCase(ITestEnvironmentAccessor environment) throws InterruptedException {
+ this.logger = environment.getLogger();
+
+ logger.testCaseBegan(this); // This is required for valid outfile.
+ //This creates the test case outfile logging.
+
+ environment.getTestScript().setTestCase(this);
+ OseeLog.logf(TestEnvironment.class, OteLevel.TEST_EVENT, "Starting Test Case %s.%s",
+ this.getTestScript().getClass().getSimpleName(), this.getClass().getSimpleName());
+ doTestCase(environment, environment.getLogger());
+ }
+
+ @Override
+ public void abortTestScript() {
+ environment.abortTestScript();
+ }
+
+ @Override
+ public boolean addTask(EnvironmentTask task) {
+ return environment.addTask(task);
+ }
+
+ @Override
+ public void associateObject(Class<?> c, Object obj) {
+ environment.associateObject(c, obj);
+ }
+
+ @Override
+ public Object getAssociatedObject(Class<?> c) {
+ return environment.getAssociatedObject(c);
+ }
+
+ @Override
+ public Set<Class<?>> getAssociatedObjects() {
+ return environment.getAssociatedObjects();
+ }
+
+ /*
+ * public ITestEnvironmentCommandCallback getClientCallback() { return environment.getClientCallback(); }
+ */
+
+ // public EnvironmentType getEnvironmentType() {
+ // return environment.getEnvironmentType();
+ // }
+ @Override
+ public long getEnvTime() {
+ return environment.getEnvTime();
+ }
+
+ @Override
+ public IExecutionUnitManagement getExecutionUnitManagement() {
+ return environment.getExecutionUnitManagement();
+ }
+
+ @Override
+ public ITestLogger getLogger() {
+ return environment.getLogger();
+ }
+
+ @Override
+ public IScriptControl getScriptCtrl() {
+ return environment.getScriptCtrl();
+ }
+
+ /*
+ * public StatusBoard getStatusBoard() { return environment.getStatusBoard(); }
+ */
+
+ @Override
+ public ITestStation getTestStation() {
+ return environment.getTestStation();
+ }
+
+ @Override
+ public ITimerControl getTimerCtrl() {
+ return environment.getTimerCtrl();
+ }
+
+ @Override
+ public void onScriptComplete() throws InterruptedException {
+ environment.onScriptComplete();
+ }
+
+ @Override
+ public void onScriptSetup() {
+ environment.onScriptSetup();
+ }
+
+ @Override
+ public ICancelTimer setTimerFor(ITimeout listener, int time) {
+ return environment.setTimerFor(listener, time);
+ }
+
+ public void logTestPoint(boolean isPassed, String testPointName, String expected, String actual) {
+ this.getLogger().testpoint(this.getTestEnvironment(), this.getTestScript(), this, isPassed, testPointName,
+ expected, actual);
+ }
+
+ public void setPurpose(String purpose) {
+ testDescription.setPurpose(purpose);
+ }
+
+ public void setPreCondition(String preCondition) {
+ testDescription.setPreCondition(preCondition);
+ }
+
+ public void setPostCondition(String postCondition) {
+ testDescription.setPostCondition(postCondition);
+ }
+
+ public List<RequirementRecord> getScriptReqRecordTraceability() {
+ return traceability;
+ }
+
+ public void addTraceability(String description) {
+ this.traceability.add(new RequirementRecord(this.getTestEnvironment(), description));
+ }
+
+ public void writeToConsole(String message) {
+ TestPrompt p = new TestPrompt(message);
+
+ try {
+ testScript.get().prompt(p);
+ } catch (Throwable e) {
+ OseeLog.log(TestEnvironment.class, Level.INFO, e.getMessage(), e);
+ }
+ }
+
+ public void setTestScript(TestScript script) {
+ throw new IllegalStateException("Why are you calling this one?!?!?!?");
+ }
+
+ @Override
+ public void abortTestScript(Throwable t) {
+ testScript.get().abortDueToThrowable(t);
+ }
+
+ @JsonProperty
+ public List<RequirementRecord> getTraceability() {
+ if (traceability.isEmpty()) {
+ return null;
+ } else {
+ return traceability;
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestException.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestException.java
new file mode 100644
index 000000000..bd54922cd
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestException.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.IHealthStatus;
+
+public class TestException extends RuntimeException {
+
+ private static final long serialVersionUID = -5628986844200418864L;
+
+ private final String threadCauseName;
+ private final Level level;
+ private List<IHealthStatus> status = new ArrayList<>();
+
+ public TestException(String message, Level level) {
+ this(message, level, null);
+ }
+
+ public TestException(String message, Level level, Throwable cause) {
+ super(message, cause);
+ this.level = level;
+ threadCauseName = Thread.currentThread().getName();
+ }
+
+ public TestException(String message, List<IHealthStatus> status) {
+ this(message, Level.SEVERE);
+ this.status = status;
+ }
+
+ public String getThreadName() {
+ return threadCauseName;
+ }
+
+ public Level getLevel() {
+ return level;
+ }
+
+ public List<IHealthStatus> getHealthStatus() {
+ return status;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestPointTally.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestPointTally.java
new file mode 100644
index 000000000..59c3cef79
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestPointTally.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core;
+
+import org.eclipse.osee.ote.core.environment.status.OTEStatusBoard;
+import org.eclipse.osee.ote.core.log.ITestPointTally;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class TestPointTally implements ITestPointTally {
+ private int testPointSuccesses;
+ private int testPointFailures;
+ private final String testName;
+ private final OTEStatusBoard statusBoard;
+
+ public TestPointTally(String testName) {
+ this.testName = testName;
+ statusBoard = ServiceUtility.getService(OTEStatusBoard.class);//tracker.getService();
+ }
+
+ @Override
+ public void reset() {
+ this.testPointSuccesses = 0;
+ this.testPointFailures = 0;
+ sendUpdate();
+ }
+
+ @Override
+ public int tallyTestPoint(boolean pass) {
+ if (pass) {
+ testPointSuccesses++;
+ } else {
+ testPointFailures++;
+ }
+ sendUpdate();
+ return getTestPointTotal();
+ }
+
+ private void sendUpdate() {
+ statusBoard.onTestPointUpdate(testPointSuccesses, testPointFailures, testName);
+ }
+
+ @Override
+ public int getTestPointTotal() {
+ return testPointSuccesses + testPointFailures;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestPrompt.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestPrompt.java
new file mode 100644
index 000000000..f9f409973
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestPrompt.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core;
+
+import java.io.Serializable;
+
+import org.eclipse.osee.ote.core.enums.PromptResponseType;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class TestPrompt implements Serializable {
+
+ private static final long serialVersionUID = 5960067878239875110L;
+ private final String prompt;
+ private final boolean waitForResponse;
+ private final boolean ofpStep;
+ private final PromptResponseType type;
+
+ public TestPrompt(String prompt) {
+ this(prompt, PromptResponseType.NONE);
+ }
+
+ public TestPrompt(String prompt, PromptResponseType type) {
+ super();
+ this.prompt = XmlSupport.convertNonPrintableCharacers(prompt);
+ this.waitForResponse =
+ type == PromptResponseType.SCRIPT_PAUSE || type == PromptResponseType.PASS_FAIL || type == PromptResponseType.SCRIPT_STEP || type == PromptResponseType.USER_INPUT ? true : false;
+ this.ofpStep = type == PromptResponseType.SCRIPT_STEP ? true : false;
+ this.type = type;
+ }
+
+ public PromptResponseType getType() {
+ return type;
+ }
+
+ public boolean isWaiting() {
+ return this.waitForResponse;
+ }
+
+ @Override
+ public String toString() {
+ return this.prompt;
+ }
+
+ /**
+ * @return Returns the ofpStep.
+ */
+ public boolean isOfpStep() {
+ return ofpStep;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestPromptImpl.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestPromptImpl.java
new file mode 100644
index 000000000..cdad9b745
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestPromptImpl.java
@@ -0,0 +1,166 @@
+package org.eclipse.osee.ote.core;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.ote.core.enums.PromptResponseType;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.framework.prompt.InformationalPrompt;
+import org.eclipse.osee.ote.core.framework.prompt.PassFailPromptImpl;
+import org.eclipse.osee.ote.core.framework.prompt.PassFailPromptResult;
+import org.eclipse.osee.ote.core.framework.prompt.ScriptPausePromptImpl;
+import org.eclipse.osee.ote.core.framework.prompt.UserInputPromptImpl;
+import org.eclipse.osee.ote.core.framework.prompt.YesNoPromptImpl;
+import org.eclipse.osee.ote.core.framework.prompt.YesNoPromptResult;
+import org.eclipse.osee.ote.core.log.record.AttentionRecord;
+import org.eclipse.osee.ote.core.log.record.TestPointRecord;
+import org.eclipse.osee.ote.core.log.record.TestRecord;
+import org.eclipse.osee.ote.core.testPoint.CheckPoint;
+
+class TestPromptImpl {
+
+ private final Executor promptInitWorker;
+
+ public TestPromptImpl() {
+ promptInitWorker = Executors.newSingleThreadExecutor();
+ }
+
+
+ public String prompt(final TestPrompt prompt, final TestEnvironment environment, final TestScript test) throws InterruptedException {
+
+ if (environment.isInBatchMode()) {
+ promptInitWorker.execute(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ test.getUserSession().initiateInformationalPrompt(prompt.toString());
+ } catch (Exception e) {
+ System.out.println(prompt.toString());
+ }
+ }
+ });
+ if (prompt.getType() == PromptResponseType.PASS_FAIL) {
+ test.getLogger().log(
+ new TestPointRecord(environment, new CheckPoint(prompt.toString(), "PROMPT DURING BATCH", "N/A", false),
+ true));
+ } else {
+ test.getLogger().log(new AttentionRecord(environment, prompt.getType().name() + " : " + prompt.toString(), true));
+ }
+ return "";
+ } else if (!environment.getRunManager().isCurrentThreadScript()){
+ promptInitWorker.execute(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ test.getUserSession().initiateInformationalPrompt(prompt.toString());
+ } catch (Exception e) {
+ System.out.println(prompt.toString());
+ }
+ }
+ });
+ if (prompt.getType() != PromptResponseType.NONE) {
+ test.getLogger().log(new AttentionRecord(environment, String.format("ERROR: Blocking prompt type[%s] in non script thread[%s] message[%s]", prompt.getType().name(), Thread.currentThread().getName(), prompt.toString()), true));
+ } else {
+ test.getLogger().log(new AttentionRecord(environment, prompt.getType().name() + " : " + prompt.toString(), true));
+ }
+ return "";
+ } else {
+ try {
+ final String returnValue;
+ String logOutput;
+ final TestRecord testRecord;
+ final IServiceConnector connector = environment.getConnector();
+ synchronized (test){
+ switch (prompt.getType()) {
+ case NONE:
+ InformationalPrompt infoPrompt = new InformationalPrompt(connector, "", prompt.toString());
+ infoPrompt.open(test.getUserSession(), promptInitWorker);
+ infoPrompt.close();
+ returnValue = "";
+ testRecord = new AttentionRecord(environment, String.format("PROMPT [%s]\n{\n%s\n}\n", PromptResponseType.NONE.name(), prompt.toString()), true);
+ break;
+ case PASS_FAIL:
+ PassFailPromptImpl passFailPrompt = new PassFailPromptImpl(connector, test, "", prompt.toString());
+ PassFailPromptResult result = passFailPrompt.open(promptInitWorker);
+ returnValue = result.getText();
+ passFailPrompt.close();
+ testRecord =
+ new TestPointRecord(environment, new CheckPoint("Pass/Fail Prompt", prompt.toString(),
+ returnValue, result.isPass()), true);
+ break;
+ case YES_NO:
+ YesNoPromptImpl yesNoPrompt = new YesNoPromptImpl(connector, test, "", prompt.toString());
+ YesNoPromptResult yesNo = yesNoPrompt.open(promptInitWorker);
+ if (yesNo.isYes()) {
+ returnValue = "YES";
+ } else {
+ returnValue = "NO";
+ }
+ logOutput =
+ String.format("PROMPT [%s]\n{\n%s\n}\n\tRETURN VALUE : %s", PromptResponseType.YES_NO.name(),
+ prompt.toString(), returnValue);
+ yesNoPrompt.close();
+ testRecord = new AttentionRecord(environment, logOutput, true);
+ break;
+ case SCRIPT_PAUSE:
+ ScriptPausePromptImpl scriptPausePrompt =
+ new ScriptPausePromptImpl(connector, test, "", prompt.toString());
+ returnValue = scriptPausePrompt.open(promptInitWorker);
+ scriptPausePrompt.close();
+ if (returnValue != null && returnValue.length() > 0) {
+ logOutput =
+ String.format("PROMPT [%s]\n{\n%s\n}\n\tRETURN VALUE : %s", PromptResponseType.SCRIPT_PAUSE.name(),
+ prompt.toString(), returnValue);
+ } else {
+ logOutput =
+ String.format("PROMPT [%s]\n{\n%s\n}\n", PromptResponseType.SCRIPT_PAUSE.name(), prompt.toString());
+ }
+
+ testRecord = new AttentionRecord(environment, logOutput, true);
+ ;
+ break;
+ case USER_INPUT:
+ UserInputPromptImpl userInputPrompt = new UserInputPromptImpl(connector, test, "", prompt.toString());
+ returnValue = userInputPrompt.open(promptInitWorker);
+ userInputPrompt.close();
+ if (returnValue != null && returnValue.length() > 0) {
+ logOutput =
+ String.format("PROMPT [%s]\n{\n%s\n}\n\tRETURN VALUE : %s", PromptResponseType.USER_INPUT.name(),
+ prompt.toString(), returnValue);
+ } else {
+ logOutput =
+ String.format("PROMPT [%s]\n{\n%s\n}\n", PromptResponseType.USER_INPUT.name(), prompt.toString());
+ }
+ testRecord = new AttentionRecord(environment, logOutput, true);
+ break;
+ case SCRIPT_STEP:
+ returnValue = "";
+ testRecord =
+ new AttentionRecord(environment,
+ PromptResponseType.SCRIPT_STEP.name() + " : " + prompt.toString(), true);
+ break;
+ case OFP_DEBUG_RESPONSE:
+ returnValue = "";
+ testRecord = null;
+ break;
+ default:
+ returnValue = "";
+ testRecord = null;
+ }
+ }
+ if (testRecord != null) {
+ testRecord.setStackTrace(new Throwable());
+ test.getLogger().log(testRecord);
+ }
+ return returnValue;
+ } catch (InterruptedException e) {
+ throw new InterruptedException();
+ } catch (Exception e) {
+ // what
+ }
+ return "";
+ }
+
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestScript.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestScript.java
new file mode 100644
index 000000000..0d92ceccd
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestScript.java
@@ -0,0 +1,628 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.logging.Level;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.eclipse.osee.framework.jdk.core.persistence.XmlizableStream;
+import org.eclipse.osee.framework.logging.ILoggerFilter;
+import org.eclipse.osee.framework.logging.ILoggerListener;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.enums.PromptResponseType;
+import org.eclipse.osee.ote.core.enums.ScriptTypeEnum;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.command.CommandDescription;
+import org.eclipse.osee.ote.core.environment.interfaces.IScriptCompleteListener;
+import org.eclipse.osee.ote.core.environment.interfaces.IScriptInitializer;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestLogger;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestStation;
+import org.eclipse.osee.ote.core.environment.interfaces.ITimeout;
+import org.eclipse.osee.ote.core.environment.status.CommandEndedStatusEnum;
+import org.eclipse.osee.ote.core.framework.testrun.ITestRunListener;
+import org.eclipse.osee.ote.core.framework.testrun.ITestRunListenerProvider;
+import org.eclipse.osee.ote.core.log.ITestPointTally;
+import org.eclipse.osee.ote.core.log.record.ScriptResultRecord;
+
+/**
+ * TestScript is the abstract base class for all test scripts. This class provides the interfaces necessary to allow a
+ * script to be run against remote testing environment servers.
+ * <p>
+ * The TestScript class contains the following information:
+ * <ul>
+ * <li><b>crew</b> - Defines if the script is for pilot or copilot.
+ * <li><b>isBatchable</b> - Defines whether or not the script is batchable. This typically indicates whether or not
+ * there are any prompts in the script.
+ * <li><b>isMpLevel</b> - Defines if the script tests at the Mission Processor level or if it tests at the node level.
+ * <li>Selective run list of TestCase's for test case skipping
+ * <li>ScriptInitializer object
+ * <li>TestCase objects that make up the runtime of the script
+ * </ul>
+ * <p>
+ * When building a new TestScript object it is important to understand that the object does not only contain the runtime
+ * code for performing the test, but also contains information about the test being performed that can be retrieved by
+ * instantiating the object with out necessarily running it.
+ * <p>
+ * The following sample should be followed closely when building TestScript objects. <br>
+ * <br>
+ * <hr>
+ * <br>
+ * <code>
+ * public class SampleScript extends TestCase {
+ * <ul style="list-style: none">
+ * <li> </code><i>Place declarations for <b>LRU Models</b>,<b>Messages</b>, and <b>Support</b> classes here.</i><code>
+ * <li>
+ * <li> </code><i>This constructor is necessary for instantiating the TestScript object to get data!</i><code>
+ * <li> SampleScript () {
+ * <ul style="list-style: none">
+ * <li> this (null,null);
+ * </ul>
+ * <li> }
+ * <li>
+ * <li> </code><i>This constructor is used at runtime.</i><code>
+ * <li> SampleScript (TestEnvironment environment, TestEnvironmentController connection) {
+ * <ul style="list-style: none">
+ * <li> super (environment, connection, [batchability, true or false]);
+ * <li>
+ * <li> </code><i>Place construction for <b>LRU Models</b>,<b>Messages</b>, and <b>Support</b> classes here.</i><code>
+ * <li>
+ * <li> </code><i>Construct all test cases here. The base TestCase constructor will automatically add
+ * <li>itself to the run list of the TestScript.</i><code>
+ * <li> new OipCase(this);
+ * <li> </code><i>...</i><code>
+ * </ul>
+ * <li> }
+ * <li>
+ * <li> </code><i>This inner class defines the setup for the script and must be present.</i><code>
+ * <li> private class LocalSetupTestCase extends SetupTestCase {
+ * <ul style="list-style: none">
+ * <li>
+ * <li> </code><i>Allows the setup to add itself to the runlist.</i><code>
+ * <li> protected LocalSetupTestCase(TestScript parent) {
+ * <ul style="list-style: none">
+ * <li> super(parent);
+ * </ul>
+ * <li> }
+ * <li>
+ * <li> </code><i>Provides the runtime code for initialization.</i><code>
+ * <li> public void doTestCase(ITestEnvironmentAccessor environment, ITestLogger logger) {
+ * <ul style="list-style: none">
+ * <li> </code><i>Place any necessary setup code here and it will be run prior to any of the test cases.</i><code>
+ * </ul>
+ * <li> }
+ * </ul>
+ * <li> }
+ * <li> <br>
+ * <li> </code><i>Place all of the test cases here. These will be inner classes that extend </i>
+ * {@link org.eclipse.osee.ote.core.TestCase TestCase}<i>.
+ * <li><b>NOTE:</b>All of these inner classes must be instantiated in the constructor for the TestScript object. If an
+ * inner class is not instantiated then it will <b>not</b> be run, and information within the class will not be
+ * available when the TestScript is instantiated for data retrieval.</i><code>
+ * <li> public class OipCase extends TestCase {
+ * <ul style="list-style: none">
+ * <li> public OipCase(TestScript parent) {
+ * <ul style="list-style: none">
+ * <li> </code><i>Use <b>one</b> of the following constructors based on if this TestCase is standalone</i><code>
+ * <li> super(parent);</code> <i>Standalone defaulted to <b>false</b></i><code>
+ * <li> super(parent, true);</code><i>Standalone explicitly set to <b>true</b></i><code>
+ * <li>
+ * <li> </code><i>All requirements tested in the test case should be noted here with the </i>
+ * <code>{@link org.eclipse.osee.ote.core.TestCase#addTracability(String) addTracability}</code><i> method.</i> <code>
+ * </ul>
+ * <li> }
+ * <li>
+ * <li> </code><i><b>Note:</b>It is very important that </i><code>doTestCase</code><i> always has the </i>
+ * <code>throws InterrupedException</code><i> in the method declaration. The ability to abort a script relies on this
+ * statement, and without it many calls would have to be wrapped with a try/catch block.</i><code>
+ * <li> public void doTestCase(ITestEnvironmentAccessor environment, ITestLogger logger) throws InterruptedException {
+ * <ul style="list-style: none">
+ * <li> </code><i>Place all of the runtime code for the test case here.</i><code>
+ * </ul>
+ * <li> }
+ * </ul>
+ * <li> }
+ * </ul>
+ * }
+ * </code> <br>
+ * <hr>
+ *
+ * @author Ryan D. Brooks
+ * @author Robert A. Fisher
+ * @see org.eclipse.osee.ote.core.TestCase
+ */
+public abstract class TestScript implements ITimeout {
+ private static final Set<Class<? extends TestScript>> instances =
+ Collections.synchronizedSet(new HashSet<Class<? extends TestScript>>());
+ private static final AtomicLong constructed = new AtomicLong(0);
+ private static final AtomicLong finalized = new AtomicLong(0);
+ private final boolean isBatchable;
+ private final ITestStation testStation;
+ private CommandDescription cmdDescription;
+ protected TestCase currentTestCase;
+ protected final TestEnvironment environment;
+ private final boolean isMpLevel;
+ private IScriptInitializer scriptInitializer;
+ private final ScriptTypeEnum scriptType;
+ private final ArrayList<TestCase> selectiveRunList = new ArrayList<>(32);
+ private Date startTime;
+ private final ArrayList<TestCase> testCases = new ArrayList<>(32);
+ private final ITestPointTally testPointTally;
+ protected CommandEndedStatusEnum status;
+ private Throwable rootCause;
+ private volatile boolean timedOut;
+ private volatile boolean aborted = false;
+ private final ArrayList<IScriptCompleteListener> scriptCompleteListeners =
+ new ArrayList<IScriptCompleteListener>(32);
+
+ private final ScriptResultRecord scriptResultRecord;
+ private int pass;
+ private int fail;
+ private ScriptLoggingListener loggingListener;
+ private final TestPromptImpl promptImpl;
+ private ITestRunListenerProvider listenerProvider;
+ private boolean shouldPauseOnFail;
+ private boolean printFailToConsole;
+
+ public TestScript(TestEnvironment environment, IUserSession callback, ScriptTypeEnum scriptType, boolean isBatchable) {
+ constructed.incrementAndGet();
+ this.scriptType = scriptType;
+ this.isBatchable = isBatchable;
+ this.isMpLevel = false;
+
+ promptImpl = new TestPromptImpl();
+ scriptResultRecord = new ScriptResultRecord(this);
+ if (environment != null) {
+ this.environment = environment;
+ this.startTime = new Date(0);
+ testStation = this.environment.getTestStation();
+ GCHelper.getGCHelper().addRefWatch(this);
+ instances.add(getClass());
+ } else {
+ throw new TestException("No environment found: Can not run script ", Level.SEVERE);
+ }
+ this.testPointTally = new TestPointTally(this.getClass().getName());
+ shouldPauseOnFail = OteProperties.isPauseOnFailEnabled();
+ printFailToConsole = OteProperties.isPrintFailToConsoleEnabled();
+ }
+
+ public void abort() {
+ OseeLog.log(TestEnvironment.class, Level.SEVERE, "Aborting script", new Exception());
+ aborted = true;
+ }
+
+ public void abortDueToThrowable(Throwable cause) {
+ this.rootCause = cause;
+ abort();
+ }
+
+ /**
+ * Removes all of the test cases from the selective run list. The list will be empty after this call returns.
+ */
+ public void clearRunList() {
+ selectiveRunList.clear();
+ }
+
+ public void endTest() {
+ // provided as a hook for scripts to override
+ }
+
+ /**
+ * @return Returns the startTime.
+ */
+ public Date getStartTime() {
+ return startTime;
+ }
+
+ public TestCase getTestCase() {
+ return currentTestCase;
+ }
+
+ /**
+ * Get list of test cases.
+ *
+ * @return reference to arrayList testCases.
+ */
+ public/* TestCase */List<TestCase> getTestCases() {
+ ArrayList<TestCase> testCaseList = new ArrayList<>();
+ testCaseList.add(getSetupTestCase());
+ testCaseList.addAll(testCases);
+ testCaseList.add(getTearDownTestCase());
+ return testCaseList;
+ }
+
+ public ITestEnvironmentAccessor getTestEnvironment() {
+ return environment;
+ }
+
+ public IUserSession getUserSession() {
+ return ServiceUtility.getService(OTESessionManager.class).getActiveUser();
+ }
+
+ public TestScript getTestScript() {
+ return this;
+ }
+
+ public ITestLogger getLogger() {
+ return environment.getLogger();
+ }
+
+ public ScriptTypeEnum getType() {
+ return this.scriptType;
+ }
+
+ public final boolean isBatchable() {
+ return isBatchable;
+ }
+
+ public final boolean isMpLevel() {
+ return isMpLevel;
+ }
+
+ public String prompt(final TestPrompt prompt) throws InterruptedException {
+ return promptImpl.prompt(prompt, environment, this);
+ }
+
+ /**
+ * This method will display a null prompt to the console.
+ */
+ public void prompt() throws InterruptedException {
+ getTestScript().prompt(new TestPrompt(null, PromptResponseType.NONE));
+ }
+
+ /**
+ * This method will display the message input to the console.
+ */
+ public void prompt(String message) throws InterruptedException {
+ getTestScript().prompt(new TestPrompt(message, PromptResponseType.NONE));
+ }
+
+ /**
+ * This method will display the message input to the console. It will also prompt the user with a dialog box to input
+ * whether the condition passed or failed.
+ */
+ public void promptPassFail(String message) throws InterruptedException {
+ getTestScript().prompt(new TestPrompt(message, PromptResponseType.PASS_FAIL));
+ }
+
+ /**
+ * This method will display the message input to the console. It also pauses the script running, and will prompt the
+ * user with a dialog box to continue on with the running of the script.
+ */
+ public void promptPause(String message) throws InterruptedException {
+ prompt(new TestPrompt(message, PromptResponseType.SCRIPT_PAUSE));
+ }
+
+ public void pauseScriptOnFail(int testPoint) throws InterruptedException{
+ if (shouldPauseOnFail){
+ promptPause("Test point " + testPoint + " failed.\n");
+ }
+ }
+
+ public void pauseScriptOnFail(int testPoint, String name, String expected, String actual, String stackTrace) throws InterruptedException{
+ if (shouldPauseOnFail){
+ promptPause("TP " + testPoint + ": " + name + "\nExpected: " + expected + "\nActual: " + actual + "\n\n" + stackTrace );
+ }
+ }
+
+ public void printFailure(int testPoint) throws InterruptedException{
+ if (printFailToConsole){
+ prompt("Test point " + testPoint + " failed.\n");
+ }
+ }
+ public void printFailure(int testPoint, String name, String expected, String actual, String stackTrace) throws InterruptedException{
+ if (printFailToConsole){
+ prompt("TP " + testPoint + ": " + name + "\nExpected: " + expected + "\nActual: " + actual + "\n\n" + stackTrace );
+ }
+ }
+
+ /**
+ * Do not use this method from tests instead use {@link #logTestPoint(boolean, String, String, String)}. Takes result of test point and updates the total test point tally.
+ *
+ * @return total number of test points completed as an int.
+ */
+ public int __recordTestPoint(boolean passed) {
+ return testPointTally.tallyTestPoint(passed);
+ }
+
+ public int getCurrentPointNumber() {
+ return testPointTally.getTestPointTotal();
+ }
+
+ public void addScriptSummary(XmlizableStream xml) {
+ scriptResultRecord.addChildElement((XmlizableStream) xml);
+ }
+
+ /**
+ * Add a single test case to selective run list.
+ */
+ public void selectTestCase(int testCaseNumber) {
+ TestCase testCase = testCases.get(testCaseNumber - 1);
+ if (!testCase.isStandAlone()) {
+ throw new IllegalArgumentException("Test case " + testCaseNumber + " is not stand alone.");
+ }
+ selectiveRunList.add(testCase);
+ }
+
+ /**
+ * Add multiple test cases to the selective run list.
+ */
+ public void selectTestCases(int testCaseNumberStart, int testCaseNumberEnd) {
+ for (int i = testCaseNumberStart; i <= testCaseNumberEnd; i++) {
+ selectTestCase(i);
+ }
+ }
+
+ /**
+ * Sets the script initializer.
+ */
+ public void setScriptInitializer(IScriptInitializer scriptInitializer) {
+
+ this.scriptInitializer = scriptInitializer;
+
+ }
+
+ public IScriptInitializer getScriptInitializer() {
+ return scriptInitializer;
+ }
+
+ /**
+ * Causes current thread to wait until another thread invokes the {@link java.lang.Object#notify()}method or the
+ * {@link java.lang.Object#notifyAll()}method for this object.
+ */
+ public synchronized void testWait(int milliseconds) throws InterruptedException {
+ if (milliseconds < 2) {
+ return;
+ }
+ environment.getLogger().methodCalled(this.environment, new MethodFormatter().add(milliseconds));
+ environment.setTimerFor(this, milliseconds);
+ wait();
+ this.getTestEnvironment().getScriptCtrl().lock();
+ environment.getLogger().methodEnded(this.environment);
+ }
+
+ public synchronized void testWaitNoLog(int milliseconds) throws InterruptedException {
+ if (milliseconds < 2) {
+ return;
+ }
+ environment.setTimerFor(this, milliseconds);
+ wait();
+ this.getTestEnvironment().getScriptCtrl().lock();
+ }
+
+ /**
+ * Prints text to the console informing the user of how much time is left in the wait. Any wait time can be passed
+ * in, but this is intended for long waits; usually > 20 seconds. Will not print any info is the time is less than
+ * 1000 ms.
+ *
+ * @param ms Milliseconds to wait for.
+ */
+ public synchronized void testWaitWithInfo(int ms) throws InterruptedException {
+ int mult = 0;
+ if (ms > 999) {
+ prompt(new TestPrompt("\tWaiting for " + ms / 1000.0 + " seconds."));
+ while (ms >= 30000) {
+ mult++;
+ ms -= 20000;
+ testWait(20000);
+ prompt(new TestPrompt("\t" + 20 * mult + " seconds elapsed."));
+ }
+
+ prompt(new TestPrompt("\tFinishing up; " + ms / 1000.0 + " more seconds."));
+ }
+ testWait(ms);
+ prompt(new TestPrompt("\ttestWait done."));
+ }
+
+ // public String toString() {
+
+ // String description = "Test Script:\n";
+
+ // for (Iterator iter = testCases.iterator(); iter.hasNext();) {
+ // TestCase testCase = (TestCase) iter.next();
+ // description += "\t" + testCase + "\n";
+ // }
+
+ // return description;
+ // }
+
+ /**
+ * Add test case to the test scripts list of test cases.
+ *
+ * @return the number of test cases in the arrayList testCases as an int.
+ */
+ protected int addTestCase(TestCase testCase) {
+ testCases.add(testCase);
+ return testCases.size();
+ }
+
+ @Deprecated
+ public CommandDescription getCommandDescription() {
+ return this.cmdDescription;
+ }
+
+ protected TestCase getSetupTestCase() {
+ return null;
+ }
+
+ protected TestCase getTearDownTestCase() {
+ return null;
+ }
+
+ /**
+ * Log a test point to the test.
+ *
+ * @param isPassed
+ * @param testPointName
+ * @param expected
+ * @param actual
+ */
+ public void logTestPoint(boolean isPassed, String testPointName, String expected, String actual) {
+ this.getLogger().testpoint(this.getTestEnvironment(), this, this.getTestCase(), isPassed, testPointName,
+ expected, actual);
+ }
+
+ @Override
+ public boolean isTimedOut() {
+ return this.timedOut;
+ }
+
+ @Override
+ public void setTimeout(boolean timeout) {
+ this.timedOut = timeout;
+ }
+
+ /**
+ * Use addTestRunListener(ITestRunListener listener) instead.
+ *
+ * @see #addTestRunListener(ITestRunListener listener)
+ */
+ @Deprecated
+ public void addScriptCompleteListener(IScriptCompleteListener listener) {
+ scriptCompleteListeners.add(listener);
+ }
+
+ public ITestStation getTestStation() {
+ return testStation;
+ }
+
+ protected void dispose() {
+ OseeLog.log(TestScript.class, Level.FINEST, "calling dispose on the TestScript.class");
+ }
+
+ /**
+ * Do not use this method from tests instead use {@link #logTestPoint(boolean, String, String, String)}.
+ *
+ */
+ public void __addTestPoint(boolean pass) {
+ if (pass) {
+ this.pass++;
+ } else {
+ this.fail++;
+ }
+ }
+
+ private class ScriptLoggingListener implements ILoggerListener {
+
+ ILoggerFilter filter = new TestScriptLogFilter();
+
+ public ILoggerFilter getFilter() {
+ return filter;
+ }
+
+ @Override
+ public void log(String loggerName, Level level, String message, Throwable th) {
+ if (environment.getLogger() != null) {
+ environment.getLogger().log(level, message, th);
+ }
+ }
+
+ }
+
+ @Override
+ protected void finalize() throws Throwable {
+ instances.remove(getClass());
+ finalized.incrementAndGet();
+ super.finalize();
+ }
+
+ public static long getConstructed() {
+ return constructed.get();
+ }
+
+ public static long getFinalized() {
+ return finalized.get();
+ }
+
+ public static Collection<Class<? extends TestScript>> getInstances() {
+ return new HashSet<Class<? extends TestScript>>(instances);
+ }
+
+ public void disposeTest() {
+ dispose();
+ }
+
+ public boolean isAborted() {
+ return aborted;
+ }
+
+ @Deprecated
+ public void processScriptcompleteListeners() {
+ for (IScriptCompleteListener listener : scriptCompleteListeners) {
+ try {
+ listener.onScriptComplete();
+ } catch (Throwable t) {
+ OseeLog.log(TestEnvironment.class, Level.SEVERE,
+ "exception while notifying script complete listener " + listener.getClass().getName(), t);
+ }
+ }
+ }
+
+ public void setListenerProvider(ITestRunListenerProvider listenerProvider) {
+ this.listenerProvider = listenerProvider;
+ }
+
+ public boolean addTestRunListener(ITestRunListener listener) {
+ if (listenerProvider == null) {
+ String message =
+ String.format("Could not add run listener %s since listener provider is null.",
+ listener.getClass().getName());
+ OseeLog.log(getClass(), Level.WARNING, message, new Exception());
+ return false;
+ }
+ return this.listenerProvider.addTestRunListener(listener);
+ }
+
+ public boolean removeTestRunListener(ITestRunListener listener) {
+ if (listenerProvider == null) {
+ String message =
+ String.format("Could not remove run listener %s since listener provider is null.",
+ listener.getClass().getName());
+ OseeLog.log(getClass(), Level.WARNING, message, new Exception());
+ return false;
+ }
+ return this.listenerProvider.removeTestRunListener(listener);
+ }
+
+ public int getPasses() {
+ return pass;
+ }
+
+ public int getFails() {
+ return fail;
+ }
+
+ @JsonProperty
+ public ScriptResultRecord getScriptResultRecord() {
+ return scriptResultRecord;
+ }
+
+ public void setAborted(boolean aborted) {
+ this.aborted = aborted;
+ }
+
+ void setTestCase(TestCase currentTestCase) {
+ this.currentTestCase = currentTestCase;
+ }
+
+ public String getOutfileComment() {
+ return "\nNO_OUTFILE_COMMENT\n";
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestScriptLogFilter.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestScriptLogFilter.java
new file mode 100644
index 000000000..ccbc5febb
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/TestScriptLogFilter.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core;
+
+import java.util.logging.Level;
+import java.util.regex.Pattern;
+import org.eclipse.osee.framework.logging.ILoggerFilter;
+
+public class TestScriptLogFilter implements ILoggerFilter {
+ private static Level level;
+ static {
+ level = Level.parse(System.getProperty("ote.testscript.filter.level", "SEVERE"));
+ }
+
+ @Override
+ public Pattern bundleId() {
+ return null;
+ }
+
+ @Override
+ public Level getLoggerLevel() {
+ return level;
+ }
+
+ @Override
+ public Pattern name() {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/XmlSupport.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/XmlSupport.java
new file mode 100644
index 000000000..bf8fb3b3f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/XmlSupport.java
@@ -0,0 +1,153 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.osee.framework.jdk.core.text.change.ChangeSet;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class XmlSupport {
+
+ private static final Matcher xmlPatternMatcher = Pattern.compile(
+ "[^" + "a-zA-Z0-9" + "!@#$%\\^&*\\(\\)" + "+ _.-=" + "\'\"<>{}\\[\\]|:;,\n\r\t?/`~\\\\]+").matcher("");
+ private static final String CDATA_TEMPLATE = "<![CDATA[%s]]>";
+ private static final String HEX_START = " 0x";
+ private static final String CDATA_END = "]]>";
+
+ // Prevent Instantiation
+ private XmlSupport() {
+ }
+
+ public static String format(String value) {
+ return XmlSupport.isValidCharaterData(value) ? value : asCDATA(value);
+ }
+
+ public static String asCDATA(String value) {
+ if (!isValidCDATA(value)) {
+ ChangeSet changeSet = null;
+ xmlPatternMatcher.reset(value);
+ while (xmlPatternMatcher.find()) {
+ char[] charToConvert = xmlPatternMatcher.group().toCharArray();
+ StringBuilder converted = new StringBuilder();
+ for (int index = 0; index < charToConvert.length; index++) {
+ converted.append(HEX_START);
+ converted.append(Integer.toString(charToConvert[index], 16));
+ }
+ if (changeSet == null) {
+ changeSet = new ChangeSet(value);
+ }
+ changeSet.replace(xmlPatternMatcher.start(), xmlPatternMatcher.end(), converted.toString());
+ }
+ if (changeSet != null) {
+ value = changeSet.applyChangesToSelf().toString();
+ }
+ }
+ return String.format(CDATA_TEMPLATE, value);
+ }
+
+ public static String sanitizeXMLContent(String str) {
+ return str.replace((char) 0x1a, ' ');
+ }
+
+ private static boolean isValidCDATA(String text) {
+ return isValidCharaterData(text) && !text.contains(CDATA_END);
+ }
+
+ public static boolean isValidCharaterData(String text) {
+ if (text != null) {
+ int size = text.length();
+ for (int index = 0; index < size; index++) {
+ int character = text.charAt(index);
+ if (isSurrogatePair(character)) {
+ index++;
+ if (index < size) {
+ // Check the lower part of the surrogate pair
+ char lowerPart = text.charAt(index);
+ if (isValidLowerSurrogate(lowerPart)) {
+ character = toInt(character, lowerPart);
+ } else {
+ return false;
+ }
+ } else {
+ return false;
+ }
+ }
+ if (!isHTMLCharacter(character)) {
+ return false;
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+
+ private static boolean isSurrogatePair(int character) {
+ return 0xD800 <= character && character <= 0xDBFF;
+ }
+
+ private static boolean isValidLowerSurrogate(char toCheck) {
+ return 0xDC00 <= toCheck && toCheck <= 0xDFFF;
+ }
+
+ private static int toInt(int higher, char lower) {
+ return 0x10000 + (higher - 0xD800) * 0x400 + lower - 0xDC00;
+ }
+
+ private static boolean isHTMLCharacter(int c) {
+ if (c == '\n' || c == '\r' || c == '\t') {
+ return true;
+ }
+ if (c >= 0x20 && c < 0x7F) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Replaces non printable characters with 'ASCII=###' human readable text
+ */
+ public static String convertNonPrintableCharacers(String message) {
+ return convertCharacers(message, true, false);
+ }
+
+ /**
+ * Replaces XML specific characters '<', '>', '&' with human readable text.
+ * Note: also converts non-printable characters
+ */
+ public static String convertXmlCharacters(String message) {
+ return convertCharacers(message, true, true);
+ }
+
+ private static String convertCharacers(String message, boolean printable, boolean xml) {
+
+ StringBuilder buff = new StringBuilder(message.length());
+ for (int i = 0; i < message.length(); i++) {
+ char currentChar = message.charAt(i);
+ if (printable && (currentChar < 32 || currentChar > 126) && currentChar != '\n' && currentChar != '\r' && currentChar != '\t') {
+ buff.append("[ASCII=" + (int) currentChar + "]");
+ } else if (xml && currentChar == '<') {
+ buff.append("[less-than]");
+ } else if (xml && currentChar == '>') {
+ buff.append("[greater-than]");
+ } else if (xml && currentChar == '&') {
+ buff.append("[ampersand]");
+ } else {
+ buff.append(currentChar);
+ }
+ }
+
+ return buff.toString();
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/annotations/OteEventTopic.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/annotations/OteEventTopic.java
new file mode 100644
index 000000000..5b7b21b04
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/annotations/OteEventTopic.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target({ElementType.FIELD})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface OteEventTopic {
+ String[] value();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/annotations/OteProperty.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/annotations/OteProperty.java
new file mode 100644
index 000000000..22aa50562
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/annotations/OteProperty.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target({ElementType.FIELD})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface OteProperty {
+ String[] value();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/CommandId.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/CommandId.java
new file mode 100644
index 000000000..2dcf81c2d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/CommandId.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.cmd;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface CommandId {
+ Namespace getNamespace();
+
+ Name getName();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/Name.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/Name.java
new file mode 100644
index 000000000..6229c1b75
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/Name.java
@@ -0,0 +1,15 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.cmd;
+
+public interface Name {
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/Namespace.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/Namespace.java
new file mode 100644
index 000000000..51f534b2d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/Namespace.java
@@ -0,0 +1,15 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.cmd;
+
+public interface Namespace {
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/Source.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/Source.java
new file mode 100644
index 000000000..9b564a622
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/Source.java
@@ -0,0 +1,18 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.cmd;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface Source {
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/StringCommandId.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/StringCommandId.java
new file mode 100644
index 000000000..8d10b5ec7
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/StringCommandId.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.cmd;
+
+import java.io.Serializable;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class StringCommandId implements CommandId, Serializable {
+
+ private static final long serialVersionUID = 2236967568467058971L;
+ private final Namespace namespace;
+ private final Name name;
+
+ public StringCommandId(Namespace namespace, Name name) {
+ this.namespace = namespace;
+ this.name = name;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof StringCommandId) {
+ return namespace.equals(((StringCommandId) obj).namespace) && name.equals(((StringCommandId) obj).name);
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public int hashCode() {
+ int hash = 7;
+ hash = 31 * hash + namespace.hashCode();
+ hash = 31 * hash + name.hashCode();
+ return hash;
+ }
+
+ @Override
+ public Name getName() {
+ return name;
+ }
+
+ @Override
+ public Namespace getNamespace() {
+ return namespace;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/StringName.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/StringName.java
new file mode 100644
index 000000000..bdea6bb07
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/StringName.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.cmd;
+
+import java.io.Serializable;
+
+public class StringName implements Name, Serializable {
+ private static final long serialVersionUID = -7215226960243262972L;
+ private final String name;
+
+ public StringName(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public boolean equals(Object arg0) {
+ if (arg0 instanceof StringName) {
+ return name.equals(((StringName) arg0).name);
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public int hashCode() {
+ return name.hashCode();
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/StringNamespace.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/StringNamespace.java
new file mode 100644
index 000000000..2d0ef9f7e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/StringNamespace.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.cmd;
+
+import java.io.Serializable;
+
+public class StringNamespace implements Namespace, Serializable {
+ private static final long serialVersionUID = -8903438134102328929L;
+ private final String namespace;
+
+ public StringNamespace(String namespace) {
+ this.namespace = namespace;
+ }
+
+ @Override
+ public boolean equals(Object arg0) {
+ if (arg0 instanceof StringNamespace) {
+ return namespace.equals(((StringNamespace) arg0).namespace);
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public int hashCode() {
+ return namespace.hashCode();
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/UriSource.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/UriSource.java
new file mode 100644
index 000000000..7618bf896
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/cmd/UriSource.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.cmd;
+
+import java.io.Serializable;
+import java.net.URI;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class UriSource implements Source, Serializable {
+
+ private static final long serialVersionUID = -917397242786038197L;
+ private final URI source;
+
+ public UriSource(URI source) {
+ this.source = source;
+ }
+
+ public URI getSource() {
+ return source;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ return source.equals(obj);
+ }
+
+ @Override
+ public int hashCode() {
+ return source.hashCode();
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/enums/PromptResponseType.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/enums/PromptResponseType.java
new file mode 100644
index 000000000..d85469590
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/enums/PromptResponseType.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.enums;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public enum PromptResponseType {
+
+ NONE,
+ /**
+ * Wait for the a response from the user confirming that they have started the debug ofp.
+ */
+ OFP_DEBUG_RESPONSE,
+ /**
+ * Pause script execution until a response is recieved from a client.
+ */
+ SCRIPT_PAUSE,
+ PASS_FAIL,
+ SCRIPT_STEP,
+ USER_INPUT,
+ YES_NO;
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/enums/ScriptTypeEnum.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/enums/ScriptTypeEnum.java
new file mode 100644
index 000000000..da2ae2b27
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/enums/ScriptTypeEnum.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.enums;
+
+import java.io.Serializable;
+
+public enum ScriptTypeEnum implements Serializable {
+
+ MSG_FUNCTIONAL,
+ UNIT_TEST,
+ FUNCTIONAL_TEST,
+ UNKNOWN,
+ INVALID;
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/enums/SkynetTestTypes.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/enums/SkynetTestTypes.java
new file mode 100644
index 000000000..91110f17e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/enums/SkynetTestTypes.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.enums;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class SkynetTestTypes {
+ public static final String EXECUTION_DATE = "Execution Date";
+ public static final String TEST_STATUS = "Test Status";
+ public static final String TEST_RUN = "Test Run";
+ public static final String EXEC5UTION_DATE = "Execution Date";
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/enums/SupportedScriptTypes.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/enums/SupportedScriptTypes.java
new file mode 100644
index 000000000..cadab6a80
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/enums/SupportedScriptTypes.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.enums;
+
+import java.io.Serializable;
+import java.util.EnumSet;
+
+public class SupportedScriptTypes implements Serializable {
+
+ private static final long serialVersionUID = 8403281090133318485L;
+ public EnumSet<ScriptTypeEnum> supportedClasses = EnumSet.noneOf(ScriptTypeEnum.class);
+
+ public void add(ScriptTypeEnum scriptType) {
+ supportedClasses.add(scriptType);
+ }
+
+ /*
+ * public HashSet<ScriptTypeEnum> getSupportedClasses(){ return supportedClasses; }
+ */
+
+ public boolean isSupported(ScriptTypeEnum type) {
+ return supportedClasses.contains(type);
+ }
+
+ public String getFormmatedString() {
+ return "Supported Script Types : " + supportedClasses + "\n";
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/AsynchRemoteJobs.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/AsynchRemoteJobs.java
new file mode 100644
index 000000000..20621c0f8
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/AsynchRemoteJobs.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment;
+
+import java.util.LinkedList;
+import java.util.WeakHashMap;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+public class AsynchRemoteJobs implements Runnable {
+
+ private final LinkedList<Runnable> jobs;
+ private static WeakHashMap<Object, AsynchRemoteJobs> map = new WeakHashMap<>();
+
+ public static AsynchRemoteJobs getInstance(Object obj) {
+ AsynchRemoteJobs asynchRemoteJobs = null;
+ asynchRemoteJobs = map.get(obj);
+ if (asynchRemoteJobs == null) {
+ asynchRemoteJobs = new AsynchRemoteJobs();
+ map.put(obj, asynchRemoteJobs);
+ }
+ return asynchRemoteJobs;
+ }
+
+ public AsynchRemoteJobs() {
+ jobs = new LinkedList<>();
+ Thread th = new Thread(this);
+ th.setName("AsynchRemoteJobs[Test Environment]");
+ th.start();
+ }
+
+ public void addJob(Runnable job) {
+ synchronized (jobs) {
+ jobs.addLast(job);
+ }
+ synchronized (this) {
+ this.notify();
+ }
+ }
+
+ @Override
+ public void run() {
+ while (true) {
+ while (jobs.size() > 0) {
+ Runnable run = null;
+ synchronized (jobs) {
+ run = jobs.removeFirst();
+ }
+ run.run();
+ }
+ try {
+ synchronized (this) {
+ this.wait();
+ }
+ } catch (InterruptedException e) {
+ OseeLog.log(TestEnvironment.class, Level.SEVERE, e);
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/BundleConfigurationReport.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/BundleConfigurationReport.java
new file mode 100644
index 000000000..0224f4918
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/BundleConfigurationReport.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment;
+
+import java.io.Serializable;
+import java.util.List;
+
+public class BundleConfigurationReport implements Serializable {
+ private static final long serialVersionUID = 2948282371713776849L;
+ private final List<BundleDescription> missing;
+ private final List<BundleDescription> versionMismatch;
+ private final List<BundleDescription> partOfInstallation;
+
+ public static long getSerialversionuid() {
+ return serialVersionUID;
+ }
+
+ public List<BundleDescription> getMissing() {
+ return missing;
+ }
+
+ public List<BundleDescription> getVersionMismatch() {
+ return versionMismatch;
+ }
+
+ public List<BundleDescription> getPartOfInstallation() {
+ return partOfInstallation;
+ }
+
+ public BundleConfigurationReport(List<BundleDescription> missing, List<BundleDescription> versionMismatch, List<BundleDescription> partOfInstallation) {
+ this.missing = missing;
+ this.partOfInstallation = partOfInstallation;
+ this.versionMismatch = versionMismatch;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/BundleDescription.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/BundleDescription.java
new file mode 100644
index 000000000..5fc37de69
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/BundleDescription.java
@@ -0,0 +1,134 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+import java.net.URL;
+import java.util.jar.Manifest;
+
+/**
+ * Describes the location where a bundle can be acquired from and provides the manifest of the bundle so that an
+ * educated decision can be made about whether a bundle is needed or not.
+ *
+ * @author Robert A. Fisher
+ */
+public class BundleDescription implements Serializable {
+ private static final long serialVersionUID = 546754001181908641L;
+
+ private final URL location;
+ private final boolean systemLibrary;
+ private final byte[] manifestData;
+ private final String md5Digest;
+ private transient Manifest manifest;
+
+ /**
+ * Deserialization constructor
+ */
+ protected BundleDescription() {
+ this.location = null;
+ this.manifestData = null;
+ this.manifest = null;
+ this.systemLibrary = false;
+ this.md5Digest = null;
+ }
+
+ public BundleDescription(URL systemLocation, URL serverLocation, Manifest manifest, boolean systemLibrary, String md5Digest) {
+ if (systemLocation == null) {
+ throw new IllegalArgumentException("systemLocation must not be null");
+ }
+ if (serverLocation == null) {
+ throw new IllegalArgumentException("serverLocation must not be null");
+ }
+ if (manifest == null) {
+ throw new IllegalArgumentException("manifest must not be null");
+ }
+ if (md5Digest == null) {
+ throw new IllegalArgumentException("md5Digest must not be null");
+ }
+
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ try {
+ manifest.write(out);
+ } catch (IOException ex) {
+ throw new IllegalStateException("ByteArrayOutputStream never should throw IOException", ex);
+ }
+
+ this.location = serverLocation;
+ this.manifestData = out.toByteArray();
+ this.systemLibrary = systemLibrary;
+ this.md5Digest = md5Digest;
+ }
+
+ public InputStream getBundleData() throws IOException {
+ return location.openConnection().getInputStream();
+ }
+
+ /**
+ * @return the manifestData
+ */
+ public Manifest getManifest() {
+ try {
+ if (manifest == null) {
+ manifest = new Manifest(new ByteArrayInputStream(manifestData));
+ }
+ return manifest;
+ } catch (IOException ex) {
+ throw new IllegalStateException("ByteArrayInputStream never should throw IOException", ex);
+ }
+ }
+
+ public String getSymbolicName() {
+ return getManifestEntry("Bundle-SymbolicName");
+ }
+
+ public String getVersion() {
+ return getManifestEntry("Bundle-Version");
+ }
+
+ private String getManifestEntry(String attribute) {
+ String entry = getManifest().getMainAttributes().getValue(attribute).trim();
+
+ // Sometimes there's a semicolon then extra info - ignore this
+ int index = entry.indexOf(';');
+ if (index != -1) {
+ entry = entry.substring(0, index);
+ }
+
+ return entry;
+ }
+
+ /**
+ * @return the systemLibrary
+ */
+ public boolean isSystemLibrary() {
+ return systemLibrary;
+ }
+
+ /**
+ * @return the md5Digest
+ */
+ public String getMd5Digest() {
+ return md5Digest;
+ }
+
+ public boolean isLocalFile() {
+ String protocol = location.getProtocol();
+ return protocol.equals("file");
+ }
+
+ public String getLocation() {
+ return location.toString();
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/BundleResolveException.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/BundleResolveException.java
new file mode 100644
index 000000000..cd2dea22d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/BundleResolveException.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment;
+
+import java.util.Collection;
+import org.eclipse.osee.framework.jdk.core.util.Collections;
+import org.osgi.framework.BundleException;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class BundleResolveException extends Exception {
+ private static final long serialVersionUID = 5506351677181297953L;
+ private final Collection<BundleException> bundleExceptions;
+
+ public BundleResolveException(String message, Collection<BundleException> bundleExceptions) {
+ super(message);
+ this.bundleExceptions = bundleExceptions;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+
+ builder.append(super.toString() + "\n");
+ builder.append(Collections.toString("\n", bundleExceptions));
+
+ return builder.toString();
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/ConsoleOutputJob.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/ConsoleOutputJob.java
new file mode 100644
index 000000000..7941fc10d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/ConsoleOutputJob.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment;
+
+import org.eclipse.osee.ote.core.IUserSession;
+
+public class ConsoleOutputJob implements Runnable {
+
+ private final IUserSession callback;
+ private final String message;
+
+ public ConsoleOutputJob(IUserSession callback, String message) {
+ this.callback = callback;
+ this.message = message;
+ }
+
+ @Override
+ public void run() {
+ try {
+ callback.initiateInformationalPrompt(message);
+ } catch (Throwable e) {
+ System.out.println(message);
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/EnvironmentTask.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/EnvironmentTask.java
new file mode 100644
index 000000000..7c433f6fe
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/EnvironmentTask.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment;
+
+import java.util.TimerTask;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.jdk.core.util.benchmark.Benchmark;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.GCHelper;
+import org.eclipse.osee.ote.core.TestException;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public abstract class EnvironmentTask {
+ public static final double cycleResolution = 300.0;
+ private final double hzRate;
+ private final int phase;
+ private final int runEveryNcycles;
+ private boolean running;
+ private TimerTask timerTask;
+
+ private double averateRate;
+
+ private final Benchmark bm;
+
+ public EnvironmentTask(double hzRate) {
+ this(hzRate, 0);
+ }
+
+ public EnvironmentTask(double hzRate, int phase) {
+ this.hzRate = hzRate;
+ this.running = true;
+ this.phase = phase;
+ runEveryNcycles = (int) Math.round(cycleResolution / hzRate);
+ bm = new Benchmark(getClass().getName(), (long) (1000000.0 / hzRate));
+ GCHelper.getGCHelper().addRefWatch(this);
+ }
+
+ public EnvironmentTask(double hzRate, TestEnvironment environment) {
+ this(hzRate);
+ environment.addTask(this);
+ }
+
+ public void baseRunOneCycle(int cycleCount) throws TestException {
+ if (cycleCount == -1 || cycleCount % runEveryNcycles == phase && running) { // if my turn
+
+ bm.samplePoint();
+ try {
+ runOneCycle();
+ } catch (InterruptedException e) {
+ OseeLog.log(TestEnvironment.class, Level.SEVERE, e);
+ }
+
+ }
+ }
+
+ public void cancel() {
+ if (timerTask != null) {
+ timerTask.cancel();
+ }
+ }
+
+ public void disable() {
+ this.running = false;
+ }
+
+ public void enable() {
+ this.running = true;
+ }
+
+ /** Gets the hzRate. */
+ public double getHzRate() {
+ return hzRate;
+ }
+
+ public boolean isRunning() {
+ return this.running;
+ }
+
+ public abstract void runOneCycle() throws InterruptedException, TestException;
+
+ public void setTimerTask(TimerTask timerTask) {
+ this.timerTask = timerTask;
+ }
+
+ public double getAverateRate() {
+ return averateRate;
+ }
+
+ @Override
+ public String toString() {
+ return this.getClass().getName() + "{ Task: " + hzRate + "Hz, Phase " + phase + ", running=" + (running ? "true" : "false") + " }";
+
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/IScriptCompleteEvent.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/IScriptCompleteEvent.java
new file mode 100644
index 000000000..c699bd2ce
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/IScriptCompleteEvent.java
@@ -0,0 +1,18 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IScriptCompleteEvent {
+ void scriptComplete();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/IScriptSetupEvent.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/IScriptSetupEvent.java
new file mode 100644
index 000000000..e24594f02
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/IScriptSetupEvent.java
@@ -0,0 +1,18 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IScriptSetupEvent {
+ void scriptSetup();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/OteLogFile.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/OteLogFile.java
new file mode 100644
index 000000000..784b9f5e0
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/OteLogFile.java
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.eclipse.osee.framework.logging.ILoggerListener;
+
+public class OteLogFile implements ILoggerListener {
+
+ public Set<Logger> initializedLoggers;
+ private final FileOutputStream fos;
+ private final StringBuilder sb;
+ private final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
+
+ public OteLogFile(File file) throws FileNotFoundException {
+ fos = new FileOutputStream(file);
+ sb = new StringBuilder();
+ }
+
+ @Override
+ public synchronized void log(String loggerName, Level level, String message, Throwable th) {
+ try {
+ sb.append(String.format("<record name=\"%s\" level=\"%s\" >\n", loggerName, level.getName()));
+ sb.append("<Time>");
+ sb.append(sdf.format(new Date()));
+ sb.append("</Time>\n");
+ sb.append("<message>\n");
+ sb.append(message);
+ sb.append("\n");
+ sb.append("</message>\n");
+ if (th != null) {
+ sb.append("<stacktrace>");
+ writeStackTrace(sb, th);
+ sb.append("</stacktrace>\n");
+ }
+ sb.append("</record>\n");
+ fos.write(sb.toString().getBytes());
+ fos.flush();
+ sb.setLength(0);
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ private void writeStackTrace(StringBuilder sb, Throwable th) {
+ while (th != null) {
+ sb.append(th.getMessage());
+ sb.append("\n");
+ for (StackTraceElement el : th.getStackTrace()) {
+ sb.append(el.toString());
+ sb.append("\n");
+ }
+ th = th.getCause();
+ }
+ }
+
+ @Override
+ protected void finalize() throws Throwable {
+ fos.close();
+ super.finalize();
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/ReportDataControl.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/ReportDataControl.java
new file mode 100644
index 000000000..53b4c3efa
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/ReportDataControl.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment;
+
+import java.rmi.RemoteException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.jdk.core.reportdata.ReportData;
+import org.eclipse.osee.framework.jdk.core.reportdata.ReportDataListener;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.environment.command.TestEnvironmentCommand;
+import org.eclipse.osee.ote.core.environment.interfaces.IReportData;
+
+public class ReportDataControl implements IReportData {
+ private final ReportData queueData;
+ // private ArrayList<ReportDataListener> queueListeners;
+ private final ArrayList<ReportDataListener> queueListeners;
+
+ public ReportDataControl() {
+ this.queueListeners = new ArrayList<>();
+ ArrayList<String> queueHeaders = new ArrayList<>();
+ queueHeaders.add("User");
+ queueHeaders.add("Script");
+ this.queueData = new ReportData(queueHeaders);
+ }
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public void addQueueListener(ReportDataListener listener, List cmds) {
+ queueListeners.add(listener);
+ updateQueueData(cmds);
+ try {
+ listener.updateData(queueData);
+ } catch (RemoteException e) {
+ OseeLog.log(TestEnvironment.class, Level.SEVERE, e);
+ }
+ }
+
+ @Override
+ public void removeQueueListener(ReportDataListener listener) {
+ queueListeners.remove(listener);
+ }
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public void updateQueueListeners(List cmds) {
+ updateQueueData(cmds);
+ for (int i = 0; i < queueListeners.size(); i++) {
+ try {
+ queueListeners.get(i).updateData(queueData);
+ } catch (RemoteException e) {
+ OseeLog.log(TestEnvironment.class, Level.SEVERE, e);
+ }
+ }
+ }
+
+ private void updateQueueData(List<TestEnvironmentCommand> cmds) {
+ queueData.clearItems();
+ ArrayList<String> values;
+ for (int i = 0; i < cmds.size(); i++) {
+ TestEnvironmentCommand cmd = cmds.get(i);
+ values = new ArrayList<>();
+ values.add(cmd.getDescription().getDescription());
+ queueData.addItem(cmd.getDescription().getGuid(), values);
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/ScriptControl.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/ScriptControl.java
new file mode 100644
index 000000000..1a6bbe272
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/ScriptControl.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment;
+
+import org.eclipse.osee.ote.core.environment.interfaces.IScriptControl;
+
+public class ScriptControl implements IScriptControl {
+
+ protected boolean isOfpPaused = false;
+ protected boolean isScriptPaused = false;
+ protected boolean isScriptReady = false;
+
+ public ScriptControl() {
+ }
+
+ @Override
+ public boolean isLocked() {
+ return false;
+ }
+
+ @Override
+ public boolean isExecutionUnitPaused() {
+ return isOfpPaused;
+ }
+
+ @Override
+ public boolean isScriptPaused() {
+ return isScriptPaused;
+ }
+
+ @Override
+ public boolean isScriptReady() {
+ return isScriptReady;
+ }
+
+ @Override
+ public void lock() {
+ }
+
+ @Override
+ public void setExecutionUnitPause(boolean pause) {
+ isOfpPaused = pause;
+ }
+
+ @Override
+ public void setScriptPause(boolean pause) {
+ isScriptPaused = pause;
+ }
+
+ @Override
+ public void setScriptReady(boolean ready) {
+ isScriptReady = ready;
+ }
+
+ @Override
+ public boolean shouldStep() {
+ return isScriptPaused() && !isExecutionUnitPaused();
+ }
+
+ @Override
+ public void unlock() {
+ }
+
+ @Override
+ public boolean hasLock() {
+ return false;
+ }
+
+ @Override
+ public boolean isHeldByCurrentThread() {
+ return false;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestEnvironment.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestEnvironment.java
new file mode 100644
index 000000000..2d68ba222
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestEnvironment.java
@@ -0,0 +1,594 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.InetAddress;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.net.UnknownHostException;
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import java.rmi.server.ExportException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
+
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.connection.service.LocalConnector;
+import org.eclipse.osee.framework.jdk.core.reportdata.ReportDataListener;
+import org.eclipse.osee.framework.jdk.core.util.EnhancedProperties;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.OseeLogStatusCallback;
+import org.eclipse.osee.ote.core.GCHelper;
+import org.eclipse.osee.ote.core.OseeTestThread;
+import org.eclipse.osee.ote.core.OteProperties;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.environment.interfaces.IAssociatedObjectListener;
+import org.eclipse.osee.ote.core.environment.interfaces.ICancelTimer;
+import org.eclipse.osee.ote.core.environment.interfaces.IEnvironmentFactory;
+import org.eclipse.osee.ote.core.environment.interfaces.IExecutionUnitManagement;
+import org.eclipse.osee.ote.core.environment.interfaces.IRuntimeLibraryManager;
+import org.eclipse.osee.ote.core.environment.interfaces.IScriptControl;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentListener;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestLogger;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestStation;
+import org.eclipse.osee.ote.core.environment.interfaces.ITimeout;
+import org.eclipse.osee.ote.core.environment.interfaces.ITimerControl;
+import org.eclipse.osee.ote.core.framework.IRunManager;
+import org.eclipse.osee.ote.core.framework.command.ICommandHandle;
+import org.eclipse.osee.ote.core.framework.command.ITestContext;
+import org.eclipse.osee.ote.core.framework.command.ITestServerCommand;
+import org.eclipse.osee.ote.core.internal.Activator;
+import org.eclipse.osee.ote.properties.OtePropertiesCore;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.util.tracker.ServiceTracker;
+import org.osgi.util.tracker.ServiceTrackerCustomizer;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public abstract class TestEnvironment implements TestEnvironmentInterface, ITestEnvironmentAccessor, ITestContext {
+
+ private final List<ITestEnvironmentListener> envListeners = new ArrayList<>(32);
+ private IExecutionUnitManagement executionUnitManagement;
+
+ private File outDir = null;
+ private final ITestStation testStation;
+ private boolean batchMode = false;
+ private final HashMap<String, Remote> controlInterfaces = new HashMap<>();
+ private final IEnvironmentFactory factory;
+ private IServiceConnector connector;
+ private final IRuntimeLibraryManager runtimeManager;
+
+ @Deprecated
+ private final HashMap<Class<?>, Object> associatedObjects;
+ @Deprecated
+ private final HashMap<Class<?>, ArrayList<IAssociatedObjectListener>> associatedObjectListeners;
+ @Deprecated
+ private boolean isEnvSetup = false;
+ @Deprecated
+ private final List<IScriptCompleteEvent> scriptCompleteListeners = new ArrayList<>();
+ @Deprecated
+ private final List<IScriptSetupEvent> scriptSetupListeners = new ArrayList<>();
+
+// private OteServerSideEndprointRecieve oteServerSideEndpointRecieve;
+// private OteServerSideEndpointSender oteServerSideEndpointSender;
+// private final ServiceTracker messagingServiceTracker;
+
+ private volatile boolean isShutdown = false;
+// private NodeInfo oteEmbeddedBroker;
+ private ServiceRegistration<TestEnvironmentInterface> myRegistration;
+
+ protected TestEnvironment(IEnvironmentFactory factory) {
+ GCHelper.getGCHelper().addRefWatch(this);
+// try {
+// oteEmbeddedBroker = new NodeInfo("OTEEmbeddedBroker", new URI("vm://localhost?broker.persistent=false"));
+// } catch (URISyntaxException ex) {
+// OseeLog.log(TestEnvironment.class, Level.SEVERE, ex);
+// }
+ this.factory = factory;
+ this.testStation = factory.getTestStation();
+ this.runtimeManager = factory.getRuntimeManager();
+
+ this.associatedObjectListeners = new HashMap<>();
+ this.associatedObjects = new HashMap<>(100);
+ this.batchMode = OteProperties.isOseeOteInBatchModeEnabled();
+
+// messagingServiceTracker = setupOteMessagingSenderAndReceiver();
+ }
+
+ public void init(IServiceConnector connector) {
+ this.connector = connector;
+ }
+
+ private void setupDefaultConnector() {
+ EnhancedProperties props = new EnhancedProperties();
+ try {
+ props.setProperty("station", InetAddress.getLocalHost().getHostName());
+ } catch (UnknownHostException ex) {
+ OseeLog.log(TestEnvironment.class, Level.SEVERE, ex);
+ }
+ props.setProperty("date", new Date());
+ props.setProperty("group", "OSEE Test Environment");
+ props.setProperty("owner", OtePropertiesCore.userName.getValue());
+ connector = new LocalConnector(this, Integer.toString(this.getUniqueId()), props);
+ }
+
+// private ServiceTracker setupOteMessagingSenderAndReceiver() {
+// oteServerSideEndpointRecieve = new OteServerSideEndprointRecieve();
+// oteServerSideEndpointSender = new OteServerSideEndpointSender(this);
+// BundleContext context = Platform.getBundle("org.eclipse.osee.ote.core").getBundleContext();
+// return getServiceTracker(MessagingGateway.class.getName(), new OteEnvironmentTrackerCustomizer(context,
+// oteServerSideEndpointRecieve, oteServerSideEndpointSender,
+// OteServerSideEndpointSender.OTE_SERVER_SIDE_SEND_PROTOCOL));
+// }
+//
+// public void sendMessageToServer(Message message) {
+// oteServerSideEndpointRecieve.recievedMessage(message);
+// }
+
+ public ServiceTracker getServiceTracker(String clazz, ServiceTrackerCustomizer customizer) {
+ return Activator.getInstance().getServiceTracker(clazz, customizer);
+ }
+
+ @Override
+ public ServiceTracker getServiceTracker(String clazz) {
+ return getServiceTracker(clazz, null);
+ }
+
+ @Override
+ public ICommandHandle addCommand(ITestServerCommand cmd) throws ExportException {
+ return factory.getCommandManager().addCommand(cmd, this);
+ }
+
+ @Override
+ public IRunManager getRunManager() {
+ return factory.getRunManager();
+ }
+
+ @Override
+ public IRuntimeLibraryManager getRuntimeManager() {
+ return this.runtimeManager;
+ }
+
+ @Override
+ public IEnvironmentFactory getEnvironmentFactory() {
+ return factory;
+ }
+
+ @Override
+ public boolean isInBatchMode() {
+ return batchMode;
+ }
+
+ @Override
+ public void setBatchMode(boolean isInBatchMode) {
+ if (!OteProperties.isOseeOteInBatchModeEnabled()) {
+ this.batchMode = isInBatchMode;
+ }
+ }
+
+ @Override
+ public void addEnvironmentListener(ITestEnvironmentListener listener) {
+ envListeners.add(listener);
+ }
+
+ @Override
+ public boolean addTask(EnvironmentTask task) {
+ factory.getTimerControl().addTask(task, this);
+ return true;
+ }
+
+ public boolean equals(ITestEnvironment testEnvironment) throws RemoteException {
+ if (testEnvironment.getUniqueId() == getUniqueId()) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public long getEnvTime() {
+ return getTimerCtrl().getEnvTime();
+ }
+
+ @Override
+ public IExecutionUnitManagement getExecutionUnitManagement() {
+ return this.executionUnitManagement;
+ }
+
+ @Override
+ public ITestLogger getLogger() {
+ return factory.getTestLogger();
+ }
+
+ @Override
+ public List<String> getQueueLabels() {
+ List<String> list = new ArrayList<>();
+ list.add("Description");
+ return list;
+ }
+
+ @Override
+ public abstract Object getModel(String modelClassName);
+
+ @Override
+ public IScriptControl getScriptCtrl() {
+ return factory.getScriptControl();
+ }
+
+ @Override
+ public byte[] getScriptOutfile(String filepath) throws RemoteException {
+ try {
+ File file = new File(filepath);
+ InputStream is = new FileInputStream(file);
+ long length = file.length();
+ byte[] bytes = new byte[(int) length];
+
+ int numRead = is.read(bytes);
+ if (numRead < bytes.length) {
+ throw new IOException("Could not completely read file " + file.getName());
+ }
+ is.close();
+ OseeLog.log(TestEnvironment.class, Level.FINE, "going to send " + bytes.length + " bytes to the client");
+
+ return bytes;
+ } catch (Exception ex) {
+ throw new RemoteException("Error retrieving the script output", ex);
+ }
+ }
+
+ @Override
+ public ITestStation getTestStation() {
+ return testStation;
+ }
+
+ @Override
+ public ITimerControl getTimerCtrl() {
+ return factory.getTimerControl();
+ }
+
+ @Override
+ public int getUniqueId() {
+ return this.hashCode();
+ }
+
+ private final void removeAllTasks() {
+ factory.getTimerControl().cancelAllTasks();
+ }
+
+ @Override
+ public URL setBatchLibJar(byte[] batchJar) throws IOException {
+ String path = OtePropertiesCore.userHome.getValue() + File.separator + TestEnvironment.class.getName();
+
+ File dir = new File(path, "batchLibCache");
+ if (!dir.isDirectory()) {
+ dir.mkdir();
+ }
+ File jar = File.createTempFile("Batch", ".jar", dir);
+ Lib.writeBytesToFile(batchJar, jar);
+ return jar.toURI().toURL();
+ }
+
+ @Override
+ public ICancelTimer setTimerFor(ITimeout listener, int time) {
+ return getTimerCtrl().setTimerFor(listener, time);
+ }
+
+ @Override
+ public void setupOutfileDir(String outfileDir) throws IOException {
+ if (Strings.isValid(outfileDir)) {
+ outDir = new File(outfileDir);
+ if (!outDir.isDirectory()) {
+ if (!outDir.mkdirs()) {
+ throw new IOException("Failed to create the output directory");
+ }
+ OseeLog.logf(TestEnvironment.class, Level.INFO,
+ "Outfile Dir [%s] created.", outDir.getAbsolutePath());
+ } else {
+ OseeLog.logf(TestEnvironment.class, Level.FINE,
+ "Outfile Dir [%s] exists.", outDir.getAbsolutePath());
+ }
+ } else {
+ throw new IOException("A valid outfile directory must be specified.");
+ }
+ }
+
+ @Override
+ public void shutdown() {
+ if (isShutdown) {
+ return;
+ }
+ isShutdown = true;
+ runtimeManager.uninstall(new OseeLogStatusCallback());
+ Activator.getInstance().unregisterTestEnvironment();
+ // here we remove all environment tasks (emulators)
+ removeAllTasks();
+ if (associatedObjects != null) {
+ this.associatedObjects.clear();// get rid of all models and support
+ }
+
+// messagingServiceTracker.close();
+
+ OseeLog.log(TestEnvironment.class, Level.FINE, "shutting down environment");
+ factory.getTimerControl().cancelTimers();
+ stop();
+ cleanupClassReferences();
+ OseeTestThread.clearThreadReferences();
+ for (ITestEnvironmentListener listener : envListeners) {
+ try {
+ listener.onEnvironmentKilled(this);
+ } catch (Exception e) {
+ OseeLog.log(TestEnvironment.class, Level.SEVERE, "exception during listener notification", e);
+ }
+ }
+ envListeners.clear();
+ if (getRunManager() != null) {
+ getRunManager().clearAllListeners();
+ }
+ }
+
+ protected abstract void loadExternalDrivers();
+
+ public void startup(String outfileDir) throws Exception {
+ try {
+ setupOutfileDir(outfileDir);
+ } catch (IOException ex) {
+ throw new Exception("Error in directory setup. " + outfileDir, ex);
+ }
+ if(myRegistration != null){
+ myRegistration.unregister();
+ }
+ myRegistration = FrameworkUtil.getBundle(getClass()).getBundleContext().registerService(TestEnvironmentInterface.class, this, null);
+ }
+
+ protected void stop() {
+ try{
+ myRegistration.unregister();
+ } catch (IllegalStateException ex){
+ //ignore if it's already unregistered
+ }
+ }
+
+ protected void cleanupClassReferences() {
+ OseeLog.log(TestEnvironment.class, Level.FINE, "cleanupreferences");
+
+ System.out.println("Associated objects that are getting cleaned up.");
+ for (Class<?> clazz : associatedObjects.keySet()) {
+ System.out.println(clazz.toString());
+ }
+
+ if (associatedObjects != null) {
+ associatedObjects.clear();
+ }
+ OseeLog.log(TestEnvironment.class, Level.FINE, "got the other PM REF");
+ if (associatedObjectListeners != null) {
+ associatedObjectListeners.clear();
+ }
+ GCHelper.getGCHelper().printLiveReferences();
+ }
+
+ public void setExecutionUnitManagement(IExecutionUnitManagement executionUnitManagement) {
+ this.executionUnitManagement = executionUnitManagement;
+ }
+
+ @Override
+ public File getOutDir() {
+ return outDir;
+ }
+
+ @Override
+ public Remote getControlInterface(String id) {
+ return controlInterfaces.get(id);
+ }
+
+ @Override
+ public void registerControlInterface(String id, Remote controlInterface) {
+ controlInterfaces.put(id, controlInterface);
+ }
+
+ @Override
+ public IServiceConnector getConnector() {
+ return connector;
+ }
+
+ @Deprecated
+ public void setEnvSetup(boolean isEnvSetup) {
+ this.isEnvSetup = isEnvSetup;
+ }
+
+ @Deprecated
+ public void addScriptCompleteListener(IScriptCompleteEvent scriptComplete) {
+ this.scriptCompleteListeners.add(scriptComplete);
+ }
+
+ @Deprecated
+ public void removeScriptCompleteListener(IScriptCompleteEvent scriptComplete) {
+ this.scriptCompleteListeners.remove(scriptComplete);
+ }
+
+ @Deprecated
+ public void addScriptSetupListener(IScriptSetupEvent scriptSetup) {
+ this.scriptSetupListeners.add(scriptSetup);
+ }
+
+ @Deprecated
+ public void removeScriptSetupListener(IScriptSetupEvent scriptSetup) {
+ this.scriptSetupListeners.remove(scriptSetup);
+ }
+
+ @Deprecated
+ protected boolean isEnvSetup() {
+ return isEnvSetup;
+ }
+
+ @Deprecated
+ /**
+ * alerts the environment of an exception. The environment will take any necessary actions and alert any interested
+ * entities of the problem. Any runing test script will be terminated
+ *
+ */
+ public void handleException(Throwable t, Level logLevel) {
+ handleException(t, "An exception has occurred in the environment", logLevel, true);
+ }
+
+ @Deprecated
+ /**
+ * @param abortScript true will cause the currently running script to abort
+ */
+ public void handleException(Throwable t, Level logLevel, boolean abortScript) {
+ handleException(t, "An exception has occurred in the environment", logLevel, abortScript);
+ }
+
+ @Deprecated
+ /**
+ * alerts the environment of an exception. The environment will take any necessary actions and alert any interested
+ * entities of the problem
+ *
+ * @param t the exception
+ * @param logLevel the severity of the exception. Specifing a Level.OFF will
+ * @param abortScript cause the exception to not be logged
+ */
+ public void handleException(Throwable t, String message, Level logLevel, boolean abortScript) {
+ if (logLevel != Level.OFF) {
+ OseeLog.log(TestEnvironment.class, logLevel, message, t);
+ }
+ if (getTestScript() != null && abortScript) {
+ getTestScript().abortDueToThrowable(t);
+ }
+ Iterator<ITestEnvironmentListener> iter = envListeners.iterator();
+ while (iter.hasNext()) {
+ final ITestEnvironmentListener listener = iter.next();
+ listener.onException(message, t);
+ }
+ }
+
+ @Deprecated
+ public void testEnvironmentCommandComplete(ICommandHandle handle) {
+ for (ITestEnvironmentListener listener : envListeners) {
+ try {
+ listener.onTestServerCommandFinished(this, handle);
+ } catch (Throwable th) {
+ System.out.println(listener.getClass().getName());
+ th.printStackTrace();
+ }
+ }
+ }
+
+ @Override
+ @Deprecated
+ /**
+ * marks the script as ready as well as clears any objects that are associated with the environment.
+ */
+ public synchronized void onScriptSetup() {
+
+ for (IScriptSetupEvent listeners : scriptSetupListeners) {
+ listeners.scriptSetup();
+ }
+
+ this.associatedObjects.clear();
+ }
+
+ @Deprecated
+ public void removeQueueListener(ReportDataListener listener) throws RemoteException {
+ factory.getReportDataControl().removeQueueListener(listener);
+ }
+
+ @Override
+ @Deprecated
+ public void onScriptComplete() throws InterruptedException {
+ factory.getScriptControl().setScriptReady(false);
+
+ for (int i = 0; i < scriptCompleteListeners.size(); i++) {
+ try {
+ scriptCompleteListeners.get(i).scriptComplete();
+ } catch (Exception e) {
+ OseeLog.log(TestEnvironment.class, Level.SEVERE, "problem with script complete listener", e);
+ }
+ }
+
+ // here we remove all environment tasks (emulators)
+ if (associatedObjects != null) {
+ this.associatedObjects.clear();// get rid of all models and support
+ }
+ }
+
+ @Override
+ @Deprecated
+ public void associateObject(Class<?> c, Object obj) {
+ associatedObjects.put(c, obj);
+ ArrayList<IAssociatedObjectListener> listeners = this.associatedObjectListeners.get(c);
+ if (listeners != null) {
+ for (int i = 0; i < listeners.size(); i++) {
+ try {
+ listeners.get(i).updateAssociatedListener();
+ } catch (RemoteException e) {
+ OseeLog.log(TestEnvironment.class, Level.SEVERE, e.getMessage(), e);
+ }
+
+ }
+ }
+ }
+
+ @Override
+ @Deprecated
+ public Object getAssociatedObject(Class<?> c) {
+ return associatedObjects.get(c);
+ }
+
+ @Override
+ @Deprecated
+ public Set<Class<?>> getAssociatedObjects() {
+ return associatedObjects.keySet();
+ }
+
+ @Override
+ @Deprecated
+ /**
+ * Use getRunManager().getCurrentScript() instead of this method.
+ */
+ public TestScript getTestScript() {
+ return getRunManager().getCurrentScript();
+ }
+
+ @Override
+ @Deprecated
+ public void abortTestScript() {
+ getRunManager().abort();
+ }
+
+ @Override
+ @Deprecated
+ public void abortTestScript(Throwable t) {
+ getRunManager().abort(t, false);
+ }
+
+// public void setOteNodeInfo(NodeInfo oteEmbeddedBroker) {
+// this.oteEmbeddedBroker = oteEmbeddedBroker;
+// }
+//
+// public NodeInfo getOteNodeInfo() {
+// return oteEmbeddedBroker;
+// }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestEnvironmentConfig.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestEnvironmentConfig.java
new file mode 100644
index 000000000..bc40c53bf
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestEnvironmentConfig.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment;
+
+import java.io.Serializable;
+import java.util.Map;
+
+public class TestEnvironmentConfig implements Serializable {
+ private static final long serialVersionUID = -382800417464413074L;
+ private Map<String, String> envVars;
+ private String CLEARCASE_VIEW;
+ private String[] jarVersions;
+
+ public TestEnvironmentConfig(String[] jarVersions) {
+ this.jarVersions = jarVersions;
+ }
+
+ public TestEnvironmentConfig(Map<String, String> envVars, String CLEARCASE_VIEW) {
+ this.CLEARCASE_VIEW = CLEARCASE_VIEW;
+ this.envVars = envVars;
+ }
+
+ public Map<String, String> getLibrarySearchPath() {
+ return envVars;
+ }
+
+ public String getClearCaseView() {
+ return CLEARCASE_VIEW;
+ }
+
+ /**
+ * @return the jarVersions
+ */
+ public String[] getJarVersions() {
+ return jarVersions;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestEnvironmentInterface.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestEnvironmentInterface.java
new file mode 100644
index 000000000..36897fbd2
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestEnvironmentInterface.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import java.rmi.server.ExportException;
+import java.util.List;
+
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.ote.core.environment.interfaces.ICancelTimer;
+import org.eclipse.osee.ote.core.environment.interfaces.IEnvironmentFactory;
+import org.eclipse.osee.ote.core.environment.interfaces.IExecutionUnitManagement;
+import org.eclipse.osee.ote.core.environment.interfaces.IRuntimeLibraryManager;
+import org.eclipse.osee.ote.core.environment.interfaces.IScriptControl;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentListener;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestLogger;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestStation;
+import org.eclipse.osee.ote.core.environment.interfaces.ITimeout;
+import org.eclipse.osee.ote.core.environment.interfaces.ITimerControl;
+import org.eclipse.osee.ote.core.framework.IRunManager;
+import org.eclipse.osee.ote.core.framework.command.ICommandHandle;
+import org.eclipse.osee.ote.core.framework.command.ITestServerCommand;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface TestEnvironmentInterface {
+ public ServiceTracker getServiceTracker(String clazz);
+
+ public ICommandHandle addCommand(ITestServerCommand cmd) throws ExportException;
+
+ public IRunManager getRunManager();
+
+ public IRuntimeLibraryManager getRuntimeManager();
+
+ public boolean isInBatchMode();
+
+ public void setBatchMode(boolean isInBatchMode);
+
+ public void addEnvironmentListener(ITestEnvironmentListener listener);
+
+ public boolean addTask(EnvironmentTask task);
+
+ public long getEnvTime();
+
+ public IExecutionUnitManagement getExecutionUnitManagement();
+
+ public ITestLogger getLogger();
+
+ public List<String> getQueueLabels();
+
+ public abstract Object getModel(String modelClassName);
+
+ public IScriptControl getScriptCtrl();
+
+ public byte[] getScriptOutfile(String filepath) throws RemoteException;
+
+ public ITestStation getTestStation();
+
+ public ITimerControl getTimerCtrl();
+
+ public int getUniqueId();
+
+ public URL setBatchLibJar(byte[] batchJar) throws IOException;
+
+ public ICancelTimer setTimerFor(ITimeout listener, int time);
+
+ public void shutdown();
+
+ public File getOutDir();
+
+ public Remote getControlInterface(String id);
+
+ public void registerControlInterface(String id, Remote controlInterface);
+
+ public IServiceConnector getConnector();
+
+ public IEnvironmentFactory getEnvironmentFactory();
+
+ void setupOutfileDir(String outfileDir) throws IOException;
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestEnvironmentLogFilter.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestEnvironmentLogFilter.java
new file mode 100644
index 000000000..2473861d0
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestEnvironmentLogFilter.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment;
+
+import java.util.logging.Level;
+import java.util.regex.Pattern;
+
+import org.eclipse.osee.framework.logging.ILoggerFilter;
+import org.eclipse.osee.ote.properties.OtePropertiesCore;
+
+public class TestEnvironmentLogFilter implements ILoggerFilter {
+ private static Level level;
+ static {
+ level = Level.parse(System.getProperty("ote.testenv.filter.level", "INFO"));
+ }
+
+ @Override
+ public Pattern bundleId() {
+ return null;
+ }
+
+ @Override
+ public Level getLoggerLevel() {
+ return level;
+ }
+
+ @Override
+ public Pattern name() {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestServerMode.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestServerMode.java
new file mode 100644
index 000000000..e68c6f386
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TestServerMode.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment;
+
+import javax.print.attribute.EnumSyntax;
+import org.eclipse.osee.framework.jdk.core.util.EnumBase;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class TestServerMode extends EnumBase {
+ private static final long serialVersionUID = 6600576749632500352L;
+ public static final TestServerMode MULTI = new TestServerMode(0);
+ public static final TestServerMode SINGLE = new TestServerMode(1);
+ private static final String[] stringTable = new String[] {"multi", "single"};
+ private static final TestServerMode[] enumValueTable = new TestServerMode[] {MULTI, SINGLE};
+
+ private TestServerMode(int value) {
+ super(value);
+ }
+
+ public static TestServerMode toEnum(String str) {
+ return (TestServerMode) getEnum(str, stringTable, enumValueTable);
+ }
+
+ protected static TestServerMode toEnum(int value) {
+ return (TestServerMode) getEnum(value, enumValueTable);
+ }
+
+ @Override
+ protected String[] getStringTable() {
+ return stringTable;
+ }
+
+ @Override
+ protected EnumSyntax[] getEnumValueTable() {
+ return enumValueTable;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TimerControl.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TimerControl.java
new file mode 100644
index 000000000..7d76924a5
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/TimerControl.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment;
+
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.osee.ote.core.environment.interfaces.BasicTimeout;
+import org.eclipse.osee.ote.core.environment.interfaces.ITimeout;
+import org.eclipse.osee.ote.core.environment.interfaces.ITimerControl;
+import org.eclipse.osee.ote.core.framework.IRunManager;
+
+public abstract class TimerControl implements ITimerControl {
+
+ private final ScheduledExecutorService executor;
+ private IRunManager runManager;
+
+
+ public TimerControl(int maxTimers) {
+ executor = Executors.newScheduledThreadPool(maxTimers);
+ }
+
+ @Override
+ public void cancelTimers() {
+ executor.shutdown();
+ }
+
+ public ScheduledFuture<?> schedulePeriodicTask(Runnable task, long initialDelay, long period) {
+ return executor.scheduleAtFixedRate(task, initialDelay, period, TimeUnit.MILLISECONDS);
+ }
+
+ public ScheduledFuture<?> scheduleOneShotTask(Runnable task, long delay) {
+ return executor.schedule(task, delay, TimeUnit.MILLISECONDS);
+ }
+
+ @Override
+ public void envWait(int milliseconds) throws InterruptedException {
+ envWait(new BasicTimeout(), milliseconds);
+ }
+
+ @Override
+ public void envWait(ITimeout obj, int milliseconds) throws InterruptedException {
+ synchronized (obj) {
+ setTimerFor(obj, milliseconds);
+ obj.wait();
+ }
+ }
+
+ @Override
+ public void setRunManager(IRunManager runManager) {
+ this.runManager = runManager;
+ }
+
+ @Override
+ public IRunManager getRunManager() {
+ return runManager;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/command/CommandDescription.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/command/CommandDescription.java
new file mode 100644
index 000000000..89900f7f8
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/command/CommandDescription.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.command;
+
+import java.io.Serializable;
+import org.eclipse.osee.framework.jdk.core.util.GUID;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class CommandDescription implements Serializable {
+ private static final long serialVersionUID = 538355585678229304L;
+ protected final String guid;
+ protected final String description;
+
+ /**
+ * CommandDescription Constructor. Sets the command's description.
+ */
+ public CommandDescription(String description) {
+ super();
+ this.guid = GUID.create();
+ this.description = description;
+ }
+
+ /**
+ * @return Returns the description.
+ */
+ public String getDescription() {
+ return description;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+
+ if (obj instanceof GUID) {
+ return guid.equals(obj);
+ } else if (obj instanceof CommandDescription) {
+ return guid.equals(((CommandDescription) obj).guid);
+ }
+
+ return false;
+ }
+
+ /**
+ * @return Returns the guid.
+ */
+ public String getGuid() {
+ return guid;
+ }
+
+ @Override
+ public String toString() {
+ return "GUID: " + guid + "\n" + "Desc: " + description;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/command/RunTestScriptDescription.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/command/RunTestScriptDescription.java
new file mode 100644
index 000000000..50eb0bd95
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/command/RunTestScriptDescription.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.command;
+
+import java.util.logging.Level;
+import org.eclipse.osee.ote.core.environment.config.ScriptVersionConfig;
+import org.eclipse.osee.ote.core.environment.config.TesterConfig;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class RunTestScriptDescription extends CommandDescription {
+
+ private static final long serialVersionUID = 8824248434175577382L;
+ private String clientOutfilePath;
+ private String serverOutfilePath;
+ private ScriptVersionConfig scriptVersion;
+ private final TesterConfig testerConfig;
+ private Level logLevel;
+
+ public RunTestScriptDescription(String description, String clientOutfilePath, ScriptVersionConfig scriptVersion, Level logLevel) {
+ super(description);
+ this.clientOutfilePath = clientOutfilePath;
+ this.scriptVersion = scriptVersion;
+ this.testerConfig = new TesterConfig();
+ this.logLevel = logLevel;
+ if (this.logLevel == null) {
+ this.logLevel = Level.ALL;
+ }
+ /*
+ * if(user != null){ testerConfig.setEmail(user.getEmail()); testerConfig.setName(user.getName());
+ * testerConfig.setId(user.getId()); }
+ */
+ }
+
+ public RunTestScriptDescription(String description, String clientOutfilePath, ScriptVersionConfig scriptVersion) {
+ this(description, clientOutfilePath, scriptVersion, Level.WARNING);
+ }
+
+ /**
+ * @return Returns the outfile.
+ */
+ public String getClientOutfilePath() {
+ return clientOutfilePath;
+ }
+
+ /**
+ * @return Returns the serverOutfilePath.
+ */
+ public String getServerOutfilePath() {
+ return serverOutfilePath;
+ }
+
+ /**
+ * @param serverOutfilePath The serverOutfilePath to set.
+ */
+ public void setServerOutfilePath(String serverOutfilePath) {
+ this.serverOutfilePath = serverOutfilePath;
+ }
+
+ /**
+ * @param clientOutfilePath The clientOutfilePath to set.
+ */
+ public void setClientOutfilePath(String clientOutfilePath) {
+ this.clientOutfilePath = clientOutfilePath;
+ }
+
+ public void setScriptVersion(ScriptVersionConfig scriptVersion) {
+ this.scriptVersion = scriptVersion;
+ }
+
+ public ScriptVersionConfig getScriptVersion() {
+ return this.scriptVersion;
+ }
+
+ public TesterConfig getTesterConfig() {
+ return this.testerConfig;
+ }
+
+ /**
+ * @return Returns the logLevel.
+ */
+ public Level getLogLevel() {
+ return logLevel;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/command/TestEnvironmentCommand.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/command/TestEnvironmentCommand.java
new file mode 100644
index 000000000..5fcef4eee
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/command/TestEnvironmentCommand.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.command;
+
+import java.io.Serializable;
+import java.util.UUID;
+
+import org.eclipse.osee.ote.core.TestException;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.IServiceCommand;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public abstract class TestEnvironmentCommand implements Serializable, IServiceCommand {
+ private static final long serialVersionUID = -921447917279635626L;
+ private final UUID key;
+ private final CommandDescription commandDescription;
+
+ public TestEnvironmentCommand(UUID key, CommandDescription commandDescription) {
+ this.key = key;
+ this.commandDescription = commandDescription;
+ }
+
+ public UUID getUserKey() {
+ return key;
+ }
+
+ public void executeBase(TestEnvironment environment) {
+ execute(environment);
+ }
+
+ @Override
+ public abstract void execute(TestEnvironment environment) throws TestException;
+
+ public CommandDescription getDescription() {
+ return commandDescription;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/config/ScriptVersionConfig.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/config/ScriptVersionConfig.java
new file mode 100644
index 000000000..0ab46f067
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/config/ScriptVersionConfig.java
@@ -0,0 +1,167 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.config;
+
+import java.io.Serializable;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.eclipse.osee.framework.jdk.core.persistence.XmlizableStream;
+import org.eclipse.osee.ote.core.test.tags.BaseTestTags;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+public class ScriptVersionConfig implements Xmlizable, XmlizableStream, Serializable {
+
+ private static final long serialVersionUID = -4021198751318075600L;
+ private String repositoryType;
+ private String location;
+ private String lastChangedRevision;
+ private String lastAuthor;
+ private String lastModificationDate;
+ private String modifiedFlag;
+
+ public ScriptVersionConfig() {
+ repositoryType = "UNKNOWN";
+ location = "-";
+ lastChangedRevision = "-";
+ lastAuthor = "-";
+ lastModificationDate = "-";
+ modifiedFlag = "-";
+ }
+
+ public ScriptVersionConfig(String repositoryType, String location, String lastChangedRevision, String lastAuthor, String lastModificationDate, String modifiedFlag) {
+ this.repositoryType = repositoryType;
+ this.location = location;
+ this.lastChangedRevision = lastChangedRevision;
+ this.lastAuthor = lastAuthor;
+ this.lastModificationDate = lastModificationDate;
+ this.modifiedFlag = modifiedFlag;
+ }
+
+ /**
+ * @return the location
+ */
+ @JsonProperty
+ public String getLocation() {
+ return location;
+ }
+
+ /**
+ * @param location the location to set
+ */
+ public void setLocation(String location) {
+ this.location = location;
+ }
+
+ /**
+ * @return the repositoryType
+ */
+ @JsonProperty
+ public String getRepositoryType() {
+ return repositoryType;
+ }
+
+ /**
+ * @param repositoryType the repositoryType to set
+ */
+ public void setRepositoryType(String repositoryType) {
+ this.repositoryType = repositoryType;
+ }
+
+ /**
+ * @return the revision
+ */
+ @JsonProperty
+ public String getLastChangedRevision() {
+ return lastChangedRevision;
+ }
+
+ /**
+ * @param lastChangedRevision the revision to set
+ */
+ public void setLastChangedRevision(String lastChangedRevision) {
+ this.lastChangedRevision = lastChangedRevision;
+ }
+
+ /**
+ * @return the lastAuthor
+ */
+ @JsonProperty
+ public String getLastAuthor() {
+ return lastAuthor;
+ }
+
+ /**
+ * @param lastAuthor the lastAuthor to set
+ */
+ public void setLastAuthor(String lastAuthor) {
+ this.lastAuthor = lastAuthor;
+ }
+
+ /**
+ * @return the lastDateModified
+ */
+ @JsonProperty
+ public String getLastModificationDate() {
+ return lastModificationDate;
+ }
+
+ /**
+ * @param lastModified the lastModified to set
+ */
+ public void setLastModificationDate(String lastModificationDate) {
+ this.lastModificationDate = lastModificationDate;
+ }
+
+ /**
+ * @return the modifiedFlag
+ */
+ @JsonProperty
+ public String getModifiedFlag() {
+ return modifiedFlag;
+ }
+
+ /**
+ * @param modifiedFlag the modifiedFlag to set
+ */
+ public void setModifiedFlag(String modifiedFlag) {
+ this.modifiedFlag = modifiedFlag;
+ }
+
+ @Override
+ public Element toXml(Document doc) {
+ Element scriptVersion = doc.createElement(BaseTestTags.SCRIPT_VERSION);
+ scriptVersion.setAttribute(BaseTestTags.REVISION_FIELD, getLastChangedRevision());
+ scriptVersion.setAttribute(BaseTestTags.REPOSITORY_TYPE, getRepositoryType());
+ scriptVersion.setAttribute(BaseTestTags.LAST_AUTHOR_FIELD, getLastAuthor());
+ scriptVersion.setAttribute(BaseTestTags.LAST_MODIFIED, getLastModificationDate());
+ scriptVersion.setAttribute(BaseTestTags.MODIFIED_FIELD, getModifiedFlag());
+ scriptVersion.setAttribute(BaseTestTags.URL, getLocation());
+ return scriptVersion;
+ }
+
+ @Override
+ public void toXml(XMLStreamWriter writer) throws XMLStreamException {
+ writer.writeStartElement(BaseTestTags.SCRIPT_VERSION);
+ writer.writeAttribute(BaseTestTags.REVISION_FIELD, getLastChangedRevision());
+ writer.writeAttribute(BaseTestTags.REPOSITORY_TYPE, getRepositoryType());
+ writer.writeAttribute(BaseTestTags.LAST_AUTHOR_FIELD, getLastAuthor());
+ writer.writeAttribute(BaseTestTags.LAST_MODIFIED, getLastModificationDate());
+ writer.writeAttribute(BaseTestTags.MODIFIED_FIELD, getModifiedFlag());
+ writer.writeAttribute(BaseTestTags.URL, getLocation());
+ writer.writeEndElement();
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/config/TestScriptConfig.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/config/TestScriptConfig.java
new file mode 100644
index 000000000..97f94953b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/config/TestScriptConfig.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.config;
+
+import java.io.Serializable;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class TestScriptConfig implements Serializable {
+
+ private static final long serialVersionUID = 6791547338404192517L;
+ private final String outFile;
+ private final String fullScriptName;
+ private final String[] classPathStrs;
+ private final boolean isExe;
+ private final ScriptVersionConfig scriptVersion;
+
+ /**
+ * TestScriptConfig Constructor.
+ *
+ * @param classPathStrs The classPathStrs to set.
+ * @param fullScriptName The fullScriptName to set.
+ * @param outFile The outFile to set.
+ */
+ public TestScriptConfig(String[] classPathStrs, String fullScriptName, String outFile, ScriptVersionConfig scriptVersion) {
+ this.fullScriptName = fullScriptName;
+ this.outFile = outFile;
+ this.isExe = false;
+ this.scriptVersion = scriptVersion;
+ this.classPathStrs = classPathStrs;
+ }
+
+ public String getOutFile() {
+ return outFile;
+ }
+
+ public String getFullScriptName() {
+ return fullScriptName;
+ }
+
+ public String[] getClassPathStrs() {
+ return classPathStrs;
+ }
+
+ public boolean isExe() {
+ return isExe;
+ }
+
+ public ScriptVersionConfig getScriptVersion() {
+ return this.scriptVersion;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/config/TesterConfig.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/config/TesterConfig.java
new file mode 100644
index 000000000..2104c19a6
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/config/TesterConfig.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.config;
+
+import java.io.Serializable;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.ote.core.test.tags.BaseTestTags;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+public class TesterConfig implements Xmlizable, Serializable {
+
+ private static final long serialVersionUID = -6513354260245950581L;
+ private String name;
+ private String id;
+ private String email;
+
+ public TesterConfig() {
+ name = "";
+ id = "";
+ email = "";
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public Element toXml(Document doc) {
+ Element testerElement = doc.createElement(BaseTestTags.EXECUTED_BY);
+ testerElement.appendChild(Jaxp.createElement(doc, BaseTestTags.NAME_FIELD, name));
+ testerElement.appendChild(Jaxp.createElement(doc, BaseTestTags.BEMS_FIELD, id));
+ testerElement.appendChild(Jaxp.createElement(doc, BaseTestTags.EMAIL_FIELD, email));
+ return testerElement;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/ConsoleCommand.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/ConsoleCommand.java
new file mode 100644
index 000000000..3f3cfb34e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/ConsoleCommand.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.console;
+
+import java.util.regex.Pattern;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+
+public abstract class ConsoleCommand {
+ private static final Pattern SPLITTER = Pattern.compile("\\s");
+
+ private final String cmdName;
+ private final String description;
+
+ private ConsoleShell shell;
+
+ protected ConsoleCommand(String cmdName, String description) {
+ this.cmdName = cmdName;
+ this.description = description;
+ }
+
+ public String getName() {
+ return cmdName;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public final synchronized void execute(ConsoleShell shell, String switches, String args) {
+ this.shell = shell;
+ final String[] argArray;
+ if (Strings.isValid(args)) {
+ argArray = SPLITTER.split(args);
+ } else {
+ argArray = new String[0];
+ }
+ final String[] switchesArray;
+ if (Strings.isValid(switches)) {
+ switchesArray = SPLITTER.split(switches);
+ } else {
+ switchesArray = new String[0];
+ }
+ doCmd(shell, switchesArray, argArray);
+ }
+
+ protected abstract void doCmd(ConsoleShell shell, String[] switches, String[] args);
+
+ public void dispose() {
+
+ }
+
+ protected final void print(String msg) {
+ shell.print(msg);
+ }
+
+ protected final void println(String msg) {
+ shell.println(msg);
+ }
+
+ protected final void println() {
+ shell.println();
+ }
+
+ protected final void printStackTrace(Throwable t) {
+ shell.printStackTrace(t);
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/ConsoleCommandManager.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/ConsoleCommandManager.java
new file mode 100644
index 000000000..3a360c900
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/ConsoleCommandManager.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.console;
+
+import java.util.Collection;
+import java.util.Hashtable;
+
+public class ConsoleCommandManager implements ICommandManager {
+
+ private final Hashtable<String, ConsoleCommand> cmdMap = new Hashtable<>(64);
+
+ private boolean isShutdown = false;
+
+ @Override
+ public void registerCommand(ConsoleCommand cmd) {
+ if (!isShutdown) {
+ cmdMap.put(cmd.getName(), cmd);
+ } else {
+ throw new IllegalStateException("Can't register command: This manager has been shutdown");
+ }
+ }
+
+ @Override
+ public ConsoleCommand unregisterCommand(ConsoleCommand cmd) {
+ if (!isShutdown) {
+ return cmdMap.remove(cmd.getName());
+ } else {
+ throw new IllegalStateException("Can't register command: This manager has been shutdown");
+ }
+ }
+
+ @Override
+ public ConsoleCommand getCommand(String name) {
+ return cmdMap.get(name);
+ }
+
+ @Override
+ public Collection<ConsoleCommand> getCommands() {
+ return cmdMap.values();
+ }
+
+ public void shutdown() {
+ isShutdown = true;
+ for (ConsoleCommand cmd : cmdMap.values()) {
+ cmd.dispose();
+ }
+ cmdMap.clear();
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/ConsoleShell.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/ConsoleShell.java
new file mode 100644
index 000000000..1025085ae
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/ConsoleShell.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.console;
+
+import java.lang.ref.WeakReference;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public abstract class ConsoleShell {
+ private static final Pattern CMD_PATTERN = Pattern.compile("^(\\S+)\\s*((-[a-zA-Z]\\S*\\s*)*)\\s*((\\S+(\\s+|$))*)");
+
+ private final WeakReference<ICommandManager> manager;
+ private volatile ConsoleCommand lastCmd;
+ private volatile String lastSwitches;
+ private volatile String lastArgs;
+ private boolean saveLastCmdFlag = true;
+
+ public ConsoleShell(ICommandManager manager) {
+ this.manager = new WeakReference<>(manager);
+ }
+
+ public abstract void println(String string);
+
+ public abstract void print(String string);
+
+ public abstract void println();
+
+ public ICommandManager getCommandManager() {
+ return manager.get();
+ }
+
+ public void runLast() {
+ lastCmd.execute(this, lastSwitches, lastArgs);
+ }
+
+ public final void parseAndExecuteCmd(String line) throws Throwable {
+ final Matcher matcher = CMD_PATTERN.matcher(line);
+ if (matcher.matches()) {
+ String cmdName = matcher.group(1);
+ String switches = matcher.group(2);
+ String args = matcher.group(4);
+ final ConsoleCommand cmd = getCommandManager().getCommand(cmdName);
+ if (cmd != null) {
+ cmd.execute(this, switches, args);
+ if (saveLastCmdFlag) {
+ lastCmd = cmd;
+ lastSwitches = switches;
+ lastArgs = args;
+ } else {
+ // we do not save the last command as instructed but we reset the flag
+ saveLastCmdFlag = true;
+ }
+ } else {
+ println(cmdName + " is not recognized as a command");
+ }
+ } else {
+ println("invalid command format");
+ }
+ }
+
+ /**
+ * Prevents the currently running command from being saved as the last executed command. This is useful for commands
+ * that process the last executed command but do not want themselves to become the last command executed
+ */
+ public void setSaveLastCmdFlag(boolean save) {
+ saveLastCmdFlag = save;
+ }
+
+ public void printStackTrace(Throwable t) {
+ println(t.toString() + ":");
+ StackTraceElement[] elements = t.getStackTrace();
+ for (int i = 0; i < elements.length; i++) {
+ println(" " + elements[i].toString());
+ }
+ t = t.getCause();
+ while (t != null) {
+ println("Caused by: " + t.toString());
+ elements = t.getStackTrace();
+ for (int i = 0; i < elements.length; i++) {
+ println(" " + elements[i].toString());
+ }
+ t = t.getCause();
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/ICommandManager.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/ICommandManager.java
new file mode 100644
index 000000000..96628865f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/ICommandManager.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.console;
+
+import java.util.Collection;
+
+public interface ICommandManager {
+
+ public void registerCommand(ConsoleCommand cmd);
+
+ public ConsoleCommand unregisterCommand(ConsoleCommand cmd);
+
+ public ConsoleCommand getCommand(String name);
+
+ public Collection<ConsoleCommand> getCommands();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/BenchmarkCommand.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/BenchmarkCommand.java
new file mode 100644
index 000000000..5a2d81d40
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/BenchmarkCommand.java
@@ -0,0 +1,104 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.console.cmd;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.PrintWriter;
+import java.util.Iterator;
+import java.util.Map;
+import org.eclipse.osee.framework.jdk.core.util.benchmark.Benchmark;
+import org.eclipse.osee.ote.core.environment.console.ConsoleCommand;
+import org.eclipse.osee.ote.core.environment.console.ConsoleShell;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class BenchmarkCommand extends ConsoleCommand {
+ private static final String NAME = "b";
+ private static final String DESCRIPTION = "outputs results from the benchmarking utility";
+
+ public BenchmarkCommand() {
+ super(NAME, DESCRIPTION);
+ }
+
+ @Override
+ protected void doCmd(ConsoleShell shell, String[] switches, String[] args) {
+ if (Benchmark.isBenchmarkingEnabled()) {
+ if (switches.length > 0) {
+ processSwitches(switches, args);
+ }
+ print("Current Benchmarks\n");
+ final StringBuilder buffer = new StringBuilder(4096);
+ final Iterator<Benchmark> iter = Benchmark.getAllBenchamrks().iterator();
+ while (iter.hasNext()) {
+ Benchmark bm = iter.next();
+ float val = bm.getLongestSample() / 1000.0f;
+ buffer.append(bm.getName()).append(": total samples: ").append(bm.getTotalSamples());
+ buffer.append(". Max Time: ").append(val).append("ms. Min: ");
+ val = bm.getShortestSample() / 1000.0f;
+ buffer.append(val).append("ms. Avg: ");
+ val = bm.getAverage() / 1000.0f;
+ buffer.append(val).append("ms. Exceed Count: ").append(bm.getExceedCount()).append(" (threshold=").append(
+ bm.getThreshold() / 1000.0f);
+ val = bm.getAverageExceedAmount() / 1000.0f;
+ buffer.append("ms) avg. exceed time: ").append(val).append("ms\n");
+ for (Map.Entry<String, Integer> entry : bm.getExceeders()) {
+ buffer.append("\tExceeder ").append(entry.getKey()).append(": counted ").append(entry.getValue()).append(
+ '\n');
+ }
+ }
+ print(buffer.toString());
+ } else {
+ print("Benchmarks disabled\n");
+ }
+ }
+
+ private void processSwitches(String[] switches, String[] args) {
+ for (String sw : switches) {
+ if (sw.equals("-f")) {
+ try {
+ writeToCSV(args[0]);
+ println("wrote results to file " + args[0]);
+ } catch (Exception e) {
+ printStackTrace(e);
+ }
+ } else if (sw.equals("-r")) {
+ Benchmark.resetAll();
+ println("benchmarks reset");
+ } else {
+ println("unknown switch '" + sw + "'");
+ }
+ }
+ }
+
+ private void writeToCSV(String fileName) throws FileNotFoundException {
+ File file = new File(fileName);
+ BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));
+ PrintWriter out = new PrintWriter(bos);
+ final Iterator<Benchmark> iter = Benchmark.getAllBenchamrks().iterator();
+ out.println("NAME,TOTAL SAMPLES,MAX TIME,MIN TIME,AVG TIME,EXCEED CNT,THRESHOLD,AVG EXCEED TIME,EXCEEDERS");
+ while (iter.hasNext()) {
+ final Benchmark bm = iter.next();
+ out.format("%s,%d,%f,%f,%f,%d,%f,%f", bm.getName(), bm.getTotalSamples(), bm.getLongestSample() / 1000.0f,
+ bm.getShortestSample() / 1000.0f, bm.getAverage() / 1000.0f, bm.getExceedCount(),
+ bm.getThreshold() / 1000.0f, bm.getAverageExceedAmount() / 1000.0f);
+ for (Map.Entry<String, Integer> entry : bm.getExceeders()) {
+ out.format(",Exceeder %s:%d", entry.getKey(), entry.getValue());
+ }
+ out.println();
+ }
+ out.close();
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/HostCmd.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/HostCmd.java
new file mode 100644
index 000000000..ae043a3c4
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/HostCmd.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.console.cmd;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import org.eclipse.osee.ote.core.environment.console.ConsoleCommand;
+import org.eclipse.osee.ote.core.environment.console.ConsoleShell;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class HostCmd extends ConsoleCommand {
+
+ private static final String NAME = "host";
+ private static final String DESCRIPTION = "displays the local host";
+
+ public HostCmd() {
+ super(NAME, DESCRIPTION);
+ }
+
+ @Override
+ protected void doCmd(ConsoleShell shell, String[] switches, String[] args) {
+ try {
+ println(InetAddress.getLocalHost().toString());
+ } catch (UnknownHostException e) {
+ println("problems getting local host");
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/LastCmd.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/LastCmd.java
new file mode 100644
index 000000000..4dd4d1e46
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/LastCmd.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.console.cmd;
+
+import org.eclipse.osee.ote.core.environment.console.ConsoleCommand;
+import org.eclipse.osee.ote.core.environment.console.ConsoleShell;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class LastCmd extends ConsoleCommand {
+
+ private static final String NAME = "lc";
+ private static final String DESCRIPTION = "Executes the last command executed";
+
+ public LastCmd() {
+ super(NAME, DESCRIPTION);
+ }
+
+ @Override
+ protected void doCmd(ConsoleShell shell, String[] switches, String[] args) {
+ shell.runLast();
+ shell.setSaveLastCmdFlag(false);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/ListSystemPropertiesCmd.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/ListSystemPropertiesCmd.java
new file mode 100644
index 000000000..a57596289
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/ListSystemPropertiesCmd.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.console.cmd;
+
+import java.util.Map;
+import java.util.Properties;
+import org.eclipse.osee.ote.core.environment.console.ConsoleCommand;
+import org.eclipse.osee.ote.core.environment.console.ConsoleShell;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class ListSystemPropertiesCmd extends ConsoleCommand {
+ private static final String NAME = "sys_props";
+ private static final String DESCRIPTION = "list JVM system properties";
+
+ public ListSystemPropertiesCmd() {
+ super(NAME, DESCRIPTION);
+ }
+
+ @Override
+ protected void doCmd(ConsoleShell shell, String[] switches, String[] args) {
+ Properties props = System.getProperties();
+ if (args.length == 0) {
+ for (Map.Entry<Object, Object> entry : props.entrySet()) {
+ println(entry.getKey() + "=" + entry.getValue());
+ }
+ } else {
+ for (String arg : args) {
+ String val = System.getProperty(arg);
+ if (val != null) {
+ println(arg + "=" + val);
+ } else {
+ println("no property defined for " + arg);
+ }
+ }
+ }
+
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/MemoryUsageCommand.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/MemoryUsageCommand.java
new file mode 100644
index 000000000..4dc4173d4
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/console/cmd/MemoryUsageCommand.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.console.cmd;
+
+import java.text.NumberFormat;
+import org.eclipse.osee.ote.core.environment.console.ConsoleCommand;
+import org.eclipse.osee.ote.core.environment.console.ConsoleShell;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class MemoryUsageCommand extends ConsoleCommand {
+ private static final String NAME = "mem";
+ private static final String DESCRIPTION = "outputs the system memory used by this JVM";
+
+ public MemoryUsageCommand() {
+ super(NAME, DESCRIPTION);
+ }
+
+ @Override
+ public void doCmd(ConsoleShell shell, String[] switches, String[] args) {
+
+ print("JVM Heap space allocated: " + NumberFormat.getInstance().format(Runtime.getRuntime().totalMemory()) + "\n");
+ print("JVM Heap space used:" + NumberFormat.getInstance().format(
+ Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) + "\n");
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/BasicTimeout.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/BasicTimeout.java
new file mode 100644
index 000000000..53169be16
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/BasicTimeout.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.interfaces;
+
+public class BasicTimeout implements ITimeout {
+
+ private volatile boolean timeout;
+
+ @Override
+ public boolean isTimedOut() {
+ return timeout;
+ }
+
+ @Override
+ public void setTimeout(boolean timeout) {
+ this.timeout = timeout;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IAssociatedObjectListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IAssociatedObjectListener.java
new file mode 100644
index 000000000..de0f3cf20
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IAssociatedObjectListener.java
@@ -0,0 +1,18 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.interfaces;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+
+public interface IAssociatedObjectListener extends Remote {
+ void updateAssociatedListener() throws RemoteException;
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ICancelTimer.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ICancelTimer.java
new file mode 100644
index 000000000..9a85de166
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ICancelTimer.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.interfaces;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public interface ICancelTimer {
+ public void cancelTimer();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IEnvironmentFactory.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IEnvironmentFactory.java
new file mode 100644
index 000000000..d5c54512b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IEnvironmentFactory.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.interfaces;
+
+import org.eclipse.osee.ote.core.framework.ICommandContextFactory;
+import org.eclipse.osee.ote.core.framework.IRunManager;
+import org.eclipse.osee.ote.core.framework.command.ICommandManager;
+
+public interface IEnvironmentFactory {
+
+ ITimerControl getTimerControl();
+
+ IScriptControl getScriptControl();
+
+ IReportData getReportDataControl();
+
+ ITestLogger getTestLogger();
+
+ ICommandManager getCommandManager();
+
+ IRunManager getRunManager();
+
+ ICommandContextFactory getCommandContextFactory();
+
+ IRuntimeLibraryManager getRuntimeManager();
+
+ ITestStation getTestStation();
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IExecutionUnitManagement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IExecutionUnitManagement.java
new file mode 100644
index 000000000..4cce3f4e4
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IExecutionUnitManagement.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.interfaces;
+
+import org.eclipse.osee.ote.core.TestException;
+
+/**
+ * This interface provides the basic abilities that must be able to be performed on any ExecutionUnit being run by the
+ * system. All classes which provide control over an ExecutionUnit should implement at least this interface so the
+ * environments can make use of them.
+ *
+ * @author Robert A. Fisher
+ */
+public interface IExecutionUnitManagement {
+ public void startExecutionUnit() throws Exception;
+
+ public void setupExecutionUnit(Object execUnitConfig) throws Exception;
+
+ public void runPrimaryOneCycle() throws InterruptedException, TestException;
+
+ public void stopExecutionUnit() throws InterruptedException;
+
+ public void init() throws Exception;
+
+ public void dispose();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IHostTestEnvironment.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IHostTestEnvironment.java
new file mode 100644
index 000000000..9faa3bd01
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IHostTestEnvironment.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.interfaces;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import java.util.UUID;
+
+import org.eclipse.osee.framework.jdk.core.util.EnhancedProperties;
+import org.eclipse.osee.ote.core.ConnectionRequestResult;
+import org.eclipse.osee.ote.core.IRemoteUserSession;
+import org.eclipse.osee.ote.core.environment.TestEnvironmentConfig;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IHostTestEnvironment extends Remote {
+ EnhancedProperties getProperties() throws RemoteException;
+
+ ConnectionRequestResult requestEnvironment(IRemoteUserSession session, UUID id, TestEnvironmentConfig config) throws RemoteException;
+ void disconnect(UUID sessionId) throws RemoteException;
+
+// public NodeInfo getBroker() throws RemoteException;
+
+ public String getHttpURL() throws RemoteException;
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IOTypeDefinition.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IOTypeDefinition.java
new file mode 100644
index 000000000..a10acd53f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IOTypeDefinition.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.interfaces;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IOTypeDefinition {
+ String getName();
+
+ String getDescription();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IOTypeHandlerDefinition.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IOTypeHandlerDefinition.java
new file mode 100644
index 000000000..ca426ed42
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IOTypeHandlerDefinition.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.interfaces;
+
+import java.util.List;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IOTypeHandlerDefinition {
+ String getName();
+
+ String getDescription();
+
+ List<IOTypeDefinition> getIOTypesHandled();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IOutfileResults.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IOutfileResults.java
new file mode 100644
index 000000000..9dce77abc
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IOutfileResults.java
@@ -0,0 +1,17 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.interfaces;
+
+import java.io.File;
+
+public interface IOutfileResults {
+ public File genOutfileResults(ITestEnvironmentServiceConfig serverConfig);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IRemoteCommandConsole.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IRemoteCommandConsole.java
new file mode 100644
index 000000000..a8c90b480
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IRemoteCommandConsole.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.interfaces;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IRemoteCommandConsole extends Remote {
+ public String doCommand(String cmd) throws RemoteException;
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IReportData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IReportData.java
new file mode 100644
index 000000000..f3a96abd9
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IReportData.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.interfaces;
+
+import java.util.List;
+import org.eclipse.osee.framework.jdk.core.reportdata.ReportDataListener;
+
+public interface IReportData {
+ // void addQueueListener(ReportDataListener listener, List<TestEnvironmentCommand> cmds);
+ void addQueueListener(ReportDataListener listener, List cmds);
+
+ void removeQueueListener(ReportDataListener listener);
+
+ // void updateQueueListeners(List<TestEnvironmentCommand> cmds);
+ void updateQueueListeners(List cmds);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IRuntimeLibraryManager.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IRuntimeLibraryManager.java
new file mode 100644
index 000000000..9d0db55e5
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IRuntimeLibraryManager.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.interfaces;
+
+import org.eclipse.osee.framework.jdk.core.persistence.XmlizableStream;
+import org.eclipse.osee.ote.Configuration;
+import org.eclipse.osee.ote.ConfigurationStatus;
+import org.eclipse.osee.ote.OTEStatusCallback;
+
+/**
+ * An interface for loading and installing bundles in the running test environment.
+ *
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public interface IRuntimeLibraryManager extends XmlizableStream {
+
+ ClassLoader getClassLoader();
+
+ Class<?> loadFromScriptClassLoader(String path) throws ClassNotFoundException;
+
+ Class<?> loadFromRuntimeLibraryLoader(String path) throws ClassNotFoundException;
+
+ boolean installed();
+
+ boolean uninstall(OTEStatusCallback<ConfigurationStatus> callable);
+
+ boolean install(Configuration configuration, OTEStatusCallback<ConfigurationStatus> callable);
+
+ boolean start(OTEStatusCallback<ConfigurationStatus> callable);
+
+ void clearJarCache();
+
+ boolean acquireBundles(Configuration configuration, OTEStatusCallback<ConfigurationStatus> callable);
+
+ void resetScriptLoader(Configuration configuration, String[] strings) throws Exception;
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IScriptCompleteListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IScriptCompleteListener.java
new file mode 100644
index 000000000..729049df9
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IScriptCompleteListener.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.interfaces;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IScriptCompleteListener {
+
+ void onScriptComplete();
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IScriptControl.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IScriptControl.java
new file mode 100644
index 000000000..4758e2fa2
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IScriptControl.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.interfaces;
+
+public interface IScriptControl {
+
+ boolean isExecutionUnitPaused();
+
+ boolean isScriptPaused();
+
+ boolean isScriptReady();
+
+ boolean isLocked();
+
+ void lock();
+
+ void setExecutionUnitPause(boolean pause);
+
+ void setScriptPause(boolean pause);
+
+ void setScriptReady(boolean ready);
+
+ boolean shouldStep();
+
+ void unlock();
+
+ boolean hasLock();
+
+ boolean isHeldByCurrentThread();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IScriptInitializer.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IScriptInitializer.java
new file mode 100644
index 000000000..ddc27e08a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IScriptInitializer.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.interfaces;
+
+/**
+ * @author Andy Jury
+ * @author Charles Shaw
+ */
+public interface IScriptInitializer {
+
+ public void doScriptInitialProcessing() throws Exception;
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IServiceCommand.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IServiceCommand.java
new file mode 100644
index 000000000..bf32ff2b8
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/IServiceCommand.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.interfaces;
+
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+
+public interface IServiceCommand {
+
+ public abstract void execute(TestEnvironment environment);
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestEnvironment.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestEnvironment.java
new file mode 100644
index 000000000..b20870af5
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestEnvironment.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.interfaces;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+
+import org.eclipse.osee.ote.core.model.IModelManagerRemote;
+import org.eclipse.osee.ote.message.IInstrumentationRegistrationListener;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface ITestEnvironment extends Remote {
+
+ Remote getControlInterface(String controlInterfaceID) throws RemoteException;
+
+ IRemoteCommandConsole getCommandConsole() throws RemoteException;
+ public void closeCommandConsole(IRemoteCommandConsole console) throws RemoteException;
+
+ public IModelManagerRemote getModelManager() throws RemoteException;
+
+ byte[] getScriptOutfile(String outfilePath) throws RemoteException;
+
+ int getUniqueId() throws RemoteException;
+
+ public void setBatchMode(boolean isBatched) throws RemoteException;
+
+// public void sendMessage(Message message) throws RemoteException;
+
+ void addInstrumentationRegistrationListener(IInstrumentationRegistrationListener listener) throws RemoteException;
+
+ void removeInstrumentationRegistrationListener(IInstrumentationRegistrationListener listener) throws RemoteException;
+
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestEnvironmentAccessor.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestEnvironmentAccessor.java
new file mode 100644
index 000000000..613732993
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestEnvironmentAccessor.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.interfaces;
+
+import java.util.Set;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.environment.EnvironmentTask;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public interface ITestEnvironmentAccessor {
+ void abortTestScript();
+
+ void abortTestScript(Throwable t);
+
+ boolean addTask(EnvironmentTask task);
+
+ void associateObject(Class<?> c, Object obj);
+
+ Object getAssociatedObject(Class<?> c);
+
+ Set<Class<?>> getAssociatedObjects();
+
+ TestScript getTestScript();
+
+ long getEnvTime();
+
+ IExecutionUnitManagement getExecutionUnitManagement();
+
+ ITestLogger getLogger();
+
+ IScriptControl getScriptCtrl();
+
+ ITestStation getTestStation();
+
+ ITimerControl getTimerCtrl();
+
+ void onScriptComplete() throws InterruptedException;
+
+ void onScriptSetup();
+
+ ICancelTimer setTimerFor(ITimeout listener, int time);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestEnvironmentListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestEnvironmentListener.java
new file mode 100644
index 000000000..57532130e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestEnvironmentListener.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.interfaces;
+
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.command.CommandDescription;
+import org.eclipse.osee.ote.core.environment.command.TestEnvironmentCommand;
+import org.eclipse.osee.ote.core.environment.status.CommandEndedStatusEnum;
+import org.eclipse.osee.ote.core.framework.command.ICommandHandle;
+
+public interface ITestEnvironmentListener {
+ void onEnvironmentKilled(TestEnvironment env);
+
+ void onCommandAdded(TestEnvironment env, TestEnvironmentCommand cmd);
+
+ void onCommandBegan(TestEnvironment env, CommandDescription cmdDesc);
+
+ void onCommandFinished(TestEnvironment env, CommandDescription cmdDesc, CommandEndedStatusEnum status);
+
+ void onTestServerCommandFinished(TestEnvironment env, ICommandHandle handle);
+
+ void onCommandRemoved(TestEnvironment env, CommandDescription cmdDesc, CommandEndedStatusEnum status);
+
+ void onException(String message, Throwable t);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestEnvironmentServiceConfig.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestEnvironmentServiceConfig.java
new file mode 100644
index 000000000..60bff94ee
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestEnvironmentServiceConfig.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.interfaces;
+
+import java.lang.reflect.Constructor;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+
+public interface ITestEnvironmentServiceConfig {
+ /**
+ * gets the maximum number of environments allowed in this service
+ */
+ public int getMaxEnvironments();
+
+ public int getMaxUsersPerEnvironment();
+
+ public String getName();
+
+ public String getServerTitle();
+
+ public String getOutfileLocation();
+
+ /**
+ * gets the Constructor for the creating new environments
+ */
+ public Constructor<? extends TestEnvironment> getEnvironmentConstructor();
+
+ /**
+ * gets the parameter instances need to calling the constructor when new environments are created
+ */
+ public Object[] getConstructorParameters();
+
+ /**
+ * tells whether the environment should stay running when the last user disconnects
+ *
+ * @return true if the environment should stay active when no users are connected or false otherwise
+ */
+ public boolean keepEnvAliveWithNoUsers();
+
+ /**
+ * returns whether an environment should be created and started up upon service initialization
+ *
+ * @return true if an environment should be started up or false if no evionment should be created until requested
+ */
+ public boolean startEnvionrmnetOnServiceInit();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestGroup.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestGroup.java
new file mode 100644
index 000000000..e4235e47a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestGroup.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.interfaces;
+
+import java.util.ArrayList;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.annotate.JsonSubTypes;
+import org.eclipse.osee.ote.core.testPoint.CheckGroup;
+import org.eclipse.osee.ote.core.testPoint.RetryGroup;
+
+/**
+ * The TestPoint interface should be implemented by objects that store pass/fail
+ * data.
+ *
+ * @author Robert A. Fisher
+ */
+@JsonSubTypes({ @JsonSubTypes.Type(value = CheckGroup.class), //
+ @JsonSubTypes.Type(value = RetryGroup.class) })
+public interface ITestGroup extends ITestPoint {
+ public int size();
+
+ @JsonProperty
+ public ArrayList<ITestPoint> getTestPoints();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestLogger.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestLogger.java
new file mode 100644
index 000000000..0f0976005
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestLogger.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.interfaces;
+
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.eclipse.osee.ote.core.MethodFormatter;
+import org.eclipse.osee.ote.core.ReturnFormatter;
+import org.eclipse.osee.ote.core.TestCase;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.log.record.TestPointRecord;
+import org.eclipse.osee.ote.core.log.record.TestRecord;
+
+public interface ITestLogger {
+ public void addHandler(Handler handler);
+
+ public void debug(ITestEnvironmentAccessor source, String message);
+
+ public void debug(ITestEnvironmentAccessor source, String message, boolean timeStamp);
+
+ public void info(String message);
+
+ public void log(TestRecord record);
+
+ public void log(Level level, String message, Throwable th);
+
+ public void log(ITestEnvironmentAccessor source, Level level, String message, Throwable th);
+
+ public void methodCalled(ITestEnvironmentAccessor source);
+
+ public void methodCalled(ITestEnvironmentAccessor source, MethodFormatter methodFormat);
+
+ public void methodCalledOnObject(ITestEnvironmentAccessor source, String objectName);
+
+ public void methodCalledOnObject(ITestEnvironmentAccessor source, String objectName, MethodFormatter methodFormat);
+
+ public void methodCalledOnObject(ITestEnvironmentAccessor source, String objectName, MethodFormatter methodFormat, Xmlizable xmlObject);
+
+ public void methodEnded(ITestEnvironmentAccessor source);
+
+ public void methodEnded(ITestEnvironmentAccessor source, ReturnFormatter returnFormatter);
+
+ public void removeHandler(Handler handler);
+
+ public void support(ITestEnvironmentAccessor source, String message);
+
+ public void severe(ITestEnvironmentAccessor source, String message);
+
+ public void severe(Object source, Throwable thrown);
+
+ public void severe(String message);
+
+ public void testCaseBegan(TestCase testCase);
+
+ public void testpoint(ITestEnvironmentAccessor env, TestScript script, TestCase testCase, boolean passed, String testPointName, String expected, String actual);
+
+ public void testpoint(ITestEnvironmentAccessor env, TestScript script, TestCase testCase, ITestPoint testPoint);
+
+ public void testpoint(TestPointRecord record);
+
+ public void warning(ITestEnvironmentAccessor source, String message);
+
+ public void warning(String message);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestPoint.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestPoint.java
new file mode 100644
index 000000000..dbad799d4
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestPoint.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.interfaces;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.annotate.JsonSubTypes;
+import org.codehaus.jackson.annotate.JsonTypeInfo;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.eclipse.osee.framework.jdk.core.persistence.XmlizableStream;
+import org.eclipse.osee.ote.core.testPoint.CheckPoint;
+
+/**
+ * The TestPoint interface should be implemented by objects that store pass/fail
+ * data.
+ *
+ * @author Robert A. Fisher
+ */
+public interface ITestPoint extends Xmlizable, XmlizableStream {
+ @JsonProperty
+ public boolean isPass();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestStation.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestStation.java
new file mode 100644
index 000000000..3679216f2
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITestStation.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.interfaces;
+
+import java.util.List;
+
+/**
+ * @author Robert A. Fisher
+ */
+public interface ITestStation {
+
+ public String getOutletIp();
+
+ public void setOutletIp(String outletIp);
+
+ public int getOutletPort();
+
+ public void setOutletPort(int outletPort);
+
+ public String getVmeConnectionName();
+
+ public void turnPowerSupplyOnOff(boolean turnOn);
+
+ public List<IOTypeHandlerDefinition> getSupportedDriverTypes();
+
+ public boolean isPhysicalTypeAvailable(IOTypeDefinition physicalType);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITimeTypeControl.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITimeTypeControl.java
new file mode 100644
index 000000000..7b9fe58b1
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITimeTypeControl.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.interfaces;
+
+public interface ITimeTypeControl {
+
+ void step();
+
+ ICancelTimer setTimerFor(Object objToNotify, int milliseconds);
+
+ long getEnvTime();
+
+ void singleStepEnv();
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITimeout.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITimeout.java
new file mode 100644
index 000000000..5f3bbbf3b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITimeout.java
@@ -0,0 +1,17 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.interfaces;
+
+public interface ITimeout {
+ boolean isTimedOut();
+
+ void setTimeout(boolean timeout);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITimerControl.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITimerControl.java
new file mode 100644
index 000000000..dc96aa66f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/ITimerControl.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.interfaces;
+
+import org.eclipse.osee.ote.core.environment.EnvironmentTask;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.framework.IRunManager;
+
+public interface ITimerControl {
+ void addTask(EnvironmentTask task, TestEnvironment environment);
+
+ void removeTask(EnvironmentTask task);
+
+ void cancelTimers();
+
+ long getEnvTime();
+
+ ICancelTimer setTimerFor(ITimeout objToNotify, int milliseconds);
+
+ void envWait(ITimeout obj, int milliseconds) throws InterruptedException;
+
+ void envWait(int milliseconds) throws InterruptedException;
+
+ int getCycleCount();
+
+ void incrementCycleCount();
+
+ void setCycleCount(int cycle);
+
+ void dispose();
+
+ public void cancelAllTasks();
+
+ public void step();
+
+ long getTimeOfDay();
+
+ public void setRunManager(IRunManager runManager);
+
+ public IRunManager getRunManager();
+
+ public boolean isRealtime();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/OteUtil.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/OteUtil.java
new file mode 100644
index 000000000..c900d78f2
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/OteUtil.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.interfaces;
+
+public class OteUtil {
+
+ public static String generateBundleVersionString(String bundleSpecificVersion, String symbolicName, String version, String md5) {
+ StringBuilder sb = new StringBuilder();
+ if (bundleSpecificVersion != null) {
+ sb.append(bundleSpecificVersion);
+ sb.append("_");
+ }
+ sb.append(symbolicName);
+ sb.append("_");
+ sb.append(version);
+ sb.append("_");
+ sb.append(md5);
+ return sb.toString();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/RuntimeLibraryListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/RuntimeLibraryListener.java
new file mode 100644
index 000000000..90ead44f7
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/interfaces/RuntimeLibraryListener.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.interfaces;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface RuntimeLibraryListener {
+ void onPostRuntimeLibraryUpdated(ClassLoader classloader);
+
+ void onRuntimeLibraryUnload();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/jini/EclipseConsolePrintStream.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/jini/EclipseConsolePrintStream.java
new file mode 100644
index 000000000..dbfbe5161
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/jini/EclipseConsolePrintStream.java
@@ -0,0 +1,234 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.jini;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.IUserSession;
+import org.eclipse.osee.ote.core.environment.AsynchRemoteJobs;
+import org.eclipse.osee.ote.core.environment.ConsoleOutputJob;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class EclipseConsolePrintStream extends PrintStream {
+
+ private final IUserSession callback;
+ private final StringBuffer builder;
+
+ public EclipseConsolePrintStream(OutputStream stream, IUserSession callback) {
+ super(stream);
+ this.callback = callback;
+ builder = new StringBuffer();
+ }
+
+ public EclipseConsolePrintStream(final InputStream instream, final OutputStream outstream, IUserSession callback) {
+ this(outstream, callback);
+
+ new Thread(new Runnable() {
+
+ @Override
+ public void run() {
+ try {
+ String line;
+ BufferedReader in = new BufferedReader(new InputStreamReader(instream));
+ while ((line = in.readLine()) != null) {
+ println(line);
+ }
+ flush();
+ } catch (IOException e) {
+ OseeLog.log(TestEnvironment.class, Level.SEVERE, e);
+ }
+ }
+ }).start();
+ }
+
+ // public void write(byte[] cbuf, int off, int len) {
+ // super.write(cbuf, off, len);
+ // buffer.append(cbuf, off, len);
+ // masterBuffer.append(cbuf, off, len);
+ // }
+
+ @Override
+ public void flush() {
+ if (builder.length() == 0) {
+ return;
+ }
+ AsynchRemoteJobs.getInstance(this).addJob(new ConsoleOutputJob(callback, builder.toString()));
+ builder.delete(0, builder.length());
+ }
+
+ @Override
+ public void close() {
+ flush();
+ }
+
+ //public PrintStream append(char c) {
+ // return super.append(c);
+ //}
+ //public PrintStream append(CharSequence csq, int start, int end) {
+ // CharSequence cs = (csq == null ? "null" : csq);
+ // write(cs.subSequence(start, end).toString());
+ // return super.append(csq, start, end);
+ //}
+ //public PrintStream append(CharSequence csq) {
+ // return super.append(csq);
+ //}
+ @Override
+ public boolean checkError() {
+ return super.checkError();
+ }
+
+ //public PrintStream format(Locale l, String format, Object[] args) {
+ // return super.format(l, format, args);
+ //}
+ //public PrintStream format(String format, Object[] args) {
+ // return super.format(format, args);
+ //}
+
+ private void newLine() {
+ flush();
+ }
+
+ @Override
+ public void print(boolean b) {
+ builder.append(b ? "true" : "false");
+ super.print(b);
+ }
+
+ @Override
+ public void print(char c) {
+ builder.append(c);
+ super.print(c);
+ }
+
+ @Override
+ public void print(char[] s) {
+ builder.append(s);
+ super.print(s);
+ }
+
+ @Override
+ public void print(double d) {
+ builder.append(d);
+ super.print(d);
+ }
+
+ @Override
+ public void print(float f) {
+ builder.append(f);
+ super.print(f);
+ }
+
+ @Override
+ public void print(int i) {
+ builder.append(i);
+ super.print(i);
+ }
+
+ @Override
+ public void print(long l) {
+ builder.append(l);
+ super.print(l);
+ }
+
+ @Override
+ public void print(Object obj) {
+ builder.append(String.valueOf(obj));
+ super.print(obj);
+ }
+
+ @Override
+ public void print(String s) {
+ builder.append(s);
+ super.print(s);
+ }
+
+ //public PrintStream printf(Locale l, String format, Object[] args) {
+ // return super.printf(l, format, args);
+ //}
+ //public PrintStream printf(String format, Object[] args) {
+ // return super.printf(format, args);
+ //}
+ @Override
+ public void println() {
+ super.println();
+ newLine();
+ }
+
+ @Override
+ public void println(boolean x) {
+ super.println(x);
+ newLine();
+ }
+
+ @Override
+ public void println(char x) {
+ super.println(x);
+ newLine();
+ }
+
+ @Override
+ public void println(char[] x) {
+ super.println(x);
+ newLine();
+ }
+
+ @Override
+ public void println(double x) {
+ newLine();
+ super.println(x);
+ }
+
+ @Override
+ public void println(float x) {
+ super.println(x);
+ newLine();
+ }
+
+ @Override
+ public void println(int x) {
+ super.println(x);
+ newLine();
+ }
+
+ @Override
+ public void println(long x) {
+ super.println(x);
+ newLine();
+ }
+
+ @Override
+ public void println(Object x) {
+ super.println(x);
+ newLine();
+ }
+
+ @Override
+ public void println(String x) {
+ super.println(x);
+ newLine();
+ }
+
+ @Override
+ public void write(int b) {
+ builder.append(b);
+ super.write(b);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/jini/EclipseConsoleWriter.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/jini/EclipseConsoleWriter.java
new file mode 100644
index 000000000..2adfe48b5
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/jini/EclipseConsoleWriter.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.jini;
+
+import java.io.IOException;
+import java.io.Writer;
+
+import org.eclipse.osee.ote.core.IUserSession;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class EclipseConsoleWriter extends Writer {
+
+ private final IUserSession callback;
+ private final StringBuffer buffer;
+ private StringBuffer masterBuffer;
+
+ public EclipseConsoleWriter(IUserSession callback, boolean createMasterBuffer) {
+ this.callback = callback;
+ buffer = new StringBuffer(256);
+ masterBuffer = new StringBuffer(256);
+ }
+
+ public EclipseConsoleWriter(IUserSession callback) {
+ this.callback = callback;
+ buffer = new StringBuffer(256);
+ }
+
+ @Override
+ public synchronized void write(char[] cbuf, int off, int len) {
+ buffer.append(cbuf, off, len);
+ if(masterBuffer != null){
+ masterBuffer.append(cbuf, off, len);
+ }
+ }
+
+ @Override
+ public synchronized void flush() throws IOException {
+ if (buffer.length() > 0 && buffer.charAt(buffer.length() - 1) == '\n') {
+ buffer.deleteCharAt(buffer.length() - 1);
+ }
+ try {
+ callback.initiateInformationalPrompt(buffer.toString());
+ } catch (Exception ex) {
+ System.out.println(buffer.toString());
+ }
+ buffer.delete(0, buffer.length());
+ }
+
+ @Override
+ public synchronized void close() throws IOException {
+ flush();
+ }
+
+ public synchronized String getAllOutput() {
+ if(masterBuffer != null){
+ return masterBuffer.toString();
+ } else {
+ return "MASTER BUFFER NOT ENABLED";
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/jini/ITestEnvironmentCommandCallback.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/jini/ITestEnvironmentCommandCallback.java
new file mode 100644
index 000000000..4123412a8
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/jini/ITestEnvironmentCommandCallback.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.jini;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import org.eclipse.osee.ote.core.TestPrompt;
+import org.eclipse.osee.ote.core.environment.status.ExceptionEvent;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface ITestEnvironmentCommandCallback extends Remote {
+ void initiatePrompt(TestPrompt prompt) throws RemoteException;
+
+ void exceptionReceived(ExceptionEvent event) throws RemoteException;
+
+ long getFileDate(String workspacePath) throws RemoteException;
+
+ byte[] getFile(String workspacePath) throws RemoteException;
+
+ Object[] getValues(String key) throws RemoteException;
+
+ boolean isAlive() throws RemoteException;
+
+ String getFileVersion(String workspacePath) throws RemoteException;
+
+ String getAddress() throws RemoteException;
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/jini/InputStreamConnection.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/jini/InputStreamConnection.java
new file mode 100644
index 000000000..f529fe329
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/jini/InputStreamConnection.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.jini;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
+import java.io.PrintWriter;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+
+public class InputStreamConnection extends PipedInputStream {
+
+ private final PrintWriter writer;
+
+ public InputStreamConnection() {
+ PipedOutputStream piped = new PipedOutputStream();
+ writer = new PrintWriter(piped);
+ try {
+ this.connect(piped);
+ } catch (IOException e) {
+ OseeLog.log(TestEnvironment.class, Level.SEVERE, e);
+ }
+ }
+
+ public InputStreamConnection(OutputStream output) {
+ writer = new PrintWriter(output);
+ }
+
+ public void write(String string) {
+ writer.println(string);
+ writer.flush();
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/CommandAdded.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/CommandAdded.java
new file mode 100644
index 000000000..277017670
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/CommandAdded.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.status;
+
+import java.io.Serializable;
+import org.eclipse.osee.ote.core.environment.command.CommandDescription;
+
+public class CommandAdded implements IServiceStatusDataCommand, Serializable {
+
+ private static final long serialVersionUID = -2555474494093618398L;
+
+ private CommandDescription description;
+
+ public CommandAdded(CommandDescription description) {
+ this.description = description;
+ }
+
+ public CommandAdded() {
+ }
+
+ @Override
+ public CommandDescription getDescription() {
+ return description;
+ }
+
+ public void set(CommandDescription description) {
+ this.description = description;
+ }
+
+ @Override
+ public void accept(IServiceStatusDataVisitor visitor) {
+ if (visitor != null) {
+ visitor.asCommandAdded(this);
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/CommandEndedStatusEnum.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/CommandEndedStatusEnum.java
new file mode 100644
index 000000000..3be3942b8
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/CommandEndedStatusEnum.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.status;
+
+public enum CommandEndedStatusEnum {
+
+ UNDEFINED,
+ ABORTED,
+ HUNG,
+ EXCEPTION,
+ RAN_TO_COMPLETION;
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/CommandRemoved.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/CommandRemoved.java
new file mode 100644
index 000000000..536c3a08f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/CommandRemoved.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.status;
+
+import java.io.Serializable;
+import org.eclipse.osee.ote.core.environment.command.CommandDescription;
+
+public class CommandRemoved implements Serializable, IServiceStatusDataCommand {
+
+ private static final long serialVersionUID = -177791874608013281L;
+ private CommandDescription description;
+ private CommandEndedStatusEnum reason;
+
+ public CommandRemoved(CommandDescription description, CommandEndedStatusEnum reason) {
+ this.description = description;
+ this.reason = reason;
+ }
+
+ public CommandRemoved() {
+ }
+
+ @Override
+ public CommandDescription getDescription() {
+ return description;
+ }
+
+ public void setDescription(CommandDescription description) {
+ this.description = description;
+ }
+
+ public void setReason(CommandEndedStatusEnum reason) {
+ this.reason = reason;
+ }
+
+ public CommandEndedStatusEnum getReason() {
+ return reason;
+ }
+
+ @Override
+ public void accept(IServiceStatusDataVisitor visitor) {
+ if (visitor != null) {
+ visitor.asCommandRemoved(this);
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/CommandStatusEvent.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/CommandStatusEvent.java
new file mode 100644
index 000000000..27c4fa3c0
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/CommandStatusEvent.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.status;
+
+import java.io.Serializable;
+import org.eclipse.osee.ote.core.environment.command.CommandDescription;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class CommandStatusEvent implements Serializable {
+
+ private static final long serialVersionUID = -567005567921815848L;
+ private final CommandDescription description;
+
+ /**
+ * CommandStatusEvent Constructor.
+ *
+ * @param description The command description.
+ */
+ public CommandStatusEvent(CommandDescription description) {
+ super();
+ this.description = description;
+ }
+
+ /**
+ * @return Returns the description.
+ */
+ public CommandDescription getDescription() {
+ return description;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/EnvironmentError.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/EnvironmentError.java
new file mode 100644
index 000000000..e902db4f2
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/EnvironmentError.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.status;
+
+import java.io.Serializable;
+
+public class EnvironmentError implements IServiceStatusData, Serializable {
+
+ private static final long serialVersionUID = -7077313410529981519L;
+ private Throwable err;
+
+ public EnvironmentError(Throwable err) {
+ this.err = err;
+ }
+
+ public EnvironmentError() {
+ }
+
+ public Throwable getErr() {
+ return err;
+ }
+
+ public void set(Throwable err) {
+ this.err = err;
+ }
+
+ @Override
+ public void accept(IServiceStatusDataVisitor visitor) {
+ if (visitor != null) {
+ visitor.asEnvironmentError(this);
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/ExceptionEvent.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/ExceptionEvent.java
new file mode 100644
index 000000000..a5a42fd97
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/ExceptionEvent.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.status;
+
+import java.io.Serializable;
+import org.eclipse.osee.ote.core.environment.command.CommandDescription;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class ExceptionEvent extends CommandStatusEvent implements Serializable {
+
+ private static final long serialVersionUID = -831107014787093973L;
+ private final Throwable throwable;
+
+ public ExceptionEvent(CommandDescription description, Throwable exception) {
+ super(description);
+ this.throwable = exception;
+ }
+
+ public Throwable getException() {
+ return this.throwable;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/IServiceStatusData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/IServiceStatusData.java
new file mode 100644
index 000000000..a9006a1c2
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/IServiceStatusData.java
@@ -0,0 +1,18 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.status;
+
+import java.io.Serializable;
+
+public interface IServiceStatusData extends Serializable {
+
+ public void accept(IServiceStatusDataVisitor visitor);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/IServiceStatusDataCommand.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/IServiceStatusDataCommand.java
new file mode 100644
index 000000000..e6954373b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/IServiceStatusDataCommand.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.status;
+
+import org.eclipse.osee.ote.core.environment.command.CommandDescription;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IServiceStatusDataCommand extends IServiceStatusData {
+
+ public CommandDescription getDescription();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/IServiceStatusDataVisitor.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/IServiceStatusDataVisitor.java
new file mode 100644
index 000000000..51fae4c36
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/IServiceStatusDataVisitor.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.status;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IServiceStatusDataVisitor {
+
+ public void asCommandAdded(CommandAdded commandAdded);
+
+ public void asCommandRemoved(CommandRemoved commandRemoved);
+
+ public void asEnvironmentError(EnvironmentError environmentError);
+
+ public void asSequentialCommandBegan(SequentialCommandBegan sequentialCommandBegan);
+
+ public void asSequentialCommandEnded(SequentialCommandEnded sequentialCommandEnded);
+
+ public void asTestPointUpdate(TestPointUpdate testPointUpdate);
+
+ public void asTestServerCommandComplete(TestServerCommandComplete end);
+
+ public void asTestComplete(TestComplete testComplete);
+
+ public void asTestStart(TestStart testStart);
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/OTEStatusBoard.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/OTEStatusBoard.java
new file mode 100644
index 000000000..b4704338d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/OTEStatusBoard.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.status;
+
+import java.util.List;
+
+import org.eclipse.osee.framework.logging.IHealthStatus;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.command.CommandDescription;
+import org.eclipse.osee.ote.core.environment.command.TestEnvironmentCommand;
+import org.eclipse.osee.ote.core.framework.command.ICommandHandle;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface OTEStatusBoard {
+ public void onCommandAdded(TestEnvironment env, TestEnvironmentCommand cmd);
+
+ public void onCommandRemoved(TestEnvironment env, CommandDescription cmdDesc, CommandEndedStatusEnum status);
+
+ public void onException(String message, Throwable t);
+
+ public void onCommandBegan(TestEnvironment env, CommandDescription cmdDesc);
+
+ public void onCommandFinished(TestEnvironment env, CommandDescription cmdDesc, CommandEndedStatusEnum status);
+
+ public void onTestPointUpdate(int pass, int fail, String testClassName);
+
+ public void onEnvironmentKilled(TestEnvironment env);
+
+ public void dispose();
+
+ public void onTestServerCommandFinished(TestEnvironment env, ICommandHandle handle);
+
+ public void onTestComplete(String className, String serverOutfilePath, String clientOutfilePath, CommandEndedStatusEnum status, List<IHealthStatus> healthStatus);
+
+ public void onTestStart(String className, String serverOutfilePath, String clientOutfilePath);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/SequentialCommandBegan.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/SequentialCommandBegan.java
new file mode 100644
index 000000000..b6182124a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/SequentialCommandBegan.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.status;
+
+import org.eclipse.osee.ote.core.environment.command.CommandDescription;
+
+public class SequentialCommandBegan implements IServiceStatusDataCommand {
+
+ private static final long serialVersionUID = -3278399375292593249L;
+ private CommandDescription description;
+
+ public SequentialCommandBegan(CommandDescription description) {
+ this.description = description;
+ }
+
+ public SequentialCommandBegan() {
+ }
+
+ public void set(CommandDescription description) {
+ this.description = description;
+ }
+
+ @Override
+ public CommandDescription getDescription() {
+ return description;
+ }
+
+ @Override
+ public void accept(IServiceStatusDataVisitor visitor) {
+ if (visitor != null) {
+ visitor.asSequentialCommandBegan(this);
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/SequentialCommandEnded.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/SequentialCommandEnded.java
new file mode 100644
index 000000000..46ab777b5
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/SequentialCommandEnded.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.status;
+
+import java.io.Serializable;
+import org.eclipse.osee.ote.core.environment.command.CommandDescription;
+
+public class SequentialCommandEnded implements IServiceStatusDataCommand, Serializable {
+
+ private static final long serialVersionUID = 9093713855323793915L;
+ private CommandDescription description;
+ private CommandEndedStatusEnum status;
+
+ public SequentialCommandEnded(CommandDescription description, CommandEndedStatusEnum status) {
+ this.description = description;
+ this.status = status;
+ }
+
+ public SequentialCommandEnded() {
+ }
+
+ @Override
+ public CommandDescription getDescription() {
+ return description;
+ }
+
+ public CommandEndedStatusEnum getStatus() {
+ return status;
+ }
+
+ public void set(CommandDescription description, CommandEndedStatusEnum status) {
+ this.description = description;
+ this.status = status;
+ }
+
+ @Override
+ public void accept(IServiceStatusDataVisitor visitor) {
+ if (visitor != null) {
+ visitor.asSequentialCommandEnded(this);
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/StatusBoard.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/StatusBoard.java
new file mode 100644
index 000000000..8789d706c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/StatusBoard.java
@@ -0,0 +1,244 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.status;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.IHealthStatus;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.GCHelper;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.command.CommandDescription;
+import org.eclipse.osee.ote.core.environment.command.TestEnvironmentCommand;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentListener;
+import org.eclipse.osee.ote.core.environment.status.msg.CommandAddedMessage;
+import org.eclipse.osee.ote.core.environment.status.msg.CommandRemovedMessage;
+import org.eclipse.osee.ote.core.environment.status.msg.EnvErrorMessage;
+import org.eclipse.osee.ote.core.environment.status.msg.SequentialCommandBeganMessage;
+import org.eclipse.osee.ote.core.environment.status.msg.SequentialCommandEndedMessage;
+import org.eclipse.osee.ote.core.environment.status.msg.TestCompleteMessage;
+import org.eclipse.osee.ote.core.environment.status.msg.TestPointUpdateMessage;
+import org.eclipse.osee.ote.core.environment.status.msg.TestServerCommandCompleteMessage;
+import org.eclipse.osee.ote.core.environment.status.msg.TestStartMessage;
+import org.eclipse.osee.ote.core.framework.command.ICommandHandle;
+import org.eclipse.osee.ote.core.framework.command.ITestCommandResult;
+import org.eclipse.osee.ote.core.framework.command.TestCommandStatus;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+import org.osgi.service.event.EventAdmin;
+
+/**
+ * @author Robert A. Fisher
+ * @author Ryan D. Brooks
+ */
+public class StatusBoard implements ITestEnvironmentListener, OTEStatusBoard {
+ private static final long TP_UPDATE_THROTTLE = 5000;
+
+ private long lastTpUpdateTime = 0;
+
+ private final ThreadPoolExecutor executor;
+ private final ScheduledExecutorService scheduledExecutor;
+ private final Object testPointLock = new Object();
+ private TestPointStatusBoardRunnable latestTestPointUpdate;
+ private final AtomicBoolean executeLatestTestPointUpdate = new AtomicBoolean();
+private EventAdmin eventAdmin;
+
+ // private Future<?> lastTestPointUpdate;
+
+ /**
+ * StatusBoard Constructor. This class handles passing status information from the test enviornment to the UI's
+ * (StatusHandler Class).
+ */
+ public StatusBoard() {
+ super();
+ GCHelper.getGCHelper().addRefWatch(this);
+ executeLatestTestPointUpdate.set(false);
+ executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(1);
+ scheduledExecutor = Executors.newSingleThreadScheduledExecutor();
+ scheduledExecutor.scheduleAtFixedRate(new Runnable() {
+
+ @Override
+ public void run() {
+ synchronized (testPointLock) {
+ if (executeLatestTestPointUpdate.get()) {
+ executeLatestTestPointUpdate.set(false);
+ lastTpUpdateTime = System.currentTimeMillis();
+ executor.submit(latestTestPointUpdate);
+ }
+ }
+ }
+
+ }, TP_UPDATE_THROTTLE, TP_UPDATE_THROTTLE, TimeUnit.MILLISECONDS);
+ }
+
+
+ public void start(){
+
+ }
+
+ public void stop(){
+ dispose();
+ }
+
+ public void bindEventAdmin(EventAdmin eventAdmin){
+ this.eventAdmin = eventAdmin;
+ }
+
+ public void unbindEventAdmin(EventAdmin eventAdmin){
+ this.eventAdmin = null;
+ }
+
+ @Override
+ public void onCommandAdded(TestEnvironment env, TestEnvironmentCommand cmd) {
+ CommandAdded cmdAdded = new CommandAdded();
+ cmdAdded.set(cmd.getDescription());
+ try {
+ CommandAddedMessage msg = new CommandAddedMessage(cmdAdded);
+ notifyListeners(msg);
+ } catch (IOException e) {
+ OseeLog.log(StatusBoard.class, Level.SEVERE, e);
+ }
+ }
+
+ @Override
+ public void onCommandRemoved(TestEnvironment env, CommandDescription cmdDesc, CommandEndedStatusEnum status) {
+ CommandRemoved cmdRemoved = new CommandRemoved();
+ cmdRemoved.setDescription(cmdDesc);
+ cmdRemoved.setReason(status);
+ try {
+ CommandRemovedMessage msg = new CommandRemovedMessage(cmdRemoved);
+ notifyListeners(msg);
+ } catch (IOException e) {
+ OseeLog.log(StatusBoard.class, Level.SEVERE, e);
+ }
+ }
+
+ @Override
+ public void onException(String message, Throwable t) {
+ EnvironmentError envError = new EnvironmentError();
+ envError.set(t);
+ try {
+ EnvErrorMessage msg = new EnvErrorMessage(envError);
+ notifyListeners(msg);
+ } catch (IOException e) {
+ OseeLog.log(StatusBoard.class, Level.SEVERE, e);
+ }
+ }
+
+ @Override
+ public void onCommandBegan(TestEnvironment env, CommandDescription cmdDesc) {
+ SequentialCommandBegan seqCmdBegan = new SequentialCommandBegan();
+ seqCmdBegan.set(cmdDesc);
+ try {
+ SequentialCommandBeganMessage msg = new SequentialCommandBeganMessage(seqCmdBegan);
+ notifyListeners(msg);
+ } catch (IOException e) {
+ OseeLog.log(StatusBoard.class, Level.SEVERE, e);
+ }
+ }
+
+ @Override
+ public void onCommandFinished(TestEnvironment env, CommandDescription cmdDesc, CommandEndedStatusEnum status) {
+ OseeLog.log(TestEnvironment.class, Level.INFO, "To End: " + cmdDesc.getGuid());
+
+ SequentialCommandEnded seqCmdEnded = new SequentialCommandEnded();
+ seqCmdEnded.set(cmdDesc, status);
+ try {
+ SequentialCommandEndedMessage msg = new SequentialCommandEndedMessage(seqCmdEnded);
+ notifyListeners(msg);
+ } catch (IOException e) {
+ OseeLog.log(StatusBoard.class, Level.SEVERE, e);
+ }
+ }
+
+ @Override
+ public void onTestPointUpdate(int pass, int fail, String testClassName) {
+ try {
+ TestPointStatusBoardRunnable runnable =
+ new TestPointStatusBoardRunnable(new TestPointUpdateMessage(new TestPointUpdate(pass, fail, testClassName)), eventAdmin);
+ if (System.currentTimeMillis() - lastTpUpdateTime > TP_UPDATE_THROTTLE) {
+ lastTpUpdateTime = System.currentTimeMillis();
+ executor.submit(runnable);
+ } else {
+ synchronized (testPointLock) {
+ latestTestPointUpdate = runnable;
+ executeLatestTestPointUpdate.set(true);
+ }
+ }
+ } catch (IOException e) {
+ OseeLog.log(StatusBoard.class, Level.SEVERE, e);
+ }
+ }
+
+ @SuppressWarnings("rawtypes")
+ void notifyListeners(final SerializedClassMessage msg) {
+ executor.execute(new StatusBoardRunnable(msg) {
+ @Override
+ public void run() {
+ OteEventMessageUtil.sendEvent(msg, eventAdmin);
+ }
+ });
+ }
+
+ @Override
+ public void onEnvironmentKilled(TestEnvironment env) {
+
+ }
+
+ @Override
+ public void dispose() {
+ }
+
+ @Override
+ public void onTestServerCommandFinished(TestEnvironment env, ICommandHandle handle) {
+ try {
+ ITestCommandResult status = handle.get();
+ TestCommandStatus cmdStatus = null;
+ Throwable th = null;
+ if(status != null){
+ cmdStatus = status.getStatus();
+ th = status.getThrowable();
+ }
+ TestServerCommandCompleteMessage msg = new TestServerCommandCompleteMessage(new TestServerCommandComplete(cmdStatus, th));
+ notifyListeners(msg);
+ } catch (IOException e) {
+ OseeLog.log(StatusBoard.class, Level.SEVERE, e);
+ }
+ }
+
+ @Override
+ public void onTestComplete(String className, String serverOutfilePath, String clientOutfilePath, CommandEndedStatusEnum status, List<IHealthStatus> healthStatus) {
+ try {
+ TestCompleteMessage msg = new TestCompleteMessage(new TestComplete(className, serverOutfilePath, clientOutfilePath, status, healthStatus));
+ notifyListeners(msg);
+ } catch (IOException e) {
+ OseeLog.log(StatusBoard.class, Level.SEVERE, e);
+ }
+ }
+
+ @Override
+ public void onTestStart(String className, String serverOutfilePath, String clientOutfilePath ) {
+ try {
+ TestStartMessage msg = new TestStartMessage(new TestStart(className, serverOutfilePath, clientOutfilePath));
+ notifyListeners(msg);
+ } catch (IOException e) {
+ OseeLog.log(StatusBoard.class, Level.SEVERE, e);
+ }
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/StatusBoardRunnable.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/StatusBoardRunnable.java
new file mode 100644
index 000000000..7cbb6e51c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/StatusBoardRunnable.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.status;
+
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public abstract class StatusBoardRunnable implements Runnable {
+
+ private final SerializedClassMessage data;
+
+ public StatusBoardRunnable(SerializedClassMessage msg) {
+ this.data = msg;
+ }
+
+ protected SerializedClassMessage getData() {
+ return data;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestComplete.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestComplete.java
new file mode 100644
index 000000000..1c5083d5c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestComplete.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.status;
+
+import java.io.Serializable;
+import java.util.List;
+import org.eclipse.osee.framework.logging.IHealthStatus;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class TestComplete implements Serializable, IServiceStatusData {
+ private static final long serialVersionUID = -7969548718769021626L;
+ private final String className;
+ private final CommandEndedStatusEnum status;
+ private final String serverOutfilePath;
+ private final String clientOutfilePath;
+ private final List<IHealthStatus> healthStatus;
+
+ public TestComplete(String className, String serverOutfilePath, String clientOutfilePath, CommandEndedStatusEnum status, List<IHealthStatus> healthStatus) {
+ this.className = className;
+ this.serverOutfilePath = serverOutfilePath;
+ this.clientOutfilePath = clientOutfilePath;
+ this.status = status;
+ this.healthStatus = healthStatus;
+ }
+
+ @Override
+ public void accept(IServiceStatusDataVisitor visitor) {
+ visitor.asTestComplete(this);
+ }
+
+ public String getClassName() {
+ return className;
+ }
+
+ public CommandEndedStatusEnum getStatus() {
+ return status;
+ }
+
+ public String getServerOutfilePath() {
+ return serverOutfilePath;
+ }
+
+ public String getClientOutfilePath() {
+ return clientOutfilePath;
+ }
+
+ public List<IHealthStatus> getHealthStatus() {
+ return this.healthStatus;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestPointStatusBoardRunnable.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestPointStatusBoardRunnable.java
new file mode 100644
index 000000000..6ced1e169
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestPointStatusBoardRunnable.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.status;
+
+import org.eclipse.osee.ote.core.environment.status.msg.TestPointUpdateMessage;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.osgi.service.event.EventAdmin;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class TestPointStatusBoardRunnable extends StatusBoardRunnable {
+
+ private final EventAdmin eventAdmin;
+
+ public TestPointStatusBoardRunnable(TestPointUpdateMessage testPointUpdateMessage, EventAdmin eventAdmin) {
+ super(testPointUpdateMessage);
+ this.eventAdmin = eventAdmin;
+ }
+
+ @Override
+ public void run() {
+ OteEventMessageUtil.sendEvent(getData(), eventAdmin);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestPointUpdate.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestPointUpdate.java
new file mode 100644
index 000000000..676e7706a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestPointUpdate.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.status;
+
+import java.io.Serializable;
+import org.eclipse.osee.ote.core.environment.command.CommandDescription;
+
+public class TestPointUpdate implements Serializable, IServiceStatusDataCommand {
+
+ private static final long serialVersionUID = 7157851807444983673L;
+ private int pass;
+ private int fail;
+ private CommandDescription description;
+ private String testClassName;
+
+ public TestPointUpdate(int pass, int fail, CommandDescription description) {
+ this.pass = pass;
+ this.fail = fail;
+ this.description = description;
+ }
+
+ public TestPointUpdate(int pass, int fail, String testClassName) {
+ this.pass = pass;
+ this.fail = fail;
+ this.testClassName = testClassName;
+ }
+
+ public TestPointUpdate() {
+ }
+
+ public int getFail() {
+ return fail;
+ }
+
+ public int getPass() {
+ return pass;
+ }
+
+ public String getClassName() {
+ return testClassName;
+ }
+
+ @Override
+ public CommandDescription getDescription() {
+ return description;
+ }
+
+ public void set(int pass, int fail, CommandDescription description) {
+ this.pass = pass;
+ this.fail = fail;
+ this.description = description;
+ }
+
+ @Override
+ public void accept(IServiceStatusDataVisitor visitor) {
+ if (visitor != null) {
+ visitor.asTestPointUpdate(this);
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestServerCommandComplete.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestServerCommandComplete.java
new file mode 100644
index 000000000..ca2310c90
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestServerCommandComplete.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.status;
+
+import java.io.Serializable;
+
+import org.eclipse.osee.ote.core.framework.command.TestCommandStatus;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class TestServerCommandComplete implements Serializable, IServiceStatusData {
+
+ private static final long serialVersionUID = -2678833105694275416L;
+ private TestCommandStatus cmdStatus;
+ private Throwable th;
+
+ public TestServerCommandComplete(TestCommandStatus cmdStatus, Throwable th) {
+ this.cmdStatus = cmdStatus;
+ this.th = th;
+ }
+
+ @Override
+ public void accept(IServiceStatusDataVisitor visitor) {
+ visitor.asTestServerCommandComplete(this);
+ }
+
+ public TestCommandStatus getCmdStatus() {
+ return cmdStatus;
+ }
+
+ public Throwable getThrowable() {
+ return th;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestStart.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestStart.java
new file mode 100644
index 000000000..0d8f90cb7
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/TestStart.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.status;
+
+import java.io.Serializable;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class TestStart implements IServiceStatusData, Serializable {
+
+ private static final long serialVersionUID = -3458459132672153638L;
+ private final String testClassName;
+ private final String serverOutfilePath;
+ private final String clientOutfilePath;
+
+ public TestStart(String testClassName, String serverOutfilePath, String clientOutfilePath) {
+ this.testClassName = testClassName;
+ this.serverOutfilePath = serverOutfilePath;
+ this.clientOutfilePath = clientOutfilePath;
+ }
+
+ @Override
+ public void accept(IServiceStatusDataVisitor visitor) {
+ visitor.asTestStart(this);
+ }
+
+ public String getTestClassName() {
+ return testClassName;
+ }
+
+ public String getServerOutfilePath() {
+ return serverOutfilePath;
+ }
+
+ public String getClientOutfilePath() {
+ return clientOutfilePath;
+ }
+
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/CommandAddedMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/CommandAddedMessage.java
new file mode 100644
index 000000000..893f1885f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/CommandAddedMessage.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.status.msg;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.core.environment.status.CommandAdded;
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class CommandAddedMessage extends SerializedClassMessage<CommandAdded> {
+
+ public static final String EVENT = "ote/status/commandAdded";
+
+ public CommandAddedMessage() {
+ super(EVENT);
+ }
+
+ public CommandAddedMessage(CommandAdded commandAdded) throws IOException {
+ super(EVENT, commandAdded);
+ }
+
+ public CommandAddedMessage(byte[] bytes){
+ super(bytes);
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/CommandRemovedMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/CommandRemovedMessage.java
new file mode 100644
index 000000000..70c7cd6a5
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/CommandRemovedMessage.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.status.msg;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.core.environment.status.CommandRemoved;
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class CommandRemovedMessage extends SerializedClassMessage<CommandRemoved> {
+
+ public static final String EVENT = "ote/status/commandRemoved";
+
+ public CommandRemovedMessage() {
+ super(EVENT);
+ }
+
+ public CommandRemovedMessage(CommandRemoved cmdRemoved) throws IOException {
+ super("ote/status/commandRemoved", cmdRemoved);
+ }
+
+ public CommandRemovedMessage(byte[] bytes){
+ super(bytes);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/EnvErrorMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/EnvErrorMessage.java
new file mode 100644
index 000000000..344684b66
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/EnvErrorMessage.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.status.msg;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.core.environment.status.EnvironmentError;
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class EnvErrorMessage extends SerializedClassMessage<EnvironmentError> {
+
+ public static final String EVENT = "ote/status/envError";
+
+ public EnvErrorMessage() {
+ super(EVENT);
+ }
+
+ public EnvErrorMessage(EnvironmentError envError) throws IOException {
+ super(EVENT, envError);
+ }
+
+ public EnvErrorMessage(byte[] bytes) {
+ super(bytes);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/SequentialCommandBeganMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/SequentialCommandBeganMessage.java
new file mode 100644
index 000000000..f7363d8f5
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/SequentialCommandBeganMessage.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.status.msg;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.core.environment.status.SequentialCommandBegan;
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class SequentialCommandBeganMessage extends SerializedClassMessage<SequentialCommandBegan> {
+
+ public static final String EVENT = "ote/status/sequentialCommandBegan";
+
+ public SequentialCommandBeganMessage() {
+ super(EVENT);
+ }
+
+ public SequentialCommandBeganMessage(SequentialCommandBegan seqCmdBegan) throws IOException {
+ super(EVENT, seqCmdBegan);
+ }
+
+ public SequentialCommandBeganMessage(byte[] bytes){
+ super(bytes);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/SequentialCommandEndedMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/SequentialCommandEndedMessage.java
new file mode 100644
index 000000000..8e53ca253
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/SequentialCommandEndedMessage.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.status.msg;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.core.environment.status.SequentialCommandEnded;
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class SequentialCommandEndedMessage extends SerializedClassMessage<SequentialCommandEnded> {
+
+ public static final String EVENT = "ote/status/sequentialCommandEnded";
+
+ public SequentialCommandEndedMessage() {
+ super(EVENT);
+ }
+
+ public SequentialCommandEndedMessage(SequentialCommandEnded seqCmdEnded) throws IOException {
+ super(EVENT, seqCmdEnded);
+ }
+
+ public SequentialCommandEndedMessage(byte[] bytes){
+ super(bytes);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/TestCompleteMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/TestCompleteMessage.java
new file mode 100644
index 000000000..5efa08a29
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/TestCompleteMessage.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.status.msg;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.core.environment.status.TestComplete;
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class TestCompleteMessage extends SerializedClassMessage<TestComplete> {
+
+ public static final String EVENT = "ote/status/testComplete";
+
+ public TestCompleteMessage() {
+ super(EVENT);
+ }
+
+ public TestCompleteMessage(TestComplete testComplete) throws IOException {
+ super(EVENT, testComplete);
+ }
+
+ public TestCompleteMessage(byte[] bytes){
+ super(bytes);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/TestPointUpdateMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/TestPointUpdateMessage.java
new file mode 100644
index 000000000..82795ccc3
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/TestPointUpdateMessage.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.status.msg;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.core.environment.status.TestPointUpdate;
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class TestPointUpdateMessage extends SerializedClassMessage<TestPointUpdate> {
+
+ public static final String EVENT = "ote/status/testPointUpdate";
+
+ public TestPointUpdateMessage() {
+ super(EVENT);
+ }
+
+ public TestPointUpdateMessage(TestPointUpdate testPointUpdate) throws IOException {
+ super(EVENT, testPointUpdate);
+ }
+
+ public TestPointUpdateMessage(byte[] bytes){
+ super(bytes);
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/TestServerCommandCompleteMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/TestServerCommandCompleteMessage.java
new file mode 100644
index 000000000..ca7306d8a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/TestServerCommandCompleteMessage.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.status.msg;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.core.environment.status.TestServerCommandComplete;
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class TestServerCommandCompleteMessage extends SerializedClassMessage<TestServerCommandComplete> {
+
+ public static final String EVENT = "ote/status/testServerCommandComplete";
+
+ public TestServerCommandCompleteMessage() {
+ super(EVENT);
+ }
+
+ public TestServerCommandCompleteMessage(
+ TestServerCommandComplete testServerCommandComplete) throws IOException {
+ super(EVENT, testServerCommandComplete);
+ }
+
+ public TestServerCommandCompleteMessage(byte[] bytes){
+ super(bytes);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/TestStartMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/TestStartMessage.java
new file mode 100644
index 000000000..88dae1603
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/environment/status/msg/TestStartMessage.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.environment.status.msg;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.core.environment.status.TestStart;
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class TestStartMessage extends SerializedClassMessage<TestStart> {
+
+ public static final String EVENT = "ote/status/testStart";
+
+ public TestStartMessage() {
+ super(EVENT);
+ }
+
+ public TestStartMessage(TestStart testStart) throws IOException {
+ super(EVENT, testStart);
+ }
+
+ public TestStartMessage(byte[] bytes) {
+ super(bytes);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/BaseCommandContextFactory.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/BaseCommandContextFactory.java
new file mode 100644
index 000000000..b2eb2f9b1
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/BaseCommandContextFactory.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework;
+
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.framework.command.ITestContext;
+import org.eclipse.osee.ote.core.framework.command.ITestServerCommand;
+
+public class BaseCommandContextFactory implements ICommandContextFactory {
+ @Override
+ public ITestContext getContext(final TestEnvironment testEnvironment, final ITestServerCommand cmd) {
+ return testEnvironment;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/BaseRunManager.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/BaseRunManager.java
new file mode 100644
index 000000000..53378b7ae
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/BaseRunManager.java
@@ -0,0 +1,138 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework;
+
+import java.util.logging.Level;
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.framework.jdk.core.util.Conditions;
+import org.eclipse.osee.framework.logging.BaseStatus;
+import org.eclipse.osee.framework.logging.IHealthStatus;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.framework.testrun.ITestResultCollector;
+import org.eclipse.osee.ote.core.framework.testrun.ITestResultCollectorFactory;
+import org.eclipse.osee.ote.core.framework.testrun.ITestRunManager;
+
+public class BaseRunManager implements IRunManager {
+
+ private final ITestRunManager testRunManager;
+ private final ITestLifecycleListenerProvider lifecycleListenerProvider;
+ private final ITestResultCollectorFactory resultCollectorFactory;
+ private ITestResultCollector resultCollector;
+
+ public BaseRunManager(ITestRunManager testRunManager, ITestLifecycleListenerProvider lifecycleListenerProvider, ITestResultCollectorFactory resultCollectorFactory) {
+ this.lifecycleListenerProvider = lifecycleListenerProvider;
+ this.testRunManager = testRunManager;
+ this.resultCollectorFactory = resultCollectorFactory;
+ }
+
+ @Override
+ public boolean addListener(ITestLifecycleListener listener) {
+ return lifecycleListenerProvider.addListener(listener);
+ }
+
+ @Override
+ public void clearAllListeners() {
+ lifecycleListenerProvider.clear();
+ }
+
+ @Override
+ public boolean removeListener(ITestLifecycleListener listener) {
+ return lifecycleListenerProvider.removeListener(listener);
+ }
+
+ @Override
+ public IMethodResult run(TestEnvironment env, IPropertyStore propertyStore) {
+ try {
+ this.resultCollector = resultCollectorFactory.createCollector();
+ this.resultCollector.initialize(propertyStore, env);
+ ResultBuilder rb = new ResultBuilder(true);
+ rb.append(lifecycleListenerProvider.notifyPreInstantiation(propertyStore, env));
+ if (rb.isReturnStatusOK()) {
+ rb.append(testRunManager.initialize(env, propertyStore));
+ if (rb.isReturnStatusOK()) {
+ try {
+ rb.append(
+ lifecycleListenerProvider.notifyPostInstantiation(propertyStore, testRunManager.getTest(), env));
+ } catch (Throwable th) {
+ MethodResultImpl result = new MethodResultImpl(ReturnCode.ERROR);
+ result.addStatus(new BaseStatus(this.getClass().getName(), Level.SEVERE, th));
+ rb.append(result);
+ }
+ if (rb.isReturnStatusOK()) {
+ try {
+ rb.append(testRunManager.run(propertyStore, env));
+ } catch (Throwable th) {
+ MethodResultImpl result = new MethodResultImpl(ReturnCode.ERROR);
+ result.addStatus(new BaseStatus(this.getClass().getName(), Level.SEVERE, th));
+ rb.append(result);
+ }
+ } else {
+ TestScript test = testRunManager.getTest();
+ boolean aborted = false;
+ if (Conditions.hasValues(rb.get().getStatus())) {
+ for (IHealthStatus hs : rb.get().getStatus()) {
+ if (hs.getException() != null) {
+ test.abortDueToThrowable(hs.getException());
+ aborted = true;
+ break;
+ }
+ }
+ }
+ if (!aborted) {
+ test.abort();
+ }
+ }
+ }
+ rb.append(lifecycleListenerProvider.notifyPreDispose(propertyStore, testRunManager.getTest(), env));
+ rb.append(testRunManager.dispose());
+ rb.append(lifecycleListenerProvider.notifyPostDispose(propertyStore, env));
+ }
+ this.resultCollector.dispose(env);
+ this.resultCollector = null;
+ if (!rb.isReturnStatusOK()) {
+ OseeLog.log(BaseRunManager.class, Level.SEVERE, rb.toString());
+ }
+ return rb.get();
+ } catch (Throwable th) {
+ th.printStackTrace();
+ MethodResultImpl status = new MethodResultImpl(ReturnCode.ERROR);
+ status.addStatus(new BaseStatus(BaseRunManager.class.getName(), Level.SEVERE, th));
+ return status;
+ }
+ }
+
+ @Override
+ public boolean abort() {
+ return testRunManager.abort();
+ }
+
+ @Override
+ public boolean abort(Throwable th, boolean wait) {
+ return testRunManager.abort(th, wait);
+ }
+
+ @Override
+ public boolean isAborted() {
+ return testRunManager.isAborted();
+ }
+
+ @Override
+ public TestScript getCurrentScript() {
+ return testRunManager.getTest();
+ }
+
+ @Override
+ public boolean isCurrentThreadScript() {
+ return testRunManager.isCurrentThreadScript();
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/BaseTestLifecycleListenerProvider.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/BaseTestLifecycleListenerProvider.java
new file mode 100644
index 000000000..2a85d0357
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/BaseTestLifecycleListenerProvider.java
@@ -0,0 +1,123 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework;
+
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.framework.logging.BaseStatus;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.framework.event.IEventData;
+import org.eclipse.osee.ote.core.framework.event.IEventDataProvider;
+
+public class BaseTestLifecycleListenerProvider implements ITestLifecycleListenerProvider {
+
+ private final IEventDataProvider eventProvider;
+ private final List<ITestLifecycleListener> listeners;
+ private int listenerCountAtPreinit = 0;
+
+ public BaseTestLifecycleListenerProvider(IEventDataProvider eventProvider) {
+ this.eventProvider = eventProvider;
+ listeners = new CopyOnWriteArrayList<>();
+ }
+
+ @Override
+ public void clear() {
+ listeners.clear();
+ }
+
+ @Override
+ public boolean addListener(ITestLifecycleListener listener) {
+ return listeners.add(listener);
+ }
+
+ @Override
+ public IMethodResult notifyPostDispose(IPropertyStore propertyStore, TestEnvironment env) {
+ IEventData eventData = eventProvider.getEventData(propertyStore, null);
+ MethodResultImpl result = new MethodResultImpl(ReturnCode.OK);
+ for (ITestLifecycleListener listener : listeners) {
+ try {
+ result = collectStatus(result, listener.postDispose(eventData, env));
+ } catch (Throwable th) {
+ result = collectStatus(result,new MethodResultImpl(ReturnCode.ERROR));
+ result.addStatus(new BaseStatus(this.getClass().getName(), Level.SEVERE, th));
+ }
+ }
+
+ int newSize = listeners.size();
+ if( this.listenerCountAtPreinit != newSize)
+ {
+ System.err.printf("+++++++++++++++++++++++++++++++++++++++++There are now %s listeners when there were %s to start with\n", listenerCountAtPreinit, newSize );
+ for (ITestLifecycleListener listener : listeners) {
+ System.err.println("Listener: " + listener.getClass().getName());
+ }
+ System.err.println("-----------------------------------------------------------------------------------------------------");
+ }
+ return result;
+ }
+
+ @Override
+ public IMethodResult notifyPostInstantiation(IPropertyStore propertyStore, TestScript test, TestEnvironment env) {
+ IEventData eventData = eventProvider.getEventData(propertyStore, test);
+ MethodResultImpl result = new MethodResultImpl(ReturnCode.OK);
+ for (ITestLifecycleListener listener : listeners) {
+ result = collectStatus(result, listener.postInstantiation(eventData, env));
+ }
+ return result;
+ }
+
+ @Override
+ public IMethodResult notifyPreDispose(IPropertyStore propertyStore, TestScript test, TestEnvironment env) {
+ IEventData eventData = eventProvider.getEventData(propertyStore, test);
+ MethodResultImpl result = new MethodResultImpl(ReturnCode.OK);
+ for (ITestLifecycleListener listener : listeners) {
+ try {
+ result = collectStatus(result, listener.preDispose(eventData, env));
+ } catch (Throwable th) {
+ result = collectStatus(result,new MethodResultImpl(ReturnCode.ERROR));
+ result.addStatus(new BaseStatus(this.getClass().getName(), Level.SEVERE, th));
+ }
+ }
+ return result;
+ }
+
+ @Override
+ public IMethodResult notifyPreInstantiation(IPropertyStore propertyStore, TestEnvironment env) {
+ IEventData eventData = eventProvider.getEventData(propertyStore, null);
+ MethodResultImpl result = new MethodResultImpl(ReturnCode.OK);
+
+ for (ITestLifecycleListener listener : listeners) {
+ result = collectStatus(result, listener.preInstantiation(eventData, env));
+ }
+
+ this.listenerCountAtPreinit = listeners.size();
+ return result;
+ }
+
+ @Override
+ public boolean removeListener(ITestLifecycleListener listener) {
+ return listeners.remove(listener);
+ }
+
+ private MethodResultImpl collectStatus(MethodResultImpl result, IMethodResult listenerResult) {
+ if (listenerResult.getReturnCode() != ReturnCode.OK) {
+ if (result.getReturnCode() == ReturnCode.OK) {
+ result = new MethodResultImpl(ReturnCode.OK);
+ }
+ result.setReturnCode(listenerResult.getReturnCode());
+ result.addStatus(listenerResult.getStatus());
+ }
+ return result;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/DestroyableService.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/DestroyableService.java
new file mode 100644
index 000000000..5fefb422a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/DestroyableService.java
@@ -0,0 +1,15 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework;
+
+public interface DestroyableService {
+ void destroy();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/ICommandContextFactory.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/ICommandContextFactory.java
new file mode 100644
index 000000000..ecae76d59
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/ICommandContextFactory.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework;
+
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.framework.command.ITestContext;
+import org.eclipse.osee.ote.core.framework.command.ITestServerCommand;
+
+public interface ICommandContextFactory {
+
+ ITestContext getContext(TestEnvironment testEnvironment, ITestServerCommand cmd);
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/IMethodResult.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/IMethodResult.java
new file mode 100644
index 000000000..8b9124312
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/IMethodResult.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework;
+
+import java.util.List;
+import org.eclipse.osee.framework.logging.IHealthStatus;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IMethodResult {
+ List<IHealthStatus> getStatus();
+
+ ReturnCode getReturnCode();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/IRunManager.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/IRunManager.java
new file mode 100644
index 000000000..ff2082eb5
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/IRunManager.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework;
+
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+
+public interface IRunManager {
+
+ public boolean addListener(ITestLifecycleListener listener);
+
+ public void clearAllListeners();
+
+ public boolean removeListener(ITestLifecycleListener listener);
+
+ public IMethodResult run(TestEnvironment env, IPropertyStore propertyStore);
+
+ public boolean abort();
+
+ public boolean abort(Throwable th, boolean wait);
+
+ public boolean isAborted();
+
+ public TestScript getCurrentScript();
+
+ public boolean isCurrentThreadScript();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/ITestLifecycleListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/ITestLifecycleListener.java
new file mode 100644
index 000000000..c17c58f0c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/ITestLifecycleListener.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework;
+
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.framework.event.IEventData;
+
+public interface ITestLifecycleListener {
+
+ IMethodResult preInstantiation(IEventData eventData, TestEnvironment env);
+
+ IMethodResult postInstantiation(IEventData eventData, TestEnvironment env);
+
+ IMethodResult preDispose(IEventData eventData, TestEnvironment env);
+
+ IMethodResult postDispose(IEventData eventData, TestEnvironment env);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/ITestLifecycleListenerProvider.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/ITestLifecycleListenerProvider.java
new file mode 100644
index 000000000..616e290cb
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/ITestLifecycleListenerProvider.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework;
+
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+
+public interface ITestLifecycleListenerProvider {
+ void clear();
+
+ boolean addListener(ITestLifecycleListener listener);
+
+ boolean removeListener(ITestLifecycleListener listener);
+
+ IMethodResult notifyPostDispose(IPropertyStore propertyStore, TestEnvironment env);
+
+ IMethodResult notifyPostInstantiation(IPropertyStore propertyStore, TestScript test, TestEnvironment env);
+
+ IMethodResult notifyPreDispose(IPropertyStore propertyStore, TestScript test, TestEnvironment env);
+
+ IMethodResult notifyPreInstantiation(IPropertyStore propertyStore, TestEnvironment env);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/MethodResultImpl.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/MethodResultImpl.java
new file mode 100644
index 000000000..7b13317a5
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/MethodResultImpl.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.framework.logging.IHealthStatus;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class MethodResultImpl implements IMethodResult {
+
+ public static MethodResultImpl combine(IMethodResult result1, IMethodResult result2) {
+ if (result1.getReturnCode() == ReturnCode.OK && result2.getReturnCode() == ReturnCode.OK) {
+ return new MethodResultImpl(ReturnCode.OK);
+ } else {
+ return new MethodResultImpl(result1, result2);
+ }
+ }
+
+ private List<IHealthStatus> statuses;
+ private ReturnCode returnCode;
+
+ public MethodResultImpl(ReturnCode returnCode) {
+ statuses = new ArrayList<>();
+ this.returnCode = returnCode;
+ }
+
+ private MethodResultImpl(IMethodResult result1, IMethodResult result2) {
+ if (result1.getReturnCode() != ReturnCode.OK) {
+ addStatus(result1.getStatus());
+ setReturnCode(result1.getReturnCode());
+ }
+ if (result2.getReturnCode() != ReturnCode.OK) {
+ addStatus(result2.getStatus());
+ setReturnCode(result2.getReturnCode());
+ }
+ }
+
+ @Override
+ public ReturnCode getReturnCode() {
+ return returnCode;
+ }
+
+ @Override
+ public List<IHealthStatus> getStatus() {
+ return statuses;
+ }
+
+ public void setReturnCode(ReturnCode returnCode) {
+ this.returnCode = returnCode;
+ }
+
+ public void addStatus(IHealthStatus status) {
+ statuses.add(status);
+ }
+
+ public void addStatus(List<IHealthStatus> status) {
+ statuses.addAll(status);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append(returnCode.toString());
+ sb.append("\n");
+ for (IHealthStatus status : statuses) {
+ sb.append(status.toString());
+ sb.append("\n");
+ }
+ return sb.toString();
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/ResultBuilder.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/ResultBuilder.java
new file mode 100644
index 000000000..501205682
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/ResultBuilder.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class ResultBuilder {
+
+ private final MethodResultImpl result;
+ private final boolean logToHM;
+
+ public ResultBuilder(boolean logToHM) {
+ result = new MethodResultImpl(ReturnCode.OK);
+ this.logToHM = logToHM;
+ }
+
+ public MethodResultImpl append(IMethodResult result) {
+ if (logToHM) {
+ OseeLog.reportStatus(result.getStatus());
+ }
+ this.result.addStatus(result.getStatus());
+ if (result.getReturnCode() != ReturnCode.OK) {
+ this.result.setReturnCode(result.getReturnCode());
+ }
+ return this.result;
+ }
+
+ public IMethodResult get() {
+ return this.result;
+ }
+
+ public boolean isReturnStatusOK() {
+ return this.result.getReturnCode() == ReturnCode.OK;
+ }
+
+ @Override
+ public String toString() {
+ return result.toString();
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/ReturnCode.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/ReturnCode.java
new file mode 100644
index 000000000..c5fd6dcd6
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/ReturnCode.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public enum ReturnCode {
+ OK,
+ ERROR,
+ ABORTED
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/adapter/TestLifecycleListenerAdapter.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/adapter/TestLifecycleListenerAdapter.java
new file mode 100644
index 000000000..21ed3946e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/adapter/TestLifecycleListenerAdapter.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.adapter;
+
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.framework.IMethodResult;
+import org.eclipse.osee.ote.core.framework.ITestLifecycleListener;
+import org.eclipse.osee.ote.core.framework.MethodResultImpl;
+import org.eclipse.osee.ote.core.framework.ReturnCode;
+import org.eclipse.osee.ote.core.framework.event.IEventData;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TestLifecycleListenerAdapter implements ITestLifecycleListener {
+
+ @Override
+ public IMethodResult postDispose(IEventData eventData, TestEnvironment env) {
+ return new MethodResultImpl(ReturnCode.OK);
+ }
+
+ @Override
+ public IMethodResult postInstantiation(IEventData eventData, TestEnvironment env) {
+ return new MethodResultImpl(ReturnCode.OK);
+ }
+
+ @Override
+ public IMethodResult preDispose(IEventData eventData, TestEnvironment env) {
+ return new MethodResultImpl(ReturnCode.OK);
+ }
+
+ @Override
+ public IMethodResult preInstantiation(IEventData eventData, TestEnvironment env) {
+ return new MethodResultImpl(ReturnCode.OK);
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/BaseCommandManager.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/BaseCommandManager.java
new file mode 100644
index 000000000..1f9e984a1
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/BaseCommandManager.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.command;
+
+import java.rmi.server.ExportException;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+
+import org.eclipse.osee.ote.core.OTESessionManager;
+import org.eclipse.osee.ote.core.ServiceUtility;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.status.OTEStatusBoard;
+import org.eclipse.osee.ote.core.framework.thread.OteThreadManager;
+
+public class BaseCommandManager implements ICommandManager {
+
+ private final ExecutorService commands;
+ private final ExecutorService commandResponse;
+ private final Map<ITestServerCommand, Future<ITestCommandResult>> cmdMap;
+
+ public BaseCommandManager() {
+ OteThreadManager threadManager = OteThreadManager.getInstance();
+ commands = Executors.newSingleThreadExecutor(threadManager.createNewFactory("ote.command"));
+ commandResponse = Executors.newSingleThreadExecutor(threadManager.createNewFactory("ote.command.response"));
+ cmdMap = new ConcurrentHashMap<>();
+ }
+
+ @Override
+ public ICommandHandle addCommand(ITestServerCommand cmd, TestEnvironment context) throws ExportException {
+ OTEStatusBoard statusBoard = ServiceUtility.getService(OTEStatusBoard.class);
+ OTESessionManager sessionManager = ServiceUtility.getService(OTESessionManager.class);
+
+ Future<ITestCommandResult> result =
+ commands.submit(new TestCallableWrapper(this, cmd, context,statusBoard, sessionManager));
+ cmdMap.put(cmd, result);
+ return cmd.createCommandHandle(result, context);
+ }
+
+ public void commandComplete(ITestServerCommand cmd, TestEnvironment context) {
+ commandResponse.submit(new TestCommandComplete(context, cmd, cmdMap.get(cmd)));
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/BatchLog.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/BatchLog.java
new file mode 100644
index 000000000..25635ec1f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/BatchLog.java
@@ -0,0 +1,54 @@
+package org.eclipse.osee.ote.core.framework.command;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.ILoggerListener;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+public class BatchLog implements ILoggerListener {
+
+ private File fileToWriteTo;
+ private FileOutputStream fos;
+ private PrintWriter out;
+
+ public BatchLog(File fileToWriteTo){
+ this.fileToWriteTo = fileToWriteTo;
+ }
+
+ public void open() throws FileNotFoundException{
+ fos = new FileOutputStream(fileToWriteTo);
+ out = new PrintWriter(fileToWriteTo);
+ OseeLog.registerLoggerListener(this);
+ }
+
+ public void close(){
+ try {
+ fos.close();
+ out.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ OseeLog.unregisterLoggerListener(this);
+ }
+ }
+
+ public void flush(){
+ out.flush();
+ }
+
+ @Override
+ public void log(String loggerName, Level level, String message, Throwable th) {
+ if(level.intValue() >= Level.SEVERE.intValue()){
+ out.printf("%s %s\n", level.getName(), message);
+ if(th != null){
+ th.printStackTrace(out);
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/CommandCompleteListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/CommandCompleteListener.java
new file mode 100644
index 000000000..a5b243b1f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/CommandCompleteListener.java
@@ -0,0 +1,18 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.command;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface CommandCompleteListener {
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/ICommandHandle.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/ICommandHandle.java
new file mode 100644
index 000000000..7b709894b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/ICommandHandle.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.command;
+
+
+public interface ICommandHandle {
+ boolean cancelAll(boolean mayInterruptIfRunning);
+
+ boolean cancelSingle(boolean mayInterruptIfRunning);
+
+ ITestCommandResult get();
+
+ boolean isCancelled();
+
+ boolean isDone();
+
+ String getCommandKey();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/ICommandManager.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/ICommandManager.java
new file mode 100644
index 000000000..4bd98b303
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/ICommandManager.java
@@ -0,0 +1,18 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.command;
+
+import java.rmi.server.ExportException;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+
+public interface ICommandManager {
+ public ICommandHandle addCommand(ITestServerCommand cmd, TestEnvironment context) throws ExportException;
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/ITestCommandResult.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/ITestCommandResult.java
new file mode 100644
index 000000000..f21c08b39
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/ITestCommandResult.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.command;
+
+import java.io.Serializable;
+
+public interface ITestCommandResult extends Serializable {
+ TestCommandStatus getStatus();
+
+ Throwable getThrowable();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/ITestContext.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/ITestContext.java
new file mode 100644
index 000000000..3d4f4032e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/ITestContext.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.command;
+
+import java.io.File;
+
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.ote.core.framework.IRunManager;
+
+public interface ITestContext {
+ IRunManager getRunManager();
+
+ File getOutDir();
+
+ IServiceConnector getConnector();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/ITestServerCommand.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/ITestServerCommand.java
new file mode 100644
index 000000000..ffd304a97
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/ITestServerCommand.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.command;
+
+import java.rmi.server.ExportException;
+import java.util.UUID;
+import java.util.concurrent.Future;
+
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.status.OTEStatusBoard;
+
+public interface ITestServerCommand {
+
+ UUID getUserSessionKey();
+
+ ICommandHandle createCommandHandle(Future<ITestCommandResult> result, ITestContext context) throws ExportException;
+
+ ITestCommandResult execute(TestEnvironment context, OTEStatusBoard statusBoard) throws Exception;
+
+ String getGUID();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/RunTests.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/RunTests.java
new file mode 100644
index 000000000..2319f8e26
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/RunTests.java
@@ -0,0 +1,256 @@
+package org.eclipse.osee.ote.core.framework.command;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.Serializable;
+import java.rmi.server.ExportException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import java.util.UUID;
+import java.util.concurrent.Future;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.IHealthStatus;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.Configuration;
+import org.eclipse.osee.ote.OTEApi;
+import org.eclipse.osee.ote.core.ServiceUtility;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.status.CommandEndedStatusEnum;
+import org.eclipse.osee.ote.core.environment.status.OTEStatusBoard;
+import org.eclipse.osee.ote.core.framework.IMethodResult;
+import org.eclipse.osee.ote.core.framework.ReturnCode;
+import org.eclipse.osee.ote.core.framework.saxparse.ProcessOutfileOverview;
+import org.eclipse.osee.ote.io.OTEServerFolder;
+import org.eclipse.osee.ote.message.IMessageTestContext;
+
+public class RunTests implements ITestServerCommand, Serializable {
+
+ private static final long serialVersionUID = 7408758537342855854L;
+ private static final String DEVELOPMENT = "Development";
+
+ private final IPropertyStore global;
+ private final List<IPropertyStore> scripts;
+ private volatile boolean cancelAll = false;
+ private volatile boolean isRunning = false;
+ private final UUID sessionKey;
+ private final String commandId;
+ private TestEnvironment environment;
+ private final Configuration configuration;
+
+ public RunTests(String commandId, UUID sessionKey, Configuration configuration, IPropertyStore global, List<IPropertyStore> scripts) {
+ this.global = global;
+ this.scripts = scripts;
+ this.sessionKey = sessionKey;
+ this.commandId = commandId;
+ this.configuration = configuration;
+ }
+
+ public UUID getSessionKey() {
+ return sessionKey;
+ }
+
+ @Override
+ public ICommandHandle createCommandHandle(Future<ITestCommandResult> result, ITestContext context) throws ExportException {
+ return new RunTestsHandle(result, context, this);
+ }
+
+ @Override
+ public ITestCommandResult execute(TestEnvironment environment, OTEStatusBoard statusBoard) throws Exception {
+ ITestCommandResult retVal = TestCommandResult.SUCCESS;
+ isRunning = true;
+ IMessageTestContext msgContext = (IMessageTestContext) environment;
+ this.environment = environment;
+
+ OTEApi ote = ServiceUtility.getService(OTEApi.class);
+ OTEServerFolder serverFolder = ote.getServerFolder();
+
+ String testType = getTestType();
+ File batchFolder = serverFolder.getNewBatchFolder(testType);
+ batchFolder.mkdirs();
+ if(!isFolderToKeep(testType)){
+ serverFolder.markFolderForDelete(batchFolder);
+ }
+ BatchLog batchLog = new BatchLog(serverFolder.getBatchLogFile(batchFolder));
+ batchLog.open();
+
+ File batchStatusFile = serverFolder.getBatchStatusFile(batchFolder);
+ File batchRunList = serverFolder.getBatchRunList(batchFolder);
+
+ setBatchStatus(batchStatusFile, "running");
+ setBatchRunList(batchRunList, scripts);
+
+ environment.setupOutfileDir(batchFolder.getAbsolutePath());
+ msgContext.resetScriptLoader(configuration, global.getArray(RunTestsKeys.classpath.name()));
+
+ //Override the command line option only if batch abort has been selected in TestManager
+ boolean batchAbortFailMode = global.getBoolean(RunTestsKeys.batchFailAbortMode.name());
+ if(batchAbortFailMode){
+ System.setProperty("ote.abort.on.fail", "true");
+ }
+ else {
+ System.clearProperty("ote.abort.on.fail");
+ }
+
+ //Override the command line option only if batch pause has been selected in TestManager
+ boolean batchPauseFailMode = global.getBoolean(RunTestsKeys.batchFailPauseMode.name());
+ if(batchPauseFailMode){
+ System.setProperty("ote.pause.on.fail", "true");
+ }
+ else {
+ System.clearProperty("ote.pause.on.fail");
+ }
+
+ //Override the command line option only if batch pause has been selected in TestManager
+ boolean printOnFailMode = global.getBoolean(RunTestsKeys.printFailToConsoleMode.name());
+ if(printOnFailMode){
+ System.setProperty("ote.print.fail.to.console", "true");
+ }
+ else {
+ System.clearProperty("ote.print.fail.to.console");
+ }
+
+ for (IPropertyStore store : scripts) {
+ Set<String> arrayKeySet = global.arrayKeySet();
+ for(String key:arrayKeySet){
+ String[] array = global.getArray(key);
+ if(array != null ){
+ store.put(key, array);
+ }
+ }
+ Set<String> keySet = global.keySet();
+ for(String key:keySet){
+ String val = global.get(key);
+ if(val != null ){
+ store.put(key, val);
+ }
+ }
+
+ if (cancelAll) {
+ statusBoard.onTestComplete(store.get(RunTestsKeys.testClass.name()),
+ store.get(RunTestsKeys.serverOutfilePath.name()),
+ store.get(RunTestsKeys.clientOutfilePath.name()), CommandEndedStatusEnum.ABORTED,
+ new ArrayList<IHealthStatus>());
+ retVal = TestCommandResult.CANCEL;
+ continue;
+
+ }
+ statusBoard.onTestStart(store.get(RunTestsKeys.testClass.name()), store.get(RunTestsKeys.serverOutfilePath.name()), store.get(RunTestsKeys.clientOutfilePath.name()));
+ IMethodResult runResults = environment.getRunManager().run(environment, store);
+
+ CommandEndedStatusEnum status = CommandEndedStatusEnum.RAN_TO_COMPLETION;
+ if (runResults.getReturnCode() == ReturnCode.ABORTED) {
+ status = CommandEndedStatusEnum.ABORTED;
+ }
+ if (runResults.getReturnCode() == ReturnCode.ERROR) {
+ status = CommandEndedStatusEnum.EXCEPTION;
+ }
+
+ statusBoard.onTestComplete(store.get(RunTestsKeys.testClass.name()),
+ store.get(RunTestsKeys.serverOutfilePath.name()), store.get(RunTestsKeys.clientOutfilePath.name()),
+ status, runResults.getStatus());
+ batchLog.flush();
+
+ File outfile = new File(store.get(RunTestsKeys.serverOutfilePath.name()));
+ generateOutfileSummary(outfile, serverFolder.getResultsFile(outfile));
+ }
+ setBatchStatus(batchStatusFile, "complete");
+ isRunning = false;
+ batchLog.close();
+ return retVal;
+ }
+
+ private void setBatchRunList(File batchRunList, List<IPropertyStore> scripts2) {
+ StringBuilder sb = new StringBuilder();
+ for (IPropertyStore store : scripts) {
+ sb.append(store.get(RunTestsKeys.testClass.name()));
+ sb.append("\n");
+ }
+ try {
+ Lib.writeStringToFile(sb.toString(), batchRunList);
+ } catch (IOException ex) {
+ OseeLog.log(getClass(), Level.SEVERE, "Failed to write batch run list", ex);
+ }
+ }
+
+ private void setBatchStatus(File batchStatusFile, String string) {
+ try {
+ Lib.writeStringToFile(string, batchStatusFile);
+ } catch (IOException ex) {
+ OseeLog.log(getClass(), Level.SEVERE, "Failed to write batch status", ex);
+ }
+ }
+
+ private void generateOutfileSummary(File outfile, File resultsFile){
+ String summary = getResults(outfile);
+ writeSummaryToFile(resultsFile, summary);
+ }
+
+ private void writeSummaryToFile(File file, String summary) {
+ try {
+ Lib.writeStringToFile(summary, file);
+ } catch (IOException ex) {
+ OseeLog.log(getClass(), Level.SEVERE, "Failed to write outfile summary", ex);
+ }
+ }
+
+ private String getResults(File outfile){
+ ProcessOutfileOverview overview = new ProcessOutfileOverview();
+ FileInputStream fis = null;
+ try{
+ fis = new FileInputStream(outfile);
+ overview.run(fis);
+ } catch (Exception ex) {
+ OseeLog.log(getClass(), Level.SEVERE, "Failed to write outfile summary", ex);
+ } finally {
+ if(fis != null){
+ try {
+ fis.close();
+ } catch (IOException e) {
+ OseeLog.log(getClass(), Level.SEVERE, "Failed to close outfile", e);
+ }
+ }
+ }
+ return String.format("%s,%s,%s", overview.getScriptName(), overview.getResults(), overview.getElapsedTime());
+ }
+
+ private String getTestType(){
+ return global.get("FormalTestType");
+ }
+
+ private boolean isFolderToKeep(String testType) {
+ if(testType != null && testType.equalsIgnoreCase(DEVELOPMENT)){
+ return false;
+ } else {
+ return true;
+ }
+ }
+
+ public boolean cancel() {
+ cancelAll = true;
+ return environment.getRunManager().abort();
+ }
+
+ public boolean cancelSingle() {
+ return environment.getRunManager().abort();
+ }
+
+ @Override
+ public String getGUID() {
+ return commandId;
+ }
+
+ @Override
+ public UUID getUserSessionKey() {
+ return sessionKey;
+ }
+
+ boolean isRunning() {
+ return isRunning;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/RunTestsHandle.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/RunTestsHandle.java
new file mode 100644
index 000000000..1b1bbe1b6
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/RunTestsHandle.java
@@ -0,0 +1,64 @@
+package org.eclipse.osee.ote.core.framework.command;
+
+import java.io.Serializable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+
+import org.eclipse.osee.framework.jdk.core.util.GUID;
+
+public class RunTestsHandle implements ICommandHandle, Serializable {
+
+ private static final long serialVersionUID = 3643208660033506154L;
+
+ private final transient Future<ITestCommandResult> result;
+ private final transient ITestContext context;
+ private final transient RunTests command;
+ private final String guid;
+
+ public RunTestsHandle(Future<ITestCommandResult> result, ITestContext context, RunTests command) {
+ this.result = result;
+ this.context = context;
+ this.command = command;
+ this.guid = GUID.create();
+ }
+
+ @Override
+ public boolean cancelAll(boolean mayInterruptIfRunning) {
+ return command.cancel();
+ }
+
+ @Override
+ public boolean cancelSingle(boolean mayInterruptIfRunning) {
+ return command.cancelSingle();
+ }
+
+ @Override
+ public ITestCommandResult get() {
+ try {
+ return result.get();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ } catch (ExecutionException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ @Override
+ public boolean isCancelled() {
+ return false;
+ }
+
+ @Override
+ public boolean isDone() {
+ return command.isRunning();
+ }
+
+ @Override
+ public String getCommandKey() {
+ return guid;
+ }
+
+
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/RunTestsKeys.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/RunTestsKeys.java
new file mode 100644
index 000000000..a92904874
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/RunTestsKeys.java
@@ -0,0 +1,29 @@
+package org.eclipse.osee.ote.core.framework.command;
+
+public enum RunTestsKeys {
+ distributionStatement,
+ executablePath,
+ classpath,
+ version_repositoryType,
+ version_location,
+ version_revision,
+ version_lastAuthor,
+ version_lastModificationDate,
+ version_modifiedFlag,
+ serverOutfilePath,
+ executableOutputPath,
+ executableDebug,
+ testClass,
+ clientOutfilePath,
+ testVersion,
+ serverOutfileFolderOverride,
+ executablePathsArray,
+ executableArg1Array,
+ executableArg2Array,
+ spare1,
+ batchFailAbortMode,
+ batchmode,
+ batchFailPauseMode,
+ printFailToConsoleMode;
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/TestCallableWrapper.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/TestCallableWrapper.java
new file mode 100644
index 000000000..70ca276ba
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/TestCallableWrapper.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.command;
+
+import java.util.concurrent.Callable;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.OTESessionManager;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.status.OTEStatusBoard;
+
+public class TestCallableWrapper implements Callable<ITestCommandResult> {
+
+ private final ITestServerCommand cmd;
+ private final TestEnvironment context;
+ private final BaseCommandManager cmdManager;
+ private final OTEStatusBoard statusBoard;
+ private final OTESessionManager sessionManager;
+
+ public TestCallableWrapper(BaseCommandManager cmdManager, ITestServerCommand cmd, TestEnvironment context, OTEStatusBoard statusBoard, OTESessionManager sessionManager) {
+ this.cmd = cmd;
+ this.context = context;
+ this.cmdManager = cmdManager;
+ this.statusBoard = statusBoard;
+ this.sessionManager = sessionManager;
+ }
+
+ @Override
+ public ITestCommandResult call() throws Exception {
+ ITestCommandResult result;
+ try {
+ sessionManager.setActiveUser(cmd.getUserSessionKey());
+ result = cmd.execute(context, statusBoard);
+ if (result.getThrowable() != null) {
+ OseeLog.log(TestCallableWrapper.class, Level.SEVERE, result.getThrowable());
+ }
+ } catch (Throwable ex) {
+ result = new TestCommandResult(TestCommandStatus.FAIL, ex);
+ OseeLog.log(TestCallableWrapper.class, Level.SEVERE, ex);
+ } finally {
+ cmdManager.commandComplete(cmd, context);
+ }
+ return result;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/TestCommandComplete.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/TestCommandComplete.java
new file mode 100644
index 000000000..2c1c42209
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/TestCommandComplete.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.command;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class TestCommandComplete implements Callable<ITestCommandResult> {
+
+ private ICommandHandle handle;
+ private final TestEnvironment env;
+ private Future<ITestCommandResult> future;
+ private ITestServerCommand cmd;
+
+ public TestCommandComplete(TestEnvironment env, ITestServerCommand cmd, Future<ITestCommandResult> future) {
+ this.future = future;
+ this.cmd = cmd;
+ this.env = env;
+ }
+
+ public TestCommandComplete(TestEnvironment env, ICommandHandle handle) {
+ this.env = env;
+ this.handle = handle;
+ }
+
+ @Override
+ public ITestCommandResult call() throws Exception {
+ ITestCommandResult result;
+ try {
+ result = future.get(30, TimeUnit.SECONDS);
+ ICommandHandle handle = cmd.createCommandHandle(future, env);
+ env.testEnvironmentCommandComplete(handle);
+ } catch (Throwable th) {
+ result = new TestCommandResult(TestCommandStatus.FAIL, new Exception("Failed to retrieve command result", th));
+ }
+ return result;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/TestCommandResult.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/TestCommandResult.java
new file mode 100644
index 000000000..01c228b1a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/TestCommandResult.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.command;
+
+public class TestCommandResult implements ITestCommandResult {
+
+ private static final long serialVersionUID = -7905997520977718355L;
+
+ public static final ITestCommandResult CANCEL = new TestCommandResult(TestCommandStatus.CANCEL);
+ public static final ITestCommandResult SUCCESS = new TestCommandResult(TestCommandStatus.SUCCESS);
+ public static final ITestCommandResult FAIL = new TestCommandResult(TestCommandStatus.FAIL);
+
+ private final TestCommandStatus status;
+ private Throwable th;
+
+ public TestCommandResult(TestCommandStatus status) {
+ this.status = status;
+ }
+
+ public TestCommandResult(TestCommandStatus status, Throwable th) {
+ this.status = status;
+ this.th = th;
+ }
+
+ @Override
+ public TestCommandStatus getStatus() {
+ return status;
+ }
+
+ @Override
+ public Throwable getThrowable() {
+ return th;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/TestCommandStatus.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/TestCommandStatus.java
new file mode 100644
index 000000000..9683ac215
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/command/TestCommandStatus.java
@@ -0,0 +1,17 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.command;
+
+public enum TestCommandStatus {
+ SUCCESS,
+ FAIL,
+ CANCEL
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/event/BaseEvent.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/event/BaseEvent.java
new file mode 100644
index 000000000..75654310a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/event/BaseEvent.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.event;
+
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.ote.core.TestCase;
+import org.eclipse.osee.ote.core.TestScript;
+
+public class BaseEvent implements IEventData {
+
+ private final IPropertyStore propertyStore;
+ private final TestScript test;
+ private final TestCase testCase;
+
+ public BaseEvent(IPropertyStore propertyStore, TestScript test) {
+ this.propertyStore = propertyStore;
+ this.test = test;
+ this.testCase = null;
+ }
+
+ public BaseEvent(IPropertyStore propertyStore, TestScript test, TestCase testCase) {
+ this.propertyStore = propertyStore;
+ this.test = test;
+ this.testCase = testCase;
+ }
+
+ public BaseEvent(TestScript test, TestCase testCase) {
+ this.propertyStore = null;
+ this.test = test;
+ this.testCase = testCase;
+ }
+
+ public BaseEvent(TestScript test) {
+ this.test = test;
+ this.testCase = null;
+ this.propertyStore = null;
+ }
+
+ @Override
+ public TestScript getTest() {
+ return test;
+ }
+
+ @Override
+ public TestCase getTestCase() {
+ return testCase;
+ }
+
+ @Override
+ public IPropertyStore getProperties() {
+ return propertyStore;
+ }
+
+ public String getScriptClass() {
+ return propertyStore.get("classname");
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/event/BaseEventDataProvider.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/event/BaseEventDataProvider.java
new file mode 100644
index 000000000..389599722
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/event/BaseEventDataProvider.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.event;
+
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.ote.core.TestScript;
+
+public class BaseEventDataProvider implements IEventDataProvider {
+
+ @Override
+ public IEventData getEventData(IPropertyStore propertyStore, TestScript script) {
+ return new BaseEvent(propertyStore, script);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/event/IEventData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/event/IEventData.java
new file mode 100644
index 000000000..294be540a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/event/IEventData.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.event;
+
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.ote.core.TestCase;
+import org.eclipse.osee.ote.core.TestScript;
+
+public interface IEventData {
+ public TestScript getTest();
+
+ public TestCase getTestCase();
+
+ public IPropertyStore getProperties();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/event/IEventDataProvider.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/event/IEventDataProvider.java
new file mode 100644
index 000000000..aa57fd257
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/event/IEventDataProvider.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.event;
+
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.ote.core.TestScript;
+
+public interface IEventDataProvider {
+
+ IEventData getEventData(IPropertyStore propertyStore, TestScript script);
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/AbstractInteractivePrompt.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/AbstractInteractivePrompt.java
new file mode 100644
index 000000000..6ba914813
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/AbstractInteractivePrompt.java
@@ -0,0 +1,101 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.prompt;
+
+import java.net.UnknownHostException;
+import java.util.concurrent.Executor;
+import java.util.logging.Level;
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public abstract class AbstractInteractivePrompt<T> extends AbstractRemotePrompt implements IPromptHandle {
+
+ private final TestScript script;
+ protected Exception exception;
+ protected T response;
+
+ public AbstractInteractivePrompt(IServiceConnector connector, TestScript script, String id, String message) throws UnknownHostException {
+ super(connector, id, message);
+ this.script = script;
+ }
+
+ public T open(Executor executor) throws InterruptedException, Exception {
+ response = null;
+ exception = null;
+ if (executor != null) {
+ // run the prompt in the background
+ executor.execute(new Runnable() {
+
+ @Override
+ public void run() {
+ try {
+ doPrompt();
+ } catch (Exception e) {
+ OseeLog.log(TestEnvironment.class, Level.SEVERE, "exception while performing prompt", e);
+ // the thread that activated the prompt will be waiting on the script object's notifyAll() to
+ // be called. If an exception occurs this may not happen so we should do it here
+ endPrompt(null, new Exception("exception while performing prompt", e));
+ }
+ }
+ });
+ } else {
+ doPrompt();
+ }
+ return waitForResponse(script, false);
+ }
+
+ protected void endPrompt(T response, Exception exception) {
+
+ script.getTestEnvironment().getScriptCtrl().setExecutionUnitPause(false);
+ script.getTestEnvironment().getScriptCtrl().setScriptPause(false);
+ synchronized (script) {
+ this.response = response;
+ this.exception = exception;
+ script.notifyAll();
+ }
+ }
+
+ protected abstract void doPrompt() throws Exception;
+
+ protected void terminatePrompt() throws Exception {
+ getScript().getUserSession().cancelPrompts();
+ }
+
+ protected T waitForResponse(TestScript script, boolean executionUnitPause) throws InterruptedException, Exception {
+ synchronized (script) {
+ script.getTestEnvironment().getScriptCtrl().setScriptPause(true);
+ script.getTestEnvironment().getScriptCtrl().setExecutionUnitPause(executionUnitPause);
+ script.getTestEnvironment().getScriptCtrl().unlock();
+ try {
+ script.wait();
+ } catch (InterruptedException e) {
+ terminatePrompt();
+ throw new InterruptedException();
+ } finally {
+ script.getTestEnvironment().getScriptCtrl().lock();
+ }
+ return response;
+ }
+ }
+
+ /**
+ * @return the script
+ */
+ public TestScript getScript() {
+ return script;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/AbstractRemotePrompt.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/AbstractRemotePrompt.java
new file mode 100644
index 000000000..e1e2722fd
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/AbstractRemotePrompt.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.prompt;
+
+import java.net.UnknownHostException;
+import java.rmi.RemoteException;
+import java.rmi.server.ExportException;
+import org.eclipse.osee.connection.service.IServiceConnector;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class AbstractRemotePrompt implements IPromptHandle {
+ private final String id;
+ private final String message;
+ private final IServiceConnector connector;
+
+ public AbstractRemotePrompt(IServiceConnector connector, String id, String message) throws UnknownHostException {
+ this.connector = connector;
+ this.id = id;
+ this.message = message;
+ }
+
+ @Override
+ public String getPromptId() throws RemoteException {
+ return id;
+ }
+
+ @Override
+ public String getPromptMessage() throws RemoteException {
+ return message;
+ }
+
+ /**
+ * returns a reference to the specified remote interface whose remote methods will be bound to this prompt object
+ *
+ */
+ protected final <U extends IPromptHandle> U createRemoteReference(Class<U> remoteInterface) throws ExportException {
+ return remoteInterface.cast(connector.export(this));
+ }
+
+ public void close() throws Exception {
+ connector.unexport(this);
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/BlockingMessagePrompt.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/BlockingMessagePrompt.java
new file mode 100644
index 000000000..2385333eb
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/BlockingMessagePrompt.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.prompt;
+
+import java.net.UnknownHostException;
+import java.rmi.RemoteException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.ReentrantLock;
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.ote.core.IUserSession;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class BlockingMessagePrompt extends AbstractRemotePrompt implements IResumeResponse {
+
+ private final ReentrantLock lock = new ReentrantLock();
+ private final Condition responseAvailable = lock.newCondition();
+ private boolean responded;
+
+ public BlockingMessagePrompt(IServiceConnector connector, String id, String message) throws UnknownHostException {
+ super(connector, id, message);
+ }
+
+ /**
+ * @return true if the user did not respond within the time specified and false if the user responded in time
+ */
+ public boolean open(IUserSession session, int timeout) throws Exception {
+ lock.lock();
+ try {
+ responded = false;
+ session.initiateResumePrompt(this);
+ long nanos = TimeUnit.SECONDS.toNanos(timeout);
+
+ while (!responded) {
+ if (nanos > 0) {
+ nanos = responseAvailable.awaitNanos(0);
+ } else {
+ return true;
+ }
+ }
+ return false;
+ } finally {
+ lock.unlock();
+ }
+ }
+
+ @Override
+ public void resume() throws RemoteException {
+ lock.lock();
+ try {
+ responded = true;
+ responseAvailable.notifyAll();
+ } finally {
+ lock.unlock();
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/IPassFailPromptResponse.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/IPassFailPromptResponse.java
new file mode 100644
index 000000000..f9d31abc3
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/IPassFailPromptResponse.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.prompt;
+
+import java.rmi.RemoteException;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IPassFailPromptResponse extends IPromptHandle {
+ void respond(boolean pass, String text) throws RemoteException;
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/IPromptHandle.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/IPromptHandle.java
new file mode 100644
index 000000000..0346e11be
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/IPromptHandle.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.prompt;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IPromptHandle extends Remote {
+ String getPromptId() throws RemoteException;
+
+ String getPromptMessage() throws RemoteException;
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/IResumeResponse.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/IResumeResponse.java
new file mode 100644
index 000000000..622e37d50
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/IResumeResponse.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.prompt;
+
+import java.rmi.RemoteException;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IResumeResponse extends IPromptHandle {
+ void resume() throws RemoteException;
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/ISteppingPrompt.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/ISteppingPrompt.java
new file mode 100644
index 000000000..8f81017d8
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/ISteppingPrompt.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.prompt;
+
+import java.rmi.RemoteException;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface ISteppingPrompt extends IPromptHandle {
+ void step() throws RemoteException;
+
+ void resume() throws RemoteException;
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/IUserInputPromptResponse.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/IUserInputPromptResponse.java
new file mode 100644
index 000000000..d4aaa6fa7
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/IUserInputPromptResponse.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.prompt;
+
+import java.rmi.RemoteException;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IUserInputPromptResponse extends IPromptHandle {
+ void respond(String text) throws RemoteException;
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/IYesNoPromptResponse.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/IYesNoPromptResponse.java
new file mode 100644
index 000000000..a9a4861ab
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/IYesNoPromptResponse.java
@@ -0,0 +1,17 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.prompt;
+
+import java.rmi.RemoteException;
+
+public interface IYesNoPromptResponse extends IPromptHandle {
+ void respond(boolean yes) throws RemoteException;
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/InformationalPrompt.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/InformationalPrompt.java
new file mode 100644
index 000000000..07ddce254
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/InformationalPrompt.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.prompt;
+
+import java.net.UnknownHostException;
+import java.util.concurrent.Executor;
+
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.ote.core.IUserSession;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class InformationalPrompt extends AbstractRemotePrompt {
+
+ public InformationalPrompt(IServiceConnector connector, String id, String message) throws UnknownHostException {
+ super(connector, id, message);
+ }
+
+ public void open(final IUserSession session, Executor executor) throws Exception {
+ if (executor != null) {
+ executor.execute(new Runnable() {
+
+ @Override
+ public void run() {
+ String message = null;
+ try {
+ message = getPromptMessage();
+ if (message != null) {
+ session.initiateInformationalPrompt(getPromptMessage());
+ } else {
+ session.initiateInformationalPrompt("null message");
+ }
+ } catch (Exception e) {
+ System.out.println(message);
+ }
+ }
+ });
+ } else {
+ session.initiateInformationalPrompt(getPromptMessage());
+ }
+ }
+
+ @Override
+ public void close() {
+
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/NonBlockingMessagePrompt.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/NonBlockingMessagePrompt.java
new file mode 100644
index 000000000..31b3d2aba
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/NonBlockingMessagePrompt.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.prompt;
+
+import java.net.UnknownHostException;
+import java.rmi.RemoteException;
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.ote.core.IUserSession;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class NonBlockingMessagePrompt extends AbstractRemotePrompt implements IResumeResponse {
+
+ public NonBlockingMessagePrompt(IServiceConnector connector, String id, String message) throws UnknownHostException {
+ super(connector, id, message);
+ }
+
+ public void open(IUserSession session) throws Exception {
+
+ session.initiateResumePrompt(this);
+
+ }
+
+ @Override
+ public void resume() throws RemoteException {
+
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/OfpDebugPrompt.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/OfpDebugPrompt.java
new file mode 100644
index 000000000..0df027b5f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/OfpDebugPrompt.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.prompt;
+
+import java.net.UnknownHostException;
+import java.rmi.RemoteException;
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.ote.core.TestScript;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class OfpDebugPrompt extends ScriptPausePromptImpl {
+
+ public OfpDebugPrompt(IServiceConnector connector, TestScript script, String id, String message) throws UnknownHostException {
+ super(connector, script, id, message);
+ }
+
+ @Override
+ public void resume() throws RemoteException {
+ super.resume();
+ }
+
+ @Override
+ protected String waitForResponse(TestScript script, boolean executionUnitPause) throws InterruptedException, Exception {
+ synchronized (script) {
+ script.getTestEnvironment().getScriptCtrl().setScriptPause(true);
+ script.getTestEnvironment().getScriptCtrl().setExecutionUnitPause(executionUnitPause);
+ script.getTestEnvironment().getScriptCtrl().unlock();
+ script.wait();
+ if (exception != null) {
+ throw exception;
+ }
+ return response;
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/PassFailPromptImpl.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/PassFailPromptImpl.java
new file mode 100644
index 000000000..759a855df
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/PassFailPromptImpl.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.prompt;
+
+import java.net.UnknownHostException;
+import java.rmi.RemoteException;
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.ote.core.TestScript;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class PassFailPromptImpl extends AbstractInteractivePrompt<PassFailPromptResult> implements IPassFailPromptResponse {
+
+ public PassFailPromptImpl(IServiceConnector connector, TestScript script, String id, String message) throws UnknownHostException {
+ super(connector, script, id, message);
+ }
+
+ @Override
+ public void doPrompt() throws Exception {
+ getScript().getUserSession().initiatePassFailPrompt(createRemoteReference(IPassFailPromptResponse.class));
+ }
+
+ @Override
+ public void respond(boolean pass, String text) throws RemoteException {
+ endPrompt(new PassFailPromptResult(pass, text), null);
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/PassFailPromptResult.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/PassFailPromptResult.java
new file mode 100644
index 000000000..7a8861faa
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/PassFailPromptResult.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.prompt;
+
+public class PassFailPromptResult {
+ private final boolean pass;
+ private final String text;
+
+ public PassFailPromptResult(boolean pass, String text) {
+ this.pass = pass;
+ this.text = text;
+ }
+
+ /**
+ * @return the pass
+ */
+ public boolean isPass() {
+ return pass;
+ }
+
+ /**
+ * @return the text
+ */
+ public String getText() {
+ return text;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/ScriptPausePromptImpl.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/ScriptPausePromptImpl.java
new file mode 100644
index 000000000..a900523db
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/ScriptPausePromptImpl.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.prompt;
+
+import java.net.UnknownHostException;
+import java.rmi.RemoteException;
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.ote.core.TestScript;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class ScriptPausePromptImpl extends AbstractInteractivePrompt<String> implements IResumeResponse {
+
+ public ScriptPausePromptImpl(IServiceConnector connector, TestScript script, String id, String message) throws UnknownHostException {
+ super(connector, script, id, message);
+ }
+
+ @Override
+ public void doPrompt() throws Exception {
+ getScript().getUserSession().initiateResumePrompt(createRemoteReference(IResumeResponse.class));
+ }
+
+ @Override
+ public void resume() throws RemoteException {
+ endPrompt("CONTINUE", null);
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/ScriptSteppingPrompt.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/ScriptSteppingPrompt.java
new file mode 100644
index 000000000..318205ea4
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/ScriptSteppingPrompt.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.prompt;
+
+import java.net.UnknownHostException;
+import java.rmi.RemoteException;
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.ote.core.TestScript;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class ScriptSteppingPrompt extends AbstractInteractivePrompt<String> implements ISteppingPrompt {
+
+ public ScriptSteppingPrompt(IServiceConnector connector, TestScript script, String id, String message) throws UnknownHostException {
+ super(connector, script, id, message);
+ }
+
+ @Override
+ public void doPrompt() throws Exception {
+ getScript().getUserSession().initiateResumePrompt(createRemoteReference(IResumeResponse.class));
+ }
+
+ @Override
+ public void step() throws RemoteException {
+ // environment.singleStepEnv();
+ endPrompt("RESUME", null);
+ }
+
+ @Override
+ public void resume() throws RemoteException {
+
+ endPrompt("CONTINUE", null);
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/UserInputPromptImpl.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/UserInputPromptImpl.java
new file mode 100644
index 000000000..b12e6058e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/UserInputPromptImpl.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.prompt;
+
+import java.net.UnknownHostException;
+import java.rmi.RemoteException;
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.ote.core.TestScript;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class UserInputPromptImpl extends AbstractInteractivePrompt<String> implements IUserInputPromptResponse {
+
+ public UserInputPromptImpl(IServiceConnector connector, TestScript script, String id, String message) throws UnknownHostException {
+ super(connector, script, id, message);
+ }
+
+ @Override
+ public void doPrompt() throws Exception {
+ getScript().getUserSession().initiateUserInputPrompt(createRemoteReference(IUserInputPromptResponse.class));
+ }
+
+ @Override
+ public void respond(String text) throws RemoteException {
+ endPrompt(text, null);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/YesNoPromptImpl.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/YesNoPromptImpl.java
new file mode 100644
index 000000000..7a1a6b154
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/YesNoPromptImpl.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.prompt;
+
+import java.net.UnknownHostException;
+import java.rmi.RemoteException;
+
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.ote.core.TestScript;
+
+public class YesNoPromptImpl extends AbstractInteractivePrompt<YesNoPromptResult> implements IYesNoPromptResponse {
+
+ public YesNoPromptImpl(IServiceConnector connector, TestScript script, String id, String message) throws UnknownHostException {
+ super(connector, script, id, message);
+ }
+
+ @Override
+ public void doPrompt() throws Exception {
+ getScript().getUserSession().initiateYesNoPrompt(createRemoteReference(IYesNoPromptResponse.class));
+ }
+
+ @Override
+ public void respond(boolean yes) throws RemoteException {
+ endPrompt(new YesNoPromptResult(yes), null);
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/YesNoPromptResult.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/YesNoPromptResult.java
new file mode 100644
index 000000000..4ebd66471
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/prompt/YesNoPromptResult.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.prompt;
+
+public class YesNoPromptResult {
+ private final boolean yes;
+
+ public YesNoPromptResult(boolean yes) {
+ this.yes = yes;
+ }
+
+ public boolean isYes() {
+ return yes;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/ElementHandlers.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/ElementHandlers.java
new file mode 100644
index 000000000..d7efe949e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/ElementHandlers.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public abstract class ElementHandlers {
+
+ private final String name;
+ private final List<IBaseSaxElementListener> listeners = new ArrayList<>();
+
+ public ElementHandlers(String name) {
+ this.name = name;
+ }
+
+ public final String getElementName() {
+ return this.name;
+ }
+
+ public final void addListener(IBaseSaxElementListener listener) {
+ listeners.add(listener);
+ }
+
+ public final void removeListener(IBaseSaxElementListener listener) {
+ listeners.remove(listener);
+ }
+
+ void endElementFound(String uri, String localName, String name, String content) throws SAXException {
+ if (listeners.isEmpty()) {
+ return;
+ }
+ Object obj = createEndElementFoundObject(uri, localName, name, content);
+ for (IBaseSaxElementListener listener : listeners) {
+ listener.onEndElement(obj);
+ }
+ }
+
+ void startElementFound(String uri, String localName, String name, Attributes attributes) throws SAXException {
+ if (listeners.isEmpty()) {
+ return;
+ }
+ Object obj = createStartElementFoundObject(uri, localName, name, attributes);
+ for (IBaseSaxElementListener listener : listeners) {
+ listener.onStartElement(obj);
+ }
+ }
+
+ public abstract Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes);
+
+ public Object createEndElementFoundObject(String uri, String localName, String name, String content) {
+ return content;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/IBaseSaxElementListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/IBaseSaxElementListener.java
new file mode 100644
index 000000000..f64bd7e21
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/IBaseSaxElementListener.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IBaseSaxElementListener {
+
+ void onStartElement(Object obj);
+
+ void onEndElement(Object obj);
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/OteSaxHandler.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/OteSaxHandler.java
new file mode 100644
index 000000000..856a7732c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/OteSaxHandler.java
@@ -0,0 +1,214 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.osee.framework.jdk.core.util.io.xml.AbstractSaxHandler;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Actual;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.AdditionalInfo;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Argument;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Attention;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.CheckGroup;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.CheckPoint;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Config;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.CurrentProcessor;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Debug;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.ElapsedTime;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Environment;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.ExecutedBy;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.ExecutionDate;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Expected;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Global;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.GroupName;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Info;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.InfoGroup;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Location;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Message;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.MethodArguments;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.MethodName;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Name;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Notes;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.NumberOfTransmissions;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.ObjectName;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.OfpErrorEntry;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.OfpLoggingInfo;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.OteLog;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.PropertyElementHandler;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.PropertyStoreElementHandler;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Qualification;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Requirement;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Result;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.RetryGroup;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.ReturnValue;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.RuntimeVersions;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.ScriptInit;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.ScriptName;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.ScriptResult;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.ScriptVersion;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.SoftKeyInfoGroup;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Stacktrace;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Summary;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Support;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.SystemInfo;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.TestCase;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.TestEventElement;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.TestPoint;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.TestPointName;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.TestPointResults;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.TestScript;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.ThrowableElement;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Time;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.TimeSummary;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Tracability;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Trace;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.TraceEnd;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Type;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.User;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Value;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Version;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.VersionInformation;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.Witnesses;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+/**
+ * XMLReader xmlReader = XMLReaderFactory.createXMLReader(); CollectionParser handler = new
+ * CollectionParser(collectors); xmlReader.setContentHandler(handler); xmlReader.parse(new InputSource(inputStream));
+ *
+ * @author Andrew M. Finkbeiner
+ */
+public class OteSaxHandler extends AbstractSaxHandler {
+
+ Map<String, ElementHandlers> handlers;
+
+ public OteSaxHandler() throws Exception {
+ handlers = new HashMap<>();
+ addHandlers(new Global());
+ addHandlers(new AdditionalInfo());
+ addHandlers(new Actual());
+ addHandlers(new Argument());
+ addHandlers(new Attention());
+ addHandlers(new CheckGroup());
+ addHandlers(new CheckPoint());
+ addHandlers(new Config());
+ addHandlers(new CurrentProcessor());
+ addHandlers(new Debug());
+ addHandlers(new ElapsedTime());
+ addHandlers(new Environment());
+ addHandlers(new ExecutedBy());
+ addHandlers(new ExecutionDate());
+ addHandlers(new Expected());
+ addHandlers(new GroupName());
+ addHandlers(new Info());
+ addHandlers(new InfoGroup());
+ addHandlers(new Location());
+ addHandlers(new Message());
+ addHandlers(new MethodArguments());
+ addHandlers(new MethodName());
+ addHandlers(new Name());
+ addHandlers(new Notes());
+ addHandlers(new org.eclipse.osee.ote.core.framework.saxparse.elements.Number());
+ addHandlers(new NumberOfTransmissions());
+ addHandlers(new ObjectName());
+ addHandlers(new OfpErrorEntry());
+ addHandlers(new OfpLoggingInfo());
+ addHandlers(new OteLog());
+ addHandlers(new PropertyStoreElementHandler());
+ addHandlers(new PropertyElementHandler());
+ addHandlers(new Qualification());
+ addHandlers(new Requirement());
+ addHandlers(new Result());
+ addHandlers(new RetryGroup());
+ addHandlers(new ReturnValue());
+ addHandlers(new RuntimeVersions());
+ addHandlers(new ScriptInit());
+ addHandlers(new ScriptName());
+ addHandlers(new ScriptResult());
+ addHandlers(new ScriptVersion());
+ addHandlers(new SoftKeyInfoGroup());
+ addHandlers(new Stacktrace());
+ addHandlers(new Summary());
+ addHandlers(new Support());
+ addHandlers(new SystemInfo());
+ addHandlers(new TestCase());
+ addHandlers(new TestPoint());
+ addHandlers(new ThrowableElement());
+ addHandlers(new TestEventElement());
+ addHandlers(new TestPointName());
+ addHandlers(new TestPointResults());
+ addHandlers(new TestScript());
+ addHandlers(new Time());
+ addHandlers(new TimeSummary());
+ addHandlers(new Tracability());
+ addHandlers(new Trace());
+ addHandlers(new TraceEnd());
+ addHandlers(new Type());
+ addHandlers(new User());
+ addHandlers(new Value());
+ addHandlers(new Version());
+ addHandlers(new VersionInformation());
+ addHandlers(new Witnesses());
+ }
+
+ @Override
+ public void endElementFound(String uri, String localName, String name) throws SAXException {
+ ElementHandlers handler;
+
+ handler = handlers.get("*");
+ if (handler != null) {
+ handler.endElementFound(uri, localName, name, stripCData(getContents().trim()));
+ }
+
+ handler = handlers.get(name);
+ if (handler != null) {
+ handler.endElementFound(uri, localName, name, stripCData(getContents().trim()));
+ }
+ }
+
+ private String stripCData(String content) {
+ if (content.startsWith("<![CDATA[")) {
+ return content.subSequence(9, content.length() - 3).toString();
+ } else {
+ return content;
+ }
+
+ }
+
+ @Override
+ public void startElementFound(String uri, String localName, String name, Attributes attributes) throws SAXException {
+ ElementHandlers handler;
+
+ handler = handlers.get("*");
+ if (handler != null) {
+ handler.startElementFound(uri, localName, name, attributes);
+ }
+
+ handler = handlers.get(name);
+ if (handler != null) {
+ handler.startElementFound(uri, localName, name, attributes);
+ } else {
+ System.out.println("No Handler for ELEMENT type " + name);
+ }
+ }
+
+ public void addHandlers(ElementHandlers handler) throws Exception {
+ Object obj = handlers.put(handler.getElementName(), handler);
+ if (obj != null) {
+ throw new Exception("Duplicate handler.");
+ }
+ }
+
+ public ElementHandlers getHandler(String elementName) {
+ return handlers.get(elementName);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/ProcessOutfileOverview.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/ProcessOutfileOverview.java
new file mode 100644
index 000000000..f47eb0125
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/ProcessOutfileOverview.java
@@ -0,0 +1,127 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse;
+
+import java.io.InputStream;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.TestPointResultsData;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.TimeSummaryData;
+import org.xml.sax.InputSource;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class ProcessOutfileOverview {
+
+ private String elapsedTime;
+ private String scriptName;
+ private String results = "";
+
+ public ProcessOutfileOverview() {
+ }
+
+ public void run(InputStream inputStream) throws Exception {
+
+ long time = System.currentTimeMillis();
+
+ XMLReader xmlReader = XMLReaderFactory.createXMLReader();
+ OteSaxHandler handler = new OteSaxHandler();
+ xmlReader.setContentHandler(handler);
+ xmlReader.setProperty("http://xml.org/sax/properties/lexical-handler", handler);
+
+ handler.getHandler("TimeSummary").addListener(new IBaseSaxElementListener() {
+
+ @Override
+ public void onEndElement(Object obj) {
+ }
+
+ @Override
+ public void onStartElement(Object obj) {
+ if (obj instanceof TimeSummaryData) {
+ TimeSummaryData data = (TimeSummaryData) obj;
+ elapsedTime = data.getElapsed();
+ }
+ }
+
+ });
+ handler.getHandler("TestPointResults").addListener(new IBaseSaxElementListener() {
+
+ @Override
+ public void onEndElement(Object obj) {
+ }
+
+ @Override
+ public void onStartElement(Object obj) {
+ if (obj instanceof TestPointResultsData) {
+ TestPointResultsData data = (TestPointResultsData) obj;
+ String fail = data.getFail();
+ String pass = data.getPass();
+ String aborted = data.getAborted();
+ try {
+ int failedTestPoints = Integer.parseInt(fail);
+ int passedTestPoints = Integer.parseInt(pass);
+ int totalTestPoints = passedTestPoints + failedTestPoints;
+ boolean abort = false;
+ if (aborted != null && aborted.length() > 0) {
+ abort = Boolean.parseBoolean(aborted);
+ }
+ results = "";
+ if (abort) {
+ results = String.format("ABORTED - Total[%d] Fail[%d]", totalTestPoints, failedTestPoints);
+ } else if (failedTestPoints > 0) {
+ results = String.format("FAILED - Total[%d] Fail[%d]", totalTestPoints, failedTestPoints);
+ } else {
+ results = String.format("PASSED - Total[%d] Fail[%d]", totalTestPoints, failedTestPoints);
+ }
+ } catch (NumberFormatException ex) {
+
+ }
+ }
+ }
+
+ });
+ handler.getHandler("ScriptName").addListener(new IBaseSaxElementListener() {
+
+ @Override
+ public void onEndElement(Object obj) {
+ scriptName = obj.toString();
+ }
+
+ @Override
+ public void onStartElement(Object obj) {
+ }
+ });
+
+ xmlReader.parse(new InputSource(inputStream));
+
+ long all = System.currentTimeMillis() - time;
+
+ OseeLog.logf(getClass(), Level.INFO, "It took %d ms total to process.", all);
+ }
+
+ public String getElapsedTime() {
+ return elapsedTime;
+ }
+
+ public String getResults() {
+ return results;
+ }
+
+ public String getScriptName() {
+ return scriptName;
+ }
+
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Actual.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Actual.java
new file mode 100644
index 000000000..fb181c68e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Actual.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Actual extends ElementHandlers {
+
+ public Actual() {
+ super("Actual");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/AdditionalInfo.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/AdditionalInfo.java
new file mode 100644
index 000000000..09985cc2e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/AdditionalInfo.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class AdditionalInfo extends ElementHandlers {
+
+ public AdditionalInfo() {
+ super("AdditionalInfo");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Argument.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Argument.java
new file mode 100644
index 000000000..beac9fd6b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Argument.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Argument extends ElementHandlers {
+
+ public Argument() {
+ super("Argument");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Attention.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Attention.java
new file mode 100644
index 000000000..097aaff6c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Attention.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Attention extends ElementHandlers {
+
+ public Attention() {
+ super("Attention");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/CheckGroup.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/CheckGroup.java
new file mode 100644
index 000000000..af91245d7
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/CheckGroup.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class CheckGroup extends ElementHandlers {
+
+ public CheckGroup() {
+ super("CheckGroup");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return new CheckGroupData(attributes.getValue("Mode"));
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/CheckGroupData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/CheckGroupData.java
new file mode 100644
index 000000000..893ee745d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/CheckGroupData.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class CheckGroupData {
+
+ private final String mode;
+
+ /**
+ * @return the mode
+ */
+ public String getMode() {
+ return mode;
+ }
+
+ CheckGroupData(String mode) {
+ this.mode = mode;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/CheckPoint.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/CheckPoint.java
new file mode 100644
index 000000000..6ca0712dc
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/CheckPoint.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class CheckPoint extends ElementHandlers {
+
+ public CheckPoint() {
+ super("CheckPoint");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Config.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Config.java
new file mode 100644
index 000000000..1c18290d3
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Config.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Config extends ElementHandlers {
+
+ public Config() {
+ super("Config");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return new ConfigData(attributes.getValue("machineName"));
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ConfigData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ConfigData.java
new file mode 100644
index 000000000..5fa71f66d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ConfigData.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class ConfigData {
+ private final String machineName;
+
+ /**
+ * @return the machineName
+ */
+ public String getMachineName() {
+ return machineName;
+ }
+
+ public ConfigData(String machineName) {
+ this.machineName = machineName;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/CurrentProcessor.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/CurrentProcessor.java
new file mode 100644
index 000000000..f615b142d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/CurrentProcessor.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class CurrentProcessor extends ElementHandlers {
+
+ public CurrentProcessor() {
+ super("CurrentProcessor");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return attributes.getValue("proc");
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Debug.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Debug.java
new file mode 100644
index 000000000..2db07a732
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Debug.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Debug extends ElementHandlers {
+
+ public Debug() {
+ super("Debug");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ElapsedTime.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ElapsedTime.java
new file mode 100644
index 000000000..907e1fe20
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ElapsedTime.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class ElapsedTime extends ElementHandlers {
+
+ public ElapsedTime() {
+ super("ElapsedTime");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Environment.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Environment.java
new file mode 100644
index 000000000..9b882c20f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Environment.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Environment extends ElementHandlers {
+
+ public Environment() {
+ super("Environment");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ExecutedBy.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ExecutedBy.java
new file mode 100644
index 000000000..476ea0770
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ExecutedBy.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class ExecutedBy extends ElementHandlers {
+
+ public ExecutedBy() {
+ super("ExecutedBy");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ExecutionDate.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ExecutionDate.java
new file mode 100644
index 000000000..53577e7ba
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ExecutionDate.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class ExecutionDate extends ElementHandlers {
+
+ public ExecutionDate() {
+ super("ExecutionDate");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Expected.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Expected.java
new file mode 100644
index 000000000..2e58af712
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Expected.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Expected extends ElementHandlers {
+
+ public Expected() {
+ super("Expected");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Global.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Global.java
new file mode 100644
index 000000000..b5a3ac4ed
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Global.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class Global extends ElementHandlers {
+
+ public Global() {
+ super("*");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return name;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/GroupName.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/GroupName.java
new file mode 100644
index 000000000..2a6f0fa24
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/GroupName.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class GroupName extends ElementHandlers {
+
+ public GroupName() {
+ super("GroupName");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Info.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Info.java
new file mode 100644
index 000000000..9db505ba0
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Info.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Info extends ElementHandlers {
+
+ public Info() {
+ super("Info");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return new InfoData(attributes.getValue("title"));
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/InfoData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/InfoData.java
new file mode 100644
index 000000000..a809c57bf
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/InfoData.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class InfoData {
+
+ private final String title;
+
+ InfoData(String title) {
+ this.title = title;
+ }
+
+ /**
+ * @return the title
+ */
+ public String getTitle() {
+ return title;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/InfoGroup.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/InfoGroup.java
new file mode 100644
index 000000000..77ebb4dab
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/InfoGroup.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class InfoGroup extends ElementHandlers {
+
+ public InfoGroup() {
+ super("InfoGroup");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return new InfoGroupData(attributes.getValue("title"));
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/InfoGroupData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/InfoGroupData.java
new file mode 100644
index 000000000..ae7a17f24
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/InfoGroupData.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class InfoGroupData {
+
+ private final String title;
+
+ InfoGroupData(String title) {
+ this.title = title;
+ }
+
+ /**
+ * @return the title
+ */
+ public String getTitle() {
+ return title;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Location.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Location.java
new file mode 100644
index 000000000..35649fb67
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Location.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Location extends ElementHandlers {
+
+ public Location() {
+ super("Location");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Message.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Message.java
new file mode 100644
index 000000000..24bd66c8f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Message.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Message extends ElementHandlers {
+
+ public Message() {
+ super("Message");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/MethodArguments.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/MethodArguments.java
new file mode 100644
index 000000000..bd05ce5e0
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/MethodArguments.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class MethodArguments extends ElementHandlers {
+
+ public MethodArguments() {
+ super("MethodArguments");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/MethodName.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/MethodName.java
new file mode 100644
index 000000000..2bb33c320
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/MethodName.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class MethodName extends ElementHandlers {
+
+ public MethodName() {
+ super("MethodName");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Name.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Name.java
new file mode 100644
index 000000000..7f3ef6353
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Name.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Name extends ElementHandlers {
+
+ public Name() {
+ super("Name");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Notes.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Notes.java
new file mode 100644
index 000000000..20935d936
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Notes.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Notes extends ElementHandlers {
+
+ public Notes() {
+ super("Notes");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Number.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Number.java
new file mode 100644
index 000000000..5e99840bf
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Number.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Number extends ElementHandlers {
+
+ public Number() {
+ super("Number");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/NumberOfTransmissions.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/NumberOfTransmissions.java
new file mode 100644
index 000000000..29473b64a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/NumberOfTransmissions.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class NumberOfTransmissions extends ElementHandlers {
+
+ public NumberOfTransmissions() {
+ super("NumberOfTransmissions");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ObjectName.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ObjectName.java
new file mode 100644
index 000000000..c8755db20
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ObjectName.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class ObjectName extends ElementHandlers {
+
+ public ObjectName() {
+ super("ObjectName");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OfpErrorEntry.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OfpErrorEntry.java
new file mode 100644
index 000000000..024e89108
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OfpErrorEntry.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class OfpErrorEntry extends ElementHandlers {
+
+ public OfpErrorEntry() {
+ super("OfpErrorEntry");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return new OfpErrorEntryData(attributes.getValue("NODE_ID"), attributes.getValue("count"),
+ attributes.getValue("severity"), attributes.getValue("version"));
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OfpErrorEntryData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OfpErrorEntryData.java
new file mode 100644
index 000000000..12a89d172
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OfpErrorEntryData.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class OfpErrorEntryData {
+
+ private final String nodeId;
+ private final String count;
+ private final String severity;
+ private final String version;
+
+ /**
+ * @return the nodeId
+ */
+ public String getNodeId() {
+ return nodeId;
+ }
+
+ /**
+ * @return the count
+ */
+ public String getCount() {
+ return count;
+ }
+
+ /**
+ * @return the severity
+ */
+ public String getSeverity() {
+ return severity;
+ }
+
+ /**
+ * @return the version
+ */
+ public String getVersion() {
+ return version;
+ }
+
+ OfpErrorEntryData(String nodeId, String count, String severity, String version) {
+ this.nodeId = nodeId;
+ this.count = count;
+ this.severity = severity;
+ this.version = version;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OfpLoggingInfo.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OfpLoggingInfo.java
new file mode 100644
index 000000000..c57acf82c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OfpLoggingInfo.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class OfpLoggingInfo extends ElementHandlers {
+
+ public OfpLoggingInfo() {
+ super("OfpLoggingInfo");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OteLog.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OteLog.java
new file mode 100644
index 000000000..3ddec0d40
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OteLog.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class OteLog extends ElementHandlers {
+
+ public OteLog() {
+ super("OteLog");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return new OteLogData(attributes.getValue("Level"), attributes.getValue("Logger"));
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OteLogData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OteLogData.java
new file mode 100644
index 000000000..3e4be63bb
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/OteLogData.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class OteLogData {
+
+ private final String level;
+ private final String logger;
+
+ OteLogData(String level, String logger) {
+ this.level = level;
+ this.logger = logger;
+ }
+
+ /**
+ * @return the level
+ */
+ public String getLevel() {
+ return level;
+ }
+
+ /**
+ * @return the logger
+ */
+ public String getLogger() {
+ return logger;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/PropertyElementHandler.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/PropertyElementHandler.java
new file mode 100644
index 000000000..a04065409
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/PropertyElementHandler.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class PropertyElementHandler extends ElementHandlers {
+
+ public PropertyElementHandler() {
+ super("Property");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return new PropertyElementHandlerData(attributes.getValue("key"));
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/PropertyElementHandlerData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/PropertyElementHandlerData.java
new file mode 100644
index 000000000..e203f98da
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/PropertyElementHandlerData.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+public class PropertyElementHandlerData {
+
+ private final String key;
+
+ protected PropertyElementHandlerData(String key){
+ this.key = key;
+ }
+
+ public String getKey() {
+ return key;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/PropertyStoreElementHandler.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/PropertyStoreElementHandler.java
new file mode 100644
index 000000000..575f4813c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/PropertyStoreElementHandler.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class PropertyStoreElementHandler extends ElementHandlers {
+
+ public PropertyStoreElementHandler() {
+ super("PropertyStore");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Qualification.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Qualification.java
new file mode 100644
index 000000000..2594011c5
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Qualification.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Qualification extends ElementHandlers {
+
+ public Qualification() {
+ super("Qualification");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return new QualificationData(attributes.getValue("buildId"), attributes.getValue("level"));
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/QualificationData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/QualificationData.java
new file mode 100644
index 000000000..9ed1f3f2b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/QualificationData.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class QualificationData {
+
+ private final String buildId;
+ private final String level;
+
+ public QualificationData(String buildId, String level) {
+ this.buildId = buildId;
+ this.level = level;
+ }
+
+ /**
+ * @return the buildId
+ */
+ public String getBuildId() {
+ return buildId;
+ }
+
+ /**
+ * @return the level
+ */
+ public String getLevel() {
+ return level;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Requirement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Requirement.java
new file mode 100644
index 000000000..d14aa9563
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Requirement.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Requirement extends ElementHandlers {
+
+ public Requirement() {
+ super("Requirement");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Result.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Result.java
new file mode 100644
index 000000000..0f81c786a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Result.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Result extends ElementHandlers {
+
+ public Result() {
+ super("Result");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/RetryGroup.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/RetryGroup.java
new file mode 100644
index 000000000..279f797b2
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/RetryGroup.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class RetryGroup extends ElementHandlers {
+
+ public RetryGroup() {
+ super("RetryGroup");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return new RetryGroupData(attributes.getValue("Mode"));
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/RetryGroupData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/RetryGroupData.java
new file mode 100644
index 000000000..cd6c55567
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/RetryGroupData.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class RetryGroupData {
+
+ private final String mode;
+
+ /**
+ * @return the mode
+ */
+ public String getMode() {
+ return mode;
+ }
+
+ RetryGroupData(String mode) {
+ this.mode = mode;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ReturnValue.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ReturnValue.java
new file mode 100644
index 000000000..4087b010e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ReturnValue.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class ReturnValue extends ElementHandlers {
+
+ public ReturnValue() {
+ super("ReturnValue");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/RuntimeVersions.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/RuntimeVersions.java
new file mode 100644
index 000000000..ff168c6aa
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/RuntimeVersions.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class RuntimeVersions extends ElementHandlers {
+
+ public RuntimeVersions() {
+ super("RuntimeVersions");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptInit.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptInit.java
new file mode 100644
index 000000000..b749e8190
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptInit.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class ScriptInit extends ElementHandlers {
+
+ public ScriptInit() {
+ super("ScriptInit");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptName.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptName.java
new file mode 100644
index 000000000..c64ec2eea
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptName.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class ScriptName extends ElementHandlers {
+
+ public ScriptName() {
+ super("ScriptName");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptResult.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptResult.java
new file mode 100644
index 000000000..2001e3cf7
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptResult.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class ScriptResult extends ElementHandlers {
+
+ public ScriptResult() {
+ super("ScriptResult");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptVersion.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptVersion.java
new file mode 100644
index 000000000..787a88a2e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptVersion.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class ScriptVersion extends ElementHandlers {
+
+ public ScriptVersion() {
+ super("ScriptVersion");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return new ScriptVersionData(attributes.getValue("lastAuthor"), attributes.getValue("lastModified"),
+ attributes.getValue("modifiedFlag"), attributes.getValue("repositoryType"), attributes.getValue("revision"),
+ attributes.getValue("url"));
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptVersionData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptVersionData.java
new file mode 100644
index 000000000..dcc323ff6
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ScriptVersionData.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class ScriptVersionData {
+
+ private final String lastAuthor;
+ private final String lastModified;
+ private final String modifiedFlag;
+ private final String repositoryType;
+ private final String revision;
+ private final String url;
+
+ ScriptVersionData(String lastAuthor, String lastModified, String modifiedFlag, String repositoryType, String revision, String url) {
+ this.lastAuthor = lastAuthor;
+ this.lastModified = lastModified;
+ this.modifiedFlag = modifiedFlag;
+ this.repositoryType = repositoryType;
+ this.revision = revision;
+ this.url = url;
+ }
+
+ /**
+ * @return the lastAuthor
+ */
+ public String getLastAuthor() {
+ return lastAuthor;
+ }
+
+ /**
+ * @return the lastModified
+ */
+ public String getLastModified() {
+ return lastModified;
+ }
+
+ /**
+ * @return the modifiedFlag
+ */
+ public String getModifiedFlag() {
+ return modifiedFlag;
+ }
+
+ /**
+ * @return the repositoryType
+ */
+ public String getRepositoryType() {
+ return repositoryType;
+ }
+
+ /**
+ * @return the revision
+ */
+ public String getRevision() {
+ return revision;
+ }
+
+ /**
+ * @return the url
+ */
+ public String getUrl() {
+ return url;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SoftKeyInfoGroup.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SoftKeyInfoGroup.java
new file mode 100644
index 000000000..97377c958
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SoftKeyInfoGroup.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class SoftKeyInfoGroup extends ElementHandlers {
+
+ public SoftKeyInfoGroup() {
+ super("SoftKeyInfoGroup");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return new SoftKeyInfoGroupData(attributes.getValue("title"));
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SoftKeyInfoGroupData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SoftKeyInfoGroupData.java
new file mode 100644
index 000000000..2ac772d72
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SoftKeyInfoGroupData.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class SoftKeyInfoGroupData {
+
+ private final String title;
+
+ SoftKeyInfoGroupData(String title) {
+ this.title = title;
+ }
+
+ /**
+ * @return the title
+ */
+ public String getTitle() {
+ return title;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Stacktrace.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Stacktrace.java
new file mode 100644
index 000000000..d9335537e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Stacktrace.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Stacktrace extends ElementHandlers {
+
+ public Stacktrace() {
+ super("Stacktrace");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return new StacktraceData(attributes.getValue("line"), attributes.getValue("source"));
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/StacktraceData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/StacktraceData.java
new file mode 100644
index 000000000..ba18bcd22
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/StacktraceData.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class StacktraceData {
+
+ private String line;
+ private String source;
+
+ StacktraceData() {
+ }
+
+ public StacktraceData(String line, String source) {
+ this.line = line;
+ this.source = source;
+ }
+
+ /**
+ * @return the line
+ */
+ public String getLine() {
+ return line;
+ }
+
+ /**
+ * @return the source
+ */
+ public String getSource() {
+ return source;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Summary.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Summary.java
new file mode 100644
index 000000000..9a7bfb28b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Summary.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Summary extends ElementHandlers {
+
+ public Summary() {
+ super("Summary");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return new SummaryData(attributes.getValue("CRITICAL_COUNT"), attributes.getValue("EXCEPTION_COUNT"),
+ attributes.getValue("INFORMATIONAL_COUNT"), attributes.getValue("MINOR_COUNT"),
+ attributes.getValue("NODE_ID"), attributes.getValue("SERIOUS_COUNT"), attributes.getValue("START_NUMBER"));
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SummaryData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SummaryData.java
new file mode 100644
index 000000000..531681d54
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SummaryData.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class SummaryData {
+
+ private final String criticalCount;
+ private final String exceptionCount;
+ private final String informationCount;
+ private final String minorCount;
+ private final String nodeId;
+ private final String seriousCount;
+ private final String startNumber;
+
+ SummaryData(String criticalCount, String exceptionCount, String informationCount, String minorCount, String nodeId, String seriousCount, String startNumber) {
+ this.criticalCount = criticalCount;
+ this.exceptionCount = exceptionCount;
+ this.informationCount = informationCount;
+ this.minorCount = minorCount;
+ this.nodeId = nodeId;
+ this.seriousCount = seriousCount;
+ this.startNumber = startNumber;
+ }
+
+ /**
+ * @return the criticalCount
+ */
+ public String getCriticalCount() {
+ return criticalCount;
+ }
+
+ /**
+ * @return the exceptionCount
+ */
+ public String getExceptionCount() {
+ return exceptionCount;
+ }
+
+ /**
+ * @return the informationCount
+ */
+ public String getInformationCount() {
+ return informationCount;
+ }
+
+ /**
+ * @return the minorCount
+ */
+ public String getMinorCount() {
+ return minorCount;
+ }
+
+ /**
+ * @return the nodeId
+ */
+ public String getNodeId() {
+ return nodeId;
+ }
+
+ /**
+ * @return the seriousCount
+ */
+ public String getSeriousCount() {
+ return seriousCount;
+ }
+
+ /**
+ * @return the startNumber
+ */
+ public String getStartNumber() {
+ return startNumber;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Support.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Support.java
new file mode 100644
index 000000000..a948eda3e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Support.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Support extends ElementHandlers {
+
+ public Support() {
+ super("Support");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SystemInfo.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SystemInfo.java
new file mode 100644
index 000000000..260f8d888
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SystemInfo.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class SystemInfo extends ElementHandlers {
+
+ public SystemInfo() {
+ super("SystemInfo");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ SystemInfoData data =
+ new SystemInfoData(attributes.getValue("osArch"), attributes.getValue("osName"),
+ attributes.getValue("osVersion"), attributes.getValue("oseeVersion"),
+ attributes.getValue("oseeServerTitle"));
+ return data;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SystemInfoData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SystemInfoData.java
new file mode 100644
index 000000000..86045751c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/SystemInfoData.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class SystemInfoData {
+
+ private final String osArch;
+ private final String osName;
+ private final String osVersion;
+ private final String oseeVersion;
+ private final String oseeServerTitle;
+
+ /**
+ * @return the osArch
+ */
+ public String getOsArch() {
+ return osArch;
+ }
+
+ /**
+ * @return the osName
+ */
+ public String getOsName() {
+ return osName;
+ }
+
+ /**
+ * @return the osVersion
+ */
+ public String getOsVersion() {
+ return osVersion;
+ }
+
+ /**
+ * @return the oseeVersion
+ */
+ public String getOseeVersion() {
+ return oseeVersion;
+ }
+
+ /**
+ * @return the oseeServerTitle
+ */
+ public String getOseeServerTitle() {
+ return oseeServerTitle;
+ }
+
+ SystemInfoData(String osArch, String osName, String osVersion, String oseeVersion, String oseeServerTitle) {
+ this.osArch = osArch;
+ this.osName = osName;
+ this.osVersion = osVersion;
+ this.oseeVersion = oseeVersion;
+ this.oseeServerTitle = oseeServerTitle;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestCase.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestCase.java
new file mode 100644
index 000000000..0890f34ac
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestCase.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class TestCase extends ElementHandlers {
+
+ public TestCase() {
+ super("TestCase");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestEventElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestEventElement.java
new file mode 100644
index 000000000..c1eff0ac8
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestEventElement.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class TestEventElement extends ElementHandlers {
+
+ public TestEventElement() {
+ super("TEST_EVENT");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestPoint.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestPoint.java
new file mode 100644
index 000000000..30ad854e5
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestPoint.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class TestPoint extends ElementHandlers {
+
+ public TestPoint() {
+ super("TestPoint");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestPointName.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestPointName.java
new file mode 100644
index 000000000..d4cae71dc
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestPointName.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class TestPointName extends ElementHandlers {
+
+ public TestPointName() {
+ super("TestPointName");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestPointResults.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestPointResults.java
new file mode 100644
index 000000000..f64147957
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestPointResults.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class TestPointResults extends ElementHandlers {
+
+ public TestPointResults() {
+ super("TestPointResults");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ TestPointResultsData data =
+ new TestPointResultsData(attributes.getValue("aborted"), attributes.getValue("fail"),
+ attributes.getValue("pass"), attributes.getValue("total"));
+ return data;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestPointResultsData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestPointResultsData.java
new file mode 100644
index 000000000..260999ea6
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestPointResultsData.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class TestPointResultsData {
+
+ private final String aborted;
+
+ /**
+ * @return the aborted
+ */
+ public String getAborted() {
+ return aborted;
+ }
+
+ /**
+ * @return the fail
+ */
+ public String getFail() {
+ return fail;
+ }
+
+ /**
+ * @return the pass
+ */
+ public String getPass() {
+ return pass;
+ }
+
+ /**
+ * @return the total
+ */
+ public String getTotal() {
+ return total;
+ }
+
+ private final String fail;
+ private final String pass;
+ private final String total;
+
+ public TestPointResultsData(String aborted, String fail, String pass, String total) {
+ this.aborted = aborted;
+ this.fail = fail;
+ this.pass = pass;
+ this.total = total;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestScript.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestScript.java
new file mode 100644
index 000000000..fc52df5fe
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TestScript.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class TestScript extends ElementHandlers {
+
+ public TestScript() {
+ super("TestScript");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ThrowableElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ThrowableElement.java
new file mode 100644
index 000000000..990e972f5
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/ThrowableElement.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class ThrowableElement extends ElementHandlers {
+
+ public ThrowableElement() {
+ super("Throwable");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Time.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Time.java
new file mode 100644
index 000000000..97b514309
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Time.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Time extends ElementHandlers {
+
+ public Time() {
+ super("Time");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TimeSummary.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TimeSummary.java
new file mode 100644
index 000000000..df14221ce
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TimeSummary.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class TimeSummary extends ElementHandlers {
+
+ public TimeSummary() {
+ super("TimeSummary");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ TimeSummaryData data =
+ new TimeSummaryData(attributes.getValue("elapsed"), attributes.getValue("endDate"),
+ attributes.getValue("milliseconds"), attributes.getValue("startDate"));
+ return data;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TimeSummaryData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TimeSummaryData.java
new file mode 100644
index 000000000..f36f31a8b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TimeSummaryData.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class TimeSummaryData {
+
+ private final String elapsed;
+
+ /**
+ * @return the elapsed
+ */
+ public String getElapsed() {
+ return elapsed;
+ }
+
+ /**
+ * @return the endDate
+ */
+ public String getEndDate() {
+ return endDate;
+ }
+
+ /**
+ * @return the milliseconds
+ */
+ public String getMilliseconds() {
+ return milliseconds;
+ }
+
+ /**
+ * @return the startDate
+ */
+ public String getStartDate() {
+ return startDate;
+ }
+ private final String endDate;
+ private final String milliseconds;
+ private final String startDate;
+
+ TimeSummaryData(String elapsed, String endDate, String milliseconds, String startDate) {
+ this.elapsed = elapsed;
+ this.endDate = endDate;
+ this.milliseconds = milliseconds;
+ this.startDate = startDate;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Tracability.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Tracability.java
new file mode 100644
index 000000000..6cdb5ec31
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Tracability.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Tracability extends ElementHandlers {
+
+ public Tracability() {
+ super("Tracability");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Trace.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Trace.java
new file mode 100644
index 000000000..61bfd7dec
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Trace.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Trace extends ElementHandlers {
+
+ public Trace() {
+ super("Trace");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TraceEnd.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TraceEnd.java
new file mode 100644
index 000000000..e67e3a3a4
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/TraceEnd.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class TraceEnd extends ElementHandlers {
+
+ public TraceEnd() {
+ super("TraceEnd");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Type.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Type.java
new file mode 100644
index 000000000..11daefc75
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Type.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Type extends ElementHandlers {
+
+ public Type() {
+ super("Type");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/User.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/User.java
new file mode 100644
index 000000000..9f0269c2f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/User.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class User extends ElementHandlers {
+
+ public User() {
+ super("User");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return new UserData(attributes.getValue("email"), attributes.getValue("id"), attributes.getValue("name"));
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/UserData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/UserData.java
new file mode 100644
index 000000000..656a2beb7
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/UserData.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class UserData {
+
+ private final String email;
+ private final String id;
+ private final String name;
+
+ UserData(String email, String id, String name) {
+ this.email = email;
+ this.id = id;
+ this.name = name;
+ }
+
+ /**
+ * @return the email
+ */
+ public String getEmail() {
+ return email;
+ }
+
+ /**
+ * @return the id
+ */
+ public String getId() {
+ return id;
+ }
+
+ /**
+ * @return the name
+ */
+ public String getName() {
+ return name;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Value.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Value.java
new file mode 100644
index 000000000..c8ffaecbf
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Value.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Value extends ElementHandlers {
+
+ public Value() {
+ super("Value");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Version.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Version.java
new file mode 100644
index 000000000..daead80a4
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Version.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Version extends ElementHandlers {
+
+ public Version() {
+ super("Version");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return new VersionData(attributes.getValue("name"), attributes.getValue("underTest"),
+ attributes.getValue("version"), attributes.getValue("versionUnit"));
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/VersionData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/VersionData.java
new file mode 100644
index 000000000..09a49164f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/VersionData.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class VersionData {
+
+ private final String name;
+ private final String underTest;
+ private final String version;
+ private final String versionUnit;
+
+ VersionData(String name, String underTest, String version, String versionUnit) {
+ this.name = name;
+ this.underTest = underTest;
+ this.version = version;
+ this.versionUnit = versionUnit;
+ }
+
+ /**
+ * @return the name
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * @return the underTest
+ */
+ public String getUnderTest() {
+ return underTest;
+ }
+
+ /**
+ * @return the version
+ */
+ public String getVersion() {
+ return version;
+ }
+
+ /**
+ * @return the versionUnit
+ */
+ public String getVersionUnit() {
+ return versionUnit;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/VersionInformation.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/VersionInformation.java
new file mode 100644
index 000000000..d869146be
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/VersionInformation.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class VersionInformation extends ElementHandlers {
+
+ public VersionInformation() {
+ super("VersionInformation");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Witnesses.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Witnesses.java
new file mode 100644
index 000000000..6d7f568c3
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/saxparse/elements/Witnesses.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.saxparse.elements;
+
+import org.eclipse.osee.ote.core.framework.saxparse.ElementHandlers;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Witnesses extends ElementHandlers {
+
+ public Witnesses() {
+ super("Witnesses");
+ }
+
+ @Override
+ public Object createStartElementFoundObject(String uri, String localName, String name, Attributes attributes) {
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/BaseTestRunListenerDataProvider.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/BaseTestRunListenerDataProvider.java
new file mode 100644
index 000000000..0b98b90ad
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/BaseTestRunListenerDataProvider.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.testrun;
+
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.ote.core.TestCase;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.framework.event.BaseEvent;
+import org.eclipse.osee.ote.core.framework.event.IEventData;
+
+public class BaseTestRunListenerDataProvider implements ITestRunListenerDataProvider {
+
+ public IEventData create(IPropertyStore properties, TestScript test, TestCase testCase) {
+ return new BaseEvent(properties, test, testCase);
+ }
+
+ @Override
+ public IEventData createOnPostRun(IPropertyStore propertyStore, TestScript test) {
+ return new BaseEvent(propertyStore, test);
+ }
+
+ @Override
+ public IEventData createOnPostTestCase(IPropertyStore propertyStore, TestScript test, TestCase testCase) {
+ return new BaseEvent(propertyStore, test, testCase);
+ }
+
+ @Override
+ public IEventData createOnPreRun(IPropertyStore propertyStore, TestScript test) {
+ return new BaseEvent(propertyStore, test);
+ }
+
+ @Override
+ public IEventData createOnPreTestCase(IPropertyStore propertyStore, TestScript test, TestCase testCase) {
+ return new BaseEvent(propertyStore, test, testCase);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/BaseTestRunListenerProvider.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/BaseTestRunListenerProvider.java
new file mode 100644
index 000000000..7f93cde32
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/BaseTestRunListenerProvider.java
@@ -0,0 +1,131 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.testrun;
+
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.BaseStatus;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.framework.IMethodResult;
+import org.eclipse.osee.ote.core.framework.MethodResultImpl;
+import org.eclipse.osee.ote.core.framework.ReturnCode;
+import org.eclipse.osee.ote.core.framework.event.IEventData;
+
+public class BaseTestRunListenerProvider implements ITestRunListenerProvider {
+
+ List<ITestRunListener> listeners;
+
+ public BaseTestRunListenerProvider() {
+ listeners = new CopyOnWriteArrayList<>();
+ }
+
+ @Override
+ public boolean addTestRunListener(ITestRunListener listener) {
+ return listeners.add(listener);
+ }
+
+ @Override
+ public boolean removeTestRunListener(ITestRunListener listener) {
+ return listeners.remove(listener);
+ }
+
+ @Override
+ public IMethodResult notifyPostRun(IEventData eventData) {
+ MethodResultImpl result = new MethodResultImpl(ReturnCode.OK);
+ boolean failed = false;
+ for (ITestRunListener listener : listeners) {
+ try {
+ result = collectStatus(result, listener.postRun(eventData));
+ } catch (Throwable th) {
+ failed = true;
+ result.addStatus(new BaseStatus(TestEnvironment.class.getName(), Level.SEVERE, th));
+ }
+ }
+ if (failed) {
+ result.setReturnCode(ReturnCode.ERROR);
+ }
+ return result;
+ }
+
+ @Override
+ public IMethodResult notifyPostTestCase(IEventData eventData) {
+ MethodResultImpl result = new MethodResultImpl(ReturnCode.OK);
+ boolean failed = false;
+ for (ITestRunListener listener : listeners) {
+ try {
+ result = collectStatus(result, listener.postTestCase(eventData));
+ } catch (Throwable th) {
+ failed = true;
+ result.addStatus(new BaseStatus(TestEnvironment.class.getName(), Level.SEVERE, th));
+ }
+ }
+ if (failed) {
+ result.setReturnCode(ReturnCode.ERROR);
+ }
+ return result;
+ }
+
+ @Override
+ public IMethodResult notifyPreRun(IEventData eventData) {
+ MethodResultImpl result = new MethodResultImpl(ReturnCode.OK);
+ boolean failed = false;
+ for (ITestRunListener listener : listeners) {
+ try {
+ result = collectStatus(result, listener.preRun(eventData));
+ } catch (Throwable th) {
+ failed = true;
+ result.addStatus(new BaseStatus(TestEnvironment.class.getName(), Level.SEVERE, th));
+ }
+ }
+ if (failed) {
+ result.setReturnCode(ReturnCode.ERROR);
+ }
+ return result;
+ }
+
+ @Override
+ public IMethodResult notifyPreTestCase(IEventData eventData) {
+ MethodResultImpl result = new MethodResultImpl(ReturnCode.OK);
+ boolean failed = false;
+ for (ITestRunListener listener : listeners) {
+ try {
+ result = collectStatus(result, listener.preTestCase(eventData));
+ } catch (Throwable th) {
+ failed = true;
+ result.addStatus(new BaseStatus(TestEnvironment.class.getName(), Level.SEVERE, th));
+ }
+ }
+ if (failed) {
+ result.setReturnCode(ReturnCode.ERROR);
+ }
+ return result;
+ }
+
+ private MethodResultImpl collectStatus(MethodResultImpl result, IMethodResult listenerResult) {
+ if (listenerResult.getReturnCode() != ReturnCode.OK) {
+ if (result.getReturnCode() == ReturnCode.OK) {
+ result = new MethodResultImpl(ReturnCode.OK);
+ }
+ result.setReturnCode(listenerResult.getReturnCode());
+ result.addStatus(listenerResult.getStatus());
+ }
+ return result;
+ }
+
+ /**
+ * Clearing out the listeners.
+ */
+ @Override
+ public void clear() {
+ listeners.clear();
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/BaseTestRunListenerProviderFactory.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/BaseTestRunListenerProviderFactory.java
new file mode 100644
index 000000000..545ee1477
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/BaseTestRunListenerProviderFactory.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.testrun;
+
+public class BaseTestRunListenerProviderFactory implements ITestRunListenerProviderFactory {
+
+ @Override
+ public ITestRunListenerDataProvider createListenerDataProvider() {
+ return new BaseTestRunListenerDataProvider();
+ }
+
+ @Override
+ public ITestRunListenerProvider createRunListenerProvider() {
+ return new BaseTestRunListenerProvider();
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/BaseTestRunManager.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/BaseTestRunManager.java
new file mode 100644
index 000000000..17af221cc
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/BaseTestRunManager.java
@@ -0,0 +1,146 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.testrun;
+
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.framework.logging.BaseStatus;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.framework.IMethodResult;
+import org.eclipse.osee.ote.core.framework.MethodResultImpl;
+import org.eclipse.osee.ote.core.framework.ReturnCode;
+import org.eclipse.osee.ote.core.internal.Activator;
+import org.eclipse.osee.ote.core.log.GCHelper;
+
+public class BaseTestRunManager implements ITestRunManager {
+
+ private final ITestFactory testFactory;
+ private final ITestRunListenerProviderFactory testRunListenerProviderFactory;
+
+ private TestScript test;
+ private TestRunThread testRunThread;
+ private ITestRunListenerDataProvider dataProvider;
+ private ITestRunListenerProvider listenerProvider;
+ private boolean aborted;
+
+ public BaseTestRunManager(ITestFactory testFactory, ITestRunListenerProviderFactory testRunListenerProviderFactory) {
+ this.testFactory = testFactory;
+ this.testRunListenerProviderFactory = testRunListenerProviderFactory;
+ }
+
+ @Override
+ public boolean abort() {
+ if (test != null) {
+ test.abort();
+ }
+ aborted = true;
+ if (testRunThread != null) {
+ return testRunThread.abort();
+ }
+ return true;
+ }
+
+ @Override
+ public IMethodResult run(IPropertyStore propertyStore, TestEnvironment environment) {
+ IMethodResult result = new MethodResultImpl(ReturnCode.OK);
+ if (aborted) {
+ aborted = false;
+ MethodResultImpl methodresult = new MethodResultImpl(ReturnCode.ABORTED);
+ methodresult.addStatus(new BaseStatus(TestEnvironment.class.getName(), Level.SEVERE, "USER ABORTED"));
+ result = methodresult;
+ return result;
+ }
+ try {
+ GCHelper.enable(true);
+ testRunThread = new TestRunThread(propertyStore, test, environment, listenerProvider, dataProvider);
+ testRunThread.start();
+ testRunThread.join();
+ result = testRunThread.getResult();
+ } catch (Exception ex) {
+ MethodResultImpl methodresult = new MethodResultImpl(ReturnCode.ERROR);
+ methodresult.addStatus(new BaseStatus(TestEnvironment.class.getName(), Level.SEVERE, ex));
+ result = methodresult;
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ } finally {
+ GCHelper.enable(false);
+ aborted = false;
+ testRunThread = null;
+ }
+ return result;
+ }
+
+ @Override
+ public TestScript getTest() {
+ return test;
+ }
+
+ @Override
+ public IMethodResult dispose() {
+ MethodResultImpl result = new MethodResultImpl(ReturnCode.OK);
+ try {
+ this.test.disposeTest();
+ this.dataProvider = null;
+ this.listenerProvider.clear();
+ this.listenerProvider = null;
+ this.test = null;
+ } catch (Exception ex) {
+ result = new MethodResultImpl(ReturnCode.ERROR);
+ result.addStatus(new BaseStatus(TestEnvironment.class.getName(), Level.SEVERE, ex));
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ return result;
+ }
+
+ @Override
+ public IMethodResult initialize(TestEnvironment env, IPropertyStore propertyStore) {
+ MethodResultImpl result = new MethodResultImpl(ReturnCode.OK);
+ try {
+ aborted = false;
+ this.dataProvider = testRunListenerProviderFactory.createListenerDataProvider();
+ this.listenerProvider = testRunListenerProviderFactory.createRunListenerProvider();
+ this.test = testFactory.createInstance(env, propertyStore);
+ this.test.setListenerProvider(listenerProvider);
+ } catch (Exception ex) {
+ result = new MethodResultImpl(ReturnCode.ERROR);
+ result.addStatus(new BaseStatus(TestEnvironment.class.getName(), Level.SEVERE, ex));
+ OseeLog.log(Activator.class, Level.SEVERE, ex);
+ }
+ return result;
+ }
+
+ @Override
+ public boolean abort(Throwable th, boolean wait) {
+ if (test != null) {
+ test.abort();
+ }
+ aborted = true;
+ if (testRunThread != null) {
+ return testRunThread.abort(th, wait);
+ }
+ return true;
+ }
+
+ @Override
+ public boolean isAborted() {
+ return aborted;
+ }
+
+ @Override
+ public boolean isCurrentThreadScript() {
+ if (testRunThread != null) {
+ return Thread.currentThread() == testRunThread.getThread();
+ }
+ return false;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestFactory.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestFactory.java
new file mode 100644
index 000000000..94f074e42
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestFactory.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.testrun;
+
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+
+public interface ITestFactory {
+
+ TestScript createInstance(TestEnvironment env, IPropertyStore properties) throws Exception;
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestResultCollector.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestResultCollector.java
new file mode 100644
index 000000000..44fd62f0a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestResultCollector.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.testrun;
+
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface ITestResultCollector {
+
+ public void initialize(IPropertyStore propertyStore, TestEnvironment testEnvironment) throws Exception;
+
+ public void dispose(TestEnvironment testEnvironment) throws Exception;
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestResultCollectorFactory.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestResultCollectorFactory.java
new file mode 100644
index 000000000..7f1c25aea
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestResultCollectorFactory.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.testrun;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface ITestResultCollectorFactory {
+
+ public ITestResultCollector createCollector();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestRunListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestRunListener.java
new file mode 100644
index 000000000..1a7cd8683
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestRunListener.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.testrun;
+
+import org.eclipse.osee.ote.core.framework.IMethodResult;
+import org.eclipse.osee.ote.core.framework.event.IEventData;
+
+public interface ITestRunListener {
+
+ IMethodResult preRun(IEventData eventData);
+
+ IMethodResult preTestCase(IEventData eventData);
+
+ IMethodResult postTestCase(IEventData eventData);
+
+ IMethodResult postRun(IEventData eventData);
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestRunListenerDataProvider.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestRunListenerDataProvider.java
new file mode 100644
index 000000000..7326f7ce7
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestRunListenerDataProvider.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.testrun;
+
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.ote.core.TestCase;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.framework.event.IEventData;
+
+public interface ITestRunListenerDataProvider {
+
+ IEventData createOnPreRun(IPropertyStore propertyStore, TestScript test);
+
+ IEventData createOnPreTestCase(IPropertyStore propertyStore, TestScript test, TestCase object);
+
+ IEventData createOnPostTestCase(IPropertyStore propertyStore, TestScript test, TestCase object);
+
+ IEventData createOnPostRun(IPropertyStore propertyStore, TestScript test);
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestRunListenerProvider.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestRunListenerProvider.java
new file mode 100644
index 000000000..1eaeee0f0
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestRunListenerProvider.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.testrun;
+
+import org.eclipse.osee.ote.core.framework.IMethodResult;
+import org.eclipse.osee.ote.core.framework.event.IEventData;
+
+public interface ITestRunListenerProvider {
+
+ boolean addTestRunListener(ITestRunListener listener);
+
+ boolean removeTestRunListener(ITestRunListener listener);
+
+ IMethodResult notifyPreRun(IEventData eventData);
+
+ IMethodResult notifyPreTestCase(IEventData eventData);
+
+ IMethodResult notifyPostTestCase(IEventData eventData);
+
+ IMethodResult notifyPostRun(IEventData eventData);
+
+ void clear();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestRunListenerProviderFactory.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestRunListenerProviderFactory.java
new file mode 100644
index 000000000..0e4f4a31b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestRunListenerProviderFactory.java
@@ -0,0 +1,17 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.testrun;
+
+public interface ITestRunListenerProviderFactory {
+ ITestRunListenerProvider createRunListenerProvider();
+
+ ITestRunListenerDataProvider createListenerDataProvider();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestRunManager.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestRunManager.java
new file mode 100644
index 000000000..93974e9fd
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/ITestRunManager.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.testrun;
+
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.framework.IMethodResult;
+
+public interface ITestRunManager {
+
+ IMethodResult initialize(TestEnvironment env, IPropertyStore propertyStore);
+
+ IMethodResult run(IPropertyStore propertyStore, TestEnvironment environment);
+
+ IMethodResult dispose();
+
+ TestScript getTest();
+
+ boolean abort();
+
+ boolean abort(Throwable th, boolean wait);
+
+ boolean isAborted();
+
+ boolean isCurrentThreadScript();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/TestRunThread.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/TestRunThread.java
new file mode 100644
index 000000000..a0a1e754a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/testrun/TestRunThread.java
@@ -0,0 +1,171 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.testrun;
+
+import java.util.List;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.framework.logging.BaseStatus;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.OseeTestThread;
+import org.eclipse.osee.ote.core.TestCase;
+import org.eclipse.osee.ote.core.TestException;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.framework.IMethodResult;
+import org.eclipse.osee.ote.core.framework.MethodResultImpl;
+import org.eclipse.osee.ote.core.framework.ResultBuilder;
+import org.eclipse.osee.ote.core.framework.ReturnCode;
+import org.eclipse.osee.ote.core.internal.Activator;
+import org.eclipse.osee.ote.properties.OtePropertiesCore;
+
+public class TestRunThread extends OseeTestThread {
+
+ private final TestScript test;
+ private final ITestRunListenerProvider listenerProvider;
+ private final ITestRunListenerDataProvider dataProvider;
+ private final IPropertyStore propertyStore;
+ private volatile boolean abort = false;
+ private final ResultBuilder rb = new ResultBuilder(false);
+
+ public TestRunThread(IPropertyStore propertyStore, TestScript test, TestEnvironment env, ITestRunListenerProvider listenerProvider, ITestRunListenerDataProvider dataProvider) {
+ super(test.getClass().getSimpleName(), env);
+ this.test = test;
+ this.listenerProvider = listenerProvider;
+ this.dataProvider = dataProvider;
+ this.propertyStore = propertyStore;
+ }
+
+ @Override
+ protected void run() throws Exception {
+ try {
+ rb.append(listenerProvider.notifyPreRun(dataProvider.createOnPreRun(propertyStore, test)));
+ if (rb.isReturnStatusOK()) {
+ List<TestCase> testCases = test.getTestCases();
+ for (int i = 0; i < testCases.size(); i++) {
+ if (abort) {
+ Thread.interrupted();//clear the interrupted flag so that cleanup can occur without exception
+ addAbortResult(null);
+ i = testCases.size() - 1;//set to the last test case - TearDown
+ }
+ TestCase testCase = testCases.get(i);
+ if (testCase == null) {
+ continue;
+ }
+
+ rb.append(listenerProvider.notifyPreTestCase(dataProvider.createOnPreTestCase(propertyStore, test,
+ testCase)));
+ try {
+ testCase.baseDoTestCase(getEnvironment());
+ if (Thread.interrupted()) {
+ throw new InterruptedException("Thread probably aborted");
+ }
+ } catch (Throwable ex) {
+ if (abort) {
+ addAbortResult(null);
+ } else {
+ abort = true;
+ this.test.setAborted(true);
+ MethodResultImpl methodresult = new MethodResultImpl(ReturnCode.ABORTED);
+ Throwable clientSideThrowable = ex;
+ if (!ex.getClass().getName().startsWith("java")) {
+ String msg = ex.getClass().getName();
+ if (ex.getMessage() != null && !ex.getMessage().isEmpty()) {
+ msg += ": "+ex.getMessage();
+ }
+ Throwable removeThisOnceWeGetRidOfSerializationOnAssociatedException = new Throwable(msg);
+ removeThisOnceWeGetRidOfSerializationOnAssociatedException.setStackTrace(ex.getStackTrace());
+ clientSideThrowable = removeThisOnceWeGetRidOfSerializationOnAssociatedException;
+ }
+ methodresult.addStatus(new BaseStatus(TestEnvironment.class.getName(), Level.SEVERE, clientSideThrowable));
+ rb.append(methodresult);
+ OseeLog.log(
+ Activator.class,
+ Level.SEVERE,
+ "Exception running Test Case [" + testCase != null ? testCase.getClass().getName() : "unknown (null test case)" + "]",
+ ex);
+ }
+ }
+ rb.append(listenerProvider.notifyPostTestCase(dataProvider.createOnPostTestCase(propertyStore, test, testCase)));
+ }
+ }
+ } finally {
+ Thread.interrupted();//clear the interrupted flag so that cleanup can occur without exception
+ rb.append(listenerProvider.notifyPostRun(dataProvider.createOnPostRun(propertyStore, test)));
+ if (getEnvironment().getScriptCtrl().isLocked()) {
+ getEnvironment().getScriptCtrl().unlock();
+ }
+ }
+ }
+
+ private void addAbortResult(Throwable th) {
+ if (rb.isReturnStatusOK()) {
+ MethodResultImpl methodresult = new MethodResultImpl(ReturnCode.ABORTED);
+ if (th == null) {
+ methodresult.addStatus(new BaseStatus(TestEnvironment.class.getName(), Level.SEVERE, "USER ABORTED"));
+ } else {
+ methodresult.addStatus(new BaseStatus(TestEnvironment.class.getName(), Level.SEVERE, th));
+ }
+ rb.append(methodresult);
+ }
+ }
+
+ public boolean abort() {
+ abort = true;
+ this.test.setAborted(true);
+ if (Thread.currentThread() == this.getThread()) {
+ throw new TestException("", Level.SEVERE);
+ }
+ if(OtePropertiesCore.abortMultipleInterrupt.getBooleanValue()){
+ this.interrupt();
+ try{
+ this.join(1000*60);
+ } catch (InterruptedException ex){
+ }
+ } else {
+ int count = 0;
+ do{
+ this.interrupt();
+ try{
+ this.join(10);
+ } catch (InterruptedException ex){
+ }
+ count++;
+ } while (this.isAlive() && count < 200);
+ }
+ if (this.isAlive()) {
+ OseeLog.reportStatus(new BaseStatus(TestEnvironment.class.getName(), Level.SEVERE,
+ "Waited 60s for test to abort but the thread did not die."));
+ return false;
+ }
+ return true;
+ }
+
+ public boolean abort(Throwable th, boolean wait) {
+ if (abort) {
+ return true;
+ }
+ abort = true;
+ this.test.setAborted(true);
+ addAbortResult(th);
+ if (Thread.currentThread() == this.getThread()) {
+ throw new TestException("", Level.SEVERE);
+ }
+ this.interrupt();
+ return true;
+ }
+
+ public IMethodResult getResult() {
+ return rb.get();
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/thread/OteThread.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/thread/OteThread.java
new file mode 100644
index 000000000..add930bb7
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/thread/OteThread.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.thread;
+
+public class OteThread extends Thread {
+
+ protected OteThread(String name) {
+ super(name);
+
+ }
+
+ protected OteThread(Runnable arg0, String name) {
+ super(arg0, name);
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/thread/OteThreadFactory.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/thread/OteThreadFactory.java
new file mode 100644
index 000000000..ba82b5eb3
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/thread/OteThreadFactory.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.thread;
+
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.ThreadFactory;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OteThreadFactory implements ThreadFactory {
+
+ private final List<WeakReference<OteThread>> threads;
+ private final String threadName;
+
+ protected OteThreadFactory(String threadName) {
+ this.threadName = threadName;
+ this.threads = new CopyOnWriteArrayList<>();
+ }
+
+ @Override
+ public Thread newThread(Runnable runnable) {
+ OteThread thread = new OteThread(runnable, threadName + ":" + threads.size());
+ this.threads.add(new WeakReference<OteThread>(thread));
+ return thread;
+ }
+
+ public List<OteThread> getThreads() {
+ List<OteThread> toReturn = new ArrayList<>();
+ for (WeakReference<OteThread> weak : threads) {
+ OteThread thread = weak.get();
+ if (thread != null) {
+ toReturn.add(thread);
+ }
+ }
+ return toReturn;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/thread/OteThreadManager.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/thread/OteThreadManager.java
new file mode 100644
index 000000000..d5c4f7af2
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/framework/thread/OteThreadManager.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.framework.thread;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ThreadFactory;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OteThreadManager {
+
+ private static OteThreadManager instance = null;
+
+ private final Map<String, OteThreadFactory> factories;
+
+ private OteThreadManager() {
+ this.factories = new HashMap<>();
+ }
+
+ public static OteThreadManager getInstance() {
+ if (instance == null) {
+ instance = new OteThreadManager();
+ }
+ return instance;
+ }
+
+ public ThreadFactory createNewFactory(String threadName) {
+ OteThreadFactory factory = new OteThreadFactory(threadName);
+ factories.put(threadName, factory);
+ return factory;
+ }
+
+ public List<OteThread> getThreadsFromFactory(String key) {
+ OteThreadFactory factory = factories.get(key);
+ return factory.getThreads();
+ }
+
+ public Set<String> getFactories() {
+ return factories.keySet();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/internal/Activator.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/internal/Activator.java
new file mode 100644
index 000000000..7e98b4e1d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/internal/Activator.java
@@ -0,0 +1,145 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.internal;
+
+import java.util.Hashtable;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.core.util.ServiceDependencyTracker;
+import org.eclipse.osee.framework.jdk.core.type.CompositeKeyHashMap;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.OteProperties;
+import org.eclipse.osee.ote.core.StandardShell;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.TestEnvironmentInterface;
+import org.eclipse.osee.ote.core.environment.console.ConsoleCommandManager;
+import org.eclipse.osee.ote.core.environment.console.ICommandManager;
+import org.eclipse.osee.ote.core.log.GCHelper;
+import org.eclipse.osee.ote.message.internal.MessageIoManagementStarter;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.util.tracker.ServiceTracker;
+import org.osgi.util.tracker.ServiceTrackerCustomizer;
+
+/**
+ * @author Andrew M. Finkbeiner
+ * @author Ryan D. Brooks
+ */
+public class Activator implements BundleActivator {
+
+ private ServiceRegistration testEnvironmentRegistration;
+ private static Activator activator;
+ private BundleContext bundleContext;
+ private final CompositeKeyHashMap<String, ServiceTrackerCustomizer, ServiceTracker> serviceTrackers =
+ new CompositeKeyHashMap<String, ServiceTrackerCustomizer, ServiceTracker>();
+ private ConsoleCommandManager consoleCommandManager;
+ private StandardShell stdShell;
+ private ServiceRegistration consoleCommandRegistration;
+ private ServiceDependencyTracker serviceDependencyTracker;
+ private MessageIoManagementStarter messageIoManagementStarter;
+ private ServiceTracker testEnvTracker;
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ activator = this;
+ GCHelper.installGCMonitoring();
+ bundleContext = context;
+ consoleCommandManager = new ConsoleCommandManager();
+ if (OteProperties.isOteCmdConsoleEnabled()) {
+ stdShell = new StandardShell(consoleCommandManager);
+ stdShell.start();
+ } else {
+ stdShell = null;
+ }
+ consoleCommandRegistration =
+ context.registerService(ICommandManager.class.getName(), consoleCommandManager, new Hashtable());
+
+ serviceDependencyTracker = new ServiceDependencyTracker(bundleContext, new StatusBoardRegistrationHandler());
+ serviceDependencyTracker.open();
+
+ testEnvTracker = new ServiceTracker(context, TestEnvironmentInterface.class.getName(), null);
+ testEnvTracker.open(true);
+
+ messageIoManagementStarter = new MessageIoManagementStarter(context);
+ messageIoManagementStarter.open(true);
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ serviceDependencyTracker.close();
+ closeAllValidServiceTrackers();
+ unregisterTestEnvironment();
+ if (stdShell != null) {
+ stdShell.shutdown();
+ }
+ consoleCommandManager.shutdown();
+ consoleCommandRegistration.unregister();
+
+ messageIoManagementStarter.close();
+ testEnvTracker.close();
+ }
+
+ public static Activator getInstance() {
+ return activator;
+ }
+
+ public void registerTestEnvironment(TestEnvironment env) {
+ if (testEnvironmentRegistration != null) {
+ testEnvironmentRegistration.unregister();
+ }
+ testEnvironmentRegistration =
+ bundleContext.registerService(TestEnvironmentInterface.class.getName(), env, new Hashtable());
+ }
+
+ public void unregisterTestEnvironment() {
+ if (testEnvironmentRegistration != null) {
+ testEnvironmentRegistration.unregister();
+ testEnvironmentRegistration = null;
+ }
+ }
+
+ public ServiceTracker getServiceTracker(String clazz, ServiceTrackerCustomizer customizer) {
+ ServiceTracker tracker = findServiceTracker(clazz, customizer);
+ if (tracker == null) {
+ tracker = createNewServiceTracker(clazz, customizer);
+ }
+ return tracker;
+ }
+
+ private ServiceTracker createNewServiceTracker(String clazz, ServiceTrackerCustomizer customizer) {
+ ServiceTracker tracker = new ServiceTracker(bundleContext, clazz, customizer);
+ tracker.open(true);
+ serviceTrackers.put(clazz, customizer, tracker);
+ return tracker;
+ }
+
+ private ServiceTracker findServiceTracker(String clazz, ServiceTrackerCustomizer customizer) {
+ return serviceTrackers.get(clazz, customizer);
+ }
+
+ private void closeAllValidServiceTrackers() {
+ for (ServiceTracker tracker : serviceTrackers.values()) {
+ if (tracker != null) {
+ tracker.close();
+ }
+ }
+ }
+
+ public static TestEnvironmentInterface getTestEnvironment() {
+ try {
+ return (TestEnvironmentInterface) getInstance().testEnvTracker.waitForService(20000);
+ } catch (InterruptedException e) {
+ OseeLog.log(Activator.class, Level.SEVERE, e);
+ }
+ return null;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/internal/OTESessionManagerImpl.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/internal/OTESessionManagerImpl.java
new file mode 100644
index 000000000..7476b892f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/internal/OTESessionManagerImpl.java
@@ -0,0 +1,60 @@
+package org.eclipse.osee.ote.core.internal;
+
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.eclipse.osee.ote.core.IUserSession;
+import org.eclipse.osee.ote.core.OTESessionManager;
+
+public class OTESessionManagerImpl implements OTESessionManager {
+
+ private Map<UUID, IUserSession> userMap;
+ private UUID activeUserId;
+
+ public OTESessionManagerImpl(){
+ userMap = new ConcurrentHashMap<>();
+ }
+
+ @Override
+ public void add(UUID sessionId, IUserSession session) {
+ userMap.put(sessionId, session);
+ }
+
+ @Override
+ public void remove(UUID sessionId) {
+ userMap.remove(sessionId);
+ }
+
+ @Override
+ public IUserSession get(UUID sessionId) {
+ if(sessionId == null){
+ return null;
+ }
+ return userMap.get(sessionId);
+ }
+
+ @Override
+ public Set<UUID> get() {
+ return userMap.keySet();
+ }
+
+ @Override
+ public IUserSession getActiveUser() {
+ IUserSession session = get(activeUserId);
+ if(session == null){
+ if(userMap.size() > 0){
+ UUID id = userMap.keySet().iterator().next();
+ session = get(id);
+ }
+ }
+ return session;
+ }
+
+ @Override
+ public void setActiveUser(UUID sessionId) {
+ this.activeUserId = sessionId;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/internal/StatusBoardRegistrationHandler.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/internal/StatusBoardRegistrationHandler.java
new file mode 100644
index 000000000..dfcc023d8
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/internal/StatusBoardRegistrationHandler.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.internal;
+
+import java.util.Map;
+import org.eclipse.osee.framework.core.util.AbstractTrackingHandler;
+import org.eclipse.osee.ote.core.environment.TestEnvironmentInterface;
+import org.eclipse.osee.ote.core.environment.status.OTEStatusBoard;
+import org.eclipse.osee.ote.core.environment.status.StatusBoard;
+import org.osgi.framework.BundleContext;
+
+public class StatusBoardRegistrationHandler extends AbstractTrackingHandler {
+
+ private final static Class<?>[] SERVICE_DEPENDENCIES = new Class<?>[] {
+ OTEStatusBoard.class,
+ TestEnvironmentInterface.class};
+ private TestEnvironmentInterface testEnv;
+ private StatusBoard statusBoard;
+
+ @Override
+ public Class<?>[] getDependencies() {
+ return SERVICE_DEPENDENCIES;
+ }
+
+ @Override
+ public void onActivate(BundleContext context, Map<Class<?>, Object> services) {
+
+ testEnv = getService(TestEnvironmentInterface.class, services);
+ statusBoard = (StatusBoard) getService(OTEStatusBoard.class, services);
+ testEnv.addEnvironmentListener(statusBoard);
+ }
+
+ @Override
+ public void onDeActivate() {
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/Env.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/Env.java
new file mode 100644
index 000000000..5ea731c54
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/Env.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.log;
+
+import java.util.logging.ConsoleHandler;
+import java.util.logging.FileHandler;
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Env extends Logger {
+
+ private static Env instance = null;
+
+ public static Env getInstance() {
+ if (instance == null) {
+ instance = new Env(null, Level.ALL); // FileHandler was giving problems sometimes.
+ }
+ return instance;
+ }
+
+ public static Env getInstance(Class<?> newClass, Level level) {
+ if (instance == null) {
+ instance = new Env(newClass, level);
+ }
+ return instance;
+ }
+
+ private Env(Class<?> handlerType, Level level) {
+ super("osee.test.core.log.EnvServiceLogger", null);
+ Handler handler;
+ if (handlerType == FileHandler.class) {
+ try {
+ handler = new FileHandler("TestEnvLog_" + this.hashCode() + "%g.log");
+ } catch (Exception e) {
+ OseeLog.log(TestEnvironment.class, Level.SEVERE, e);
+ handler = new ConsoleHandler();
+ }
+ } else {
+ handler = new ConsoleHandler();
+ }
+ handler.setLevel(level);
+ this.setLevel(level);
+ this.addHandler(handler);
+ }
+
+ public void debug(String message) {
+ try {
+ log(Level.FINE, message);
+ } catch (Exception e) {
+ OseeLog.log(TestEnvironment.class, Level.SEVERE, e);
+ }
+ }
+
+ public void exception(Throwable ex) {
+ try {
+ throwing("", "", ex);
+ } catch (Exception e) {
+ OseeLog.log(TestEnvironment.class, Level.SEVERE, e);
+ }
+ }
+
+ public void message(String message) {
+ try {
+ log(Level.INFO, message);
+ } catch (Exception e) {
+ OseeLog.log(TestEnvironment.class, Level.SEVERE, e);
+ }
+ }
+
+ public void close() {
+ Handler[] handlers = Env.instance.getHandlers();
+ for (int i = 0; i < handlers.length; i++) {
+ handlers[i].close();
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/GCHelper.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/GCHelper.java
new file mode 100644
index 000000000..701ef4e22
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/GCHelper.java
@@ -0,0 +1,221 @@
+package org.eclipse.osee.ote.core.log;
+
+import java.lang.management.GarbageCollectorMXBean;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+
+import javax.management.Notification;
+import javax.management.NotificationEmitter;
+import javax.management.NotificationListener;
+import javax.management.openmbean.CompositeDataSupport;
+import javax.management.openmbean.CompositeType;
+import javax.management.openmbean.TabularDataSupport;
+import javax.management.openmbean.TabularType;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+public class GCHelper {
+
+ private static final String installGCMonitoring = System.getProperty("org.eclipse.osee.ote.gcmonitor", "true");
+
+
+ private static volatile boolean enableLog = false;
+
+ public static void enable(boolean enable){
+ enableLog = enable;
+ }
+
+ public static void installGCMonitoring(){
+ if(Boolean.parseBoolean(installGCMonitoring)){
+ List<GarbageCollectorMXBean> gcbeans = java.lang.management.ManagementFactory.getGarbageCollectorMXBeans();
+ for (GarbageCollectorMXBean gcbean : gcbeans) {
+ NotificationEmitter emitter = (NotificationEmitter) gcbean;
+ NotificationListener listener = new GCListener();
+ emitter.addNotificationListener(listener, null, null);
+ }
+ }
+ }
+
+ private static class GCListener implements NotificationListener {
+
+ private GCNotification gcData;
+
+ public void printCompositeDataSupport(Object obj, int level){
+ if(obj instanceof CompositeDataSupport){
+ CompositeDataSupport dataSupport = (CompositeDataSupport)obj;
+ CompositeType type = dataSupport.getCompositeType();
+ for(String key : type.keySet()){
+ Object value = dataSupport.get(key);
+ if(value instanceof CompositeDataSupport || value instanceof TabularDataSupport){
+ printCompositeDataSupport(value, level + 1);
+ } else {
+ if(!populateCompositeData(key, type, value)){
+ for(int i = 0; i < level; i++){
+ System.out.print(" ");
+ }
+ System.out.printf("key[%s] desc[%s] value[%s] class[%s]\n", key , type.getDescription(key), value, value.getClass().getName());
+ }
+ }
+ }
+ } else if (obj instanceof TabularDataSupport){
+ TabularDataSupport dataSupport = (TabularDataSupport)obj;
+ TabularType type = dataSupport.getTabularType();
+ for(Object value : dataSupport.values()){
+ if(value instanceof CompositeDataSupport || value instanceof TabularDataSupport){
+ printCompositeDataSupport(value, level + 1);
+ } else {
+ System.out.println("nope");
+ }
+ }
+ }
+ else {
+ if(!populateGenericValue(obj)){
+ for(int i = 0; i < level; i++){
+ System.out.print(" ");
+ }
+ System.out.printf("valud[%s] class[%s]\n", obj, obj.getClass().getName());
+ }
+ }
+ }
+
+ private boolean populateCompositeData(String key, CompositeType type, Object value) {
+ if(key.equals("GcThreadCount")){
+ gcData.threadCount = (Integer)value;
+ return true;
+ } else if (key.equals("duration")){
+ gcData.duration = (Long)value;
+ return true;
+ } else if (key.equals("endTime")){
+ gcData.endtime = (Long)value;
+ return true;
+ } else if (key.equals("startTime")){
+ gcData.startTime = (Long)value;
+ return true;
+ } else if (key.equals("id")){
+ //ignore
+ return true;
+ } else if (key.equals("key")){
+ gcData.currentGcMemory = new GCMemory();
+ gcData.currentGcMemory.memType = GCMemory.getType(value);
+ if(gcData.currentGcMemory.memType == GCMemory.type.unknown){
+ System.out.printf("unknown mem type [%s]\n", value);
+ }
+ gcData.memory.add(gcData.currentGcMemory);
+ return true;
+ } else if (key.equals("committed")){
+ gcData.currentGcMemory.committed = (Long)value;
+ return true;
+ }else if (key.equals("init")){
+ gcData.currentGcMemory.init = (Long)value;
+ return true;
+ }else if (key.equals("max")){
+ gcData.currentGcMemory.max = (Long)value;
+ return true;
+ }else if (key.equals("used")){
+ gcData.currentGcMemory.used = (Long)value;
+ return true;
+ }
+ return false;
+ }
+
+ private boolean populateGenericValue(Object obj) {
+ if(obj.toString().equals("end of minor GC")){
+ gcData.isMinor = true;
+ return true;
+ } else if(obj.toString().equals("end of major GC")){
+ gcData.isMajor = true;
+ return true;
+ } else if (obj.toString().equals("System.gc()") || obj.toString().equals("Metadata GC Threshold") || obj.toString().equals("Allocation Failure") ||
+ obj.toString().equals("PS Scavenge") || obj.toString().equals("PS MarkSweep") || obj.toString().equals("ParNew") || obj.toString().equals("GCLocker Initiated GC")){
+ if(gcData.reason == null){
+ gcData.reason = obj.toString();
+ } else {
+ gcData.reason = gcData.reason +", " + obj.toString();
+ }
+ return true;
+ }
+ return false;
+ }
+
+ //implement the notifier callback handler
+ @Override
+ public void handleNotification(Notification notification, Object handback) {
+ if(enableLog){
+ gcData = new GCNotification();
+ Object userData = notification.getUserData();
+ if(userData instanceof CompositeDataSupport){
+ CompositeDataSupport dataSupport = (CompositeDataSupport)userData;
+ for(Object obj :dataSupport.values()){
+ printCompositeDataSupport(obj, 0);
+ }
+
+ } else {
+ System.out.printf("%s - %s\n", userData.getClass().getName(), userData);
+ }
+ OseeLog.log(GCHelper.class, Level.INFO, gcData.toString());
+ }
+ }
+ }
+
+ public static class GCNotification {
+
+ public String reason;
+ public Long startTime;
+ public GCMemory currentGcMemory;
+
+ enum gcType { psScavenge, psMarkSweep; }
+
+ private gcType type;
+ private boolean isMajor = false;
+ private boolean isMinor = false;
+ private int threadCount;
+ private long duration;
+ private long endtime;
+ private long id;
+
+ private List<GCMemory> memory;
+
+ public GCNotification(){
+ memory = new ArrayList<GCHelper.GCMemory>();
+ currentGcMemory = new GCMemory();
+ }
+
+ public String toString(){
+ return String.format("GC %s - %s - elapsedTime[%d]", (isMajor ? "major" : "minor"), reason, duration);
+ }
+ }
+
+ public static class GCMemory {
+ enum type { compressedClassSpace, psSurvivorSpace, parSurvivorSpace, psOldGen, parOldGen, psEdenSpace, parEdenSpace, Metaspace, CodeCache, unknown; }
+
+ private type memType;
+ private long committed;
+ private long init;
+ private long max;
+ private long used;
+
+ public static org.eclipse.osee.ote.core.log.GCHelper.GCMemory.type getType(Object value) {
+ if(value.equals("Compressed Class Space")){
+ return type.compressedClassSpace;
+ } else if (value.equals("PS Survivor Space")){
+ return type.psSurvivorSpace;
+ } else if (value.equals("PS Old Gen")){
+ return type.psOldGen;
+ } else if (value.equals("Metaspace")){
+ return type.Metaspace;
+ } else if (value.equals("PS Eden Space")){
+ return type.psEdenSpace;
+ } else if (value.equals("Code Cache")){
+ return type.CodeCache;
+ } else if (value.equals("Par Survivor Space")){
+ return type.parSurvivorSpace;
+ } else if (value.equals("CMS Old Gen")){
+ return type.parOldGen;
+ } else if (value.equals("Par Eden Space")){
+ return type.parEdenSpace;
+ }
+ return type.unknown;
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/ITestPointTally.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/ITestPointTally.java
new file mode 100644
index 000000000..b30196b49
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/ITestPointTally.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.log;
+
+/**
+ * @author John Butler
+ */
+public interface ITestPointTally {
+
+ /**
+ * Resets the test point pass and fail counts to zero.
+ */
+ public void reset();
+
+ /**
+ * Records test point result.
+ *
+ * @param pass test point result. <b>True</b> for passing. <b>False</b> for failing.
+ * @return The total number of test points recorded.
+ */
+ public int tallyTestPoint(boolean pass);
+
+ /**
+ * @return The total number of test points recorded.
+ */
+ public int getTestPointTotal();
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/ScriptLogHandler.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/ScriptLogHandler.java
new file mode 100644
index 000000000..d6c51d959
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/ScriptLogHandler.java
@@ -0,0 +1,193 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.log;
+
+import java.io.File;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.GCHelper;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.log.record.ScriptInitRecord;
+import org.eclipse.osee.ote.core.log.record.ScriptResultRecord;
+import org.eclipse.osee.ote.core.log.record.TestCaseRecord;
+import org.eclipse.osee.ote.core.log.record.TestRecord;
+import org.eclipse.osee.ote.core.log.record.TraceRecord;
+import org.eclipse.osee.ote.core.log.record.TraceRecordEnd;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.ProcessingInstruction;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ * @author Charles Shaw
+ * @author Robert A. Fisher
+ */
+public class ScriptLogHandler extends Handler {
+ private final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ protected Element testCaseElement;
+ protected Element parent;
+ protected Element child;
+ protected Element testScriptElement;
+ protected Element scriptInitElement;
+ protected Document document;
+ private final File outFile;
+ private final List<LogRecord> records;
+
+ /**
+ * ScriptLogHandler Constructor. Sets the outfile to log to and the test script that will be logged. It also
+ * establishes the xml format to be used.
+ *
+ * @param outFile Reference to the outfile that will be used to output the log.
+ */
+ public ScriptLogHandler(File outFile, TestEnvironment testEnvironment) {
+ GCHelper.getGCHelper().addRefWatch(this);
+ this.outFile = outFile;
+ OseeLog.log(TestEnvironment.class, Level.FINE, outFile.getAbsolutePath());
+
+ try {
+ factory.setNamespaceAware(true);
+ DocumentBuilder builder = factory.newDocumentBuilder();
+ document = builder.newDocument();
+ } catch (ParserConfigurationException ex) {
+ OseeLog.log(TestEnvironment.class, Level.SEVERE, ex);
+ }
+
+ ProcessingInstruction processingInstruction =
+ document.createProcessingInstruction("xml-stylesheet",
+ "type=\"text/xsl\" href=\"" + getXSLTransformName() + "\"");
+ document.appendChild(processingInstruction);
+ records = new ArrayList<>();
+
+ document.appendChild(document.createComment("OUTFILE_COMMNET"));
+
+ this.testScriptElement = document.createElement("TestScript");
+ this.scriptInitElement = document.createElement("ScriptInit");
+ document.appendChild(testScriptElement);
+ this.parent = this.testScriptElement;
+ }
+
+ public String getXSLTransformName() {
+ return "outputNormal.xsl";
+ }
+
+ /**
+ * Write out the log file to the outfile.
+ */
+ public void writeOutFile() {
+ try {
+ Jaxp.writeXmlDocument(document, outFile, Jaxp.getPrettyFormat());
+ } catch (Throwable th) {
+ OseeLog.log(TestEnvironment.class, Level.SEVERE, th);
+ }
+ }
+
+ @Override
+ public synchronized void publish(LogRecord logRecord) {
+ if (isLoggable(logRecord)) {
+ records.add(logRecord);
+ }
+ }
+
+ public synchronized void flushRecords() {
+ try {
+ for (int i = 0; i < records.size(); i++) {
+ LogRecord logRecord = records.get(i);
+
+ if (logRecord instanceof TestRecord) {
+ TestRecord record = (TestRecord) logRecord;
+ child = record.toXml(document);
+
+ if (record instanceof TestCaseRecord) {
+ testCaseElement = child;
+ testScriptElement.appendChild(testCaseElement);
+ parent = testCaseElement;
+ } else {
+
+ if (record instanceof ScriptResultRecord) {
+ testScriptElement.appendChild(child);
+ } else if (record instanceof ScriptInitRecord) {
+ if (((ScriptInitRecord) record).getStartFlag()) {
+ // We are doing it this way so that it is chronologically accurate in the xml.
+ if (scriptInitElement.getParentNode() == null) {
+ testScriptElement.appendChild(scriptInitElement);
+ }
+ parent = scriptInitElement;
+ } else {
+ parent = testScriptElement;
+ }
+ } else {
+ parent.appendChild(child);
+ if (record instanceof TraceRecord) {// method began
+ parent = child;
+ } else if (record instanceof TraceRecordEnd) {// method ended
+ if (parent.getParentNode() != null) {
+ parent = (Element) parent.getParentNode();
+ }
+ }
+ }
+ }
+ } else {
+ if (parent != null) {
+ Element el = document.createElement("OteLog");
+ el.setAttribute("Level", logRecord.getLevel().getLocalizedName());
+ el.setAttribute("Logger", logRecord.getLoggerName());
+ Element msg = document.createElement("Message");
+ msg.appendChild(document.createTextNode(logRecord.getMessage()));
+ el.appendChild(msg);
+
+ if (logRecord.getThrown() != null) {
+
+ try {
+ StringWriter sw = new StringWriter();
+ PrintWriter pw = new PrintWriter(sw);
+ logRecord.getThrown().printStackTrace(pw);
+ pw.close();
+
+ Element thrown = document.createElement("Throwable");
+ thrown.appendChild(document.createTextNode(sw.toString()));
+ el.appendChild(thrown);
+ } catch (Exception ex) {
+ }
+ }
+ parent.appendChild(el);
+ }
+ }
+ }
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ } finally {
+ records.clear();
+ }
+ }
+
+ @Override
+ public void close() throws SecurityException {
+
+ writeOutFile();
+ }
+
+ @Override
+ public void flush() {
+ // don't call this method
+
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/TestLevel.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/TestLevel.java
new file mode 100644
index 000000000..919ac24fd
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/TestLevel.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.log;
+
+import java.util.logging.Level;
+
+/**
+ * @author Michael A. Winston
+ */
+public class TestLevel extends Level {
+
+ private static final long serialVersionUID = -3898810954576373823L;
+
+ public final static TestLevel TEST_POINT = new TestLevel("TestPoint", Level.SEVERE.intValue() + 10);
+ public final static TestLevel ATTENTION = new TestLevel("Attention", Level.WARNING.intValue() + 30);
+ public final static TestLevel REQUIREMENT = new TestLevel("Requirement", Level.WARNING.intValue() + 20);
+ public final static TestLevel SUPPORT = new TestLevel("Support", Level.INFO.intValue() + 30);
+ public final static TestLevel MESSAGING = new TestLevel("Messaging", Level.INFO.intValue() + 20);
+ public final static TestLevel TRACE = new TestLevel("Trace", Level.INFO.intValue() + 10);
+ public final static TestLevel DEBUG = new TestLevel("Debug", Level.FINE.intValue());
+
+ /**
+ * TestLevel Constructor. Sets a level name and value.
+ *
+ * @param name The level name.
+ * @param value The level value.
+ */
+ private TestLevel(String name, int value) {
+ super(name, value);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/TestLogger.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/TestLogger.java
new file mode 100644
index 000000000..2cf1f2d6f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/TestLogger.java
@@ -0,0 +1,323 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.log;
+
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+import java.util.logging.Logger;
+
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.eclipse.osee.framework.jdk.core.persistence.XmlizableStream;
+import org.eclipse.osee.ote.core.MethodFormatter;
+import org.eclipse.osee.ote.core.ReturnFormatter;
+import org.eclipse.osee.ote.core.TestCase;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestLogger;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestPoint;
+import org.eclipse.osee.ote.core.log.record.AttentionRecord;
+import org.eclipse.osee.ote.core.log.record.DebugRecord;
+import org.eclipse.osee.ote.core.log.record.InfoRecord;
+import org.eclipse.osee.ote.core.log.record.RequirementRecord;
+import org.eclipse.osee.ote.core.log.record.SevereRecord;
+import org.eclipse.osee.ote.core.log.record.SupportRecord;
+import org.eclipse.osee.ote.core.log.record.TestPointRecord;
+import org.eclipse.osee.ote.core.log.record.TestRecord;
+import org.eclipse.osee.ote.core.log.record.TraceRecord;
+import org.eclipse.osee.ote.core.log.record.TraceRecordEnd;
+import org.eclipse.osee.ote.core.log.record.WarningRecord;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Robert A. Fisher
+ * @author Andrew M. Finkbeiner
+ * @author Charles Shaw
+ */
+public class TestLogger extends Logger implements ITestLogger {
+
+ /**
+ * TestLogger Constructor. Sets logging level and filter.
+ */
+ public TestLogger() {
+ super("osee.test.core.log", null);
+ setLevel(Level.ALL);
+ }
+
+ /**
+ * For communicating with the user running an interactive script only allowed in interactive scripts (use sparingly).
+ */
+ public void attention(ITestEnvironmentAccessor source, String message) {
+ // TODO: this is not just a straight log
+ log(new AttentionRecord(source, message));
+ }
+
+ /**
+ * Records a debugging message in the log. Will never be seen during demos.
+ *
+ * @param source The object requesting the logging (Usually "this" is passed in).
+ * @param message The log message.
+ */
+ @Override
+ public void debug(ITestEnvironmentAccessor source, String message) {
+ log(new DebugRecord(source, message));
+ }
+
+ /**
+ * Records a debugging message in the log. Will never be seen during the demos.
+ *
+ * @param source The object requesting the logging (Usually "this" is passed in).
+ * @param message The log message.
+ * @param timeStamp <b>True</b> if you want a time stamp included, <b>False</b> if you do not.
+ */
+ @Override
+ public void debug(ITestEnvironmentAccessor source, String message, boolean timeStamp) {
+ log(new DebugRecord(source, message, timeStamp));
+ }
+
+ /**
+ * Records a warning message in the log.
+ *
+ * @param source The object requesting the logging (Usually "this" is passed in).
+ * @param message The log message.
+ */
+ @Override
+ public void warning(ITestEnvironmentAccessor source, String message) {
+ log(new WarningRecord(source, message));
+ }
+
+ /**
+ * Internal - logging from, say, guts of messaging API
+ *
+ * @param source The object requesting the logging (Usually "this" is passed in).
+ * @param message The log message.
+ */
+ @Override
+ public void support(ITestEnvironmentAccessor source, String message) {
+ log(new SupportRecord(source, message));
+ }
+
+ /**
+ * Records a severe message in the log.
+ *
+ * @param source The object requesting the logging (Usually "this" is passed in).
+ * @param message The log message.
+ */
+ @Override
+ public void severe(ITestEnvironmentAccessor source, String message) {
+ log(new SevereRecord(source, message));
+ }
+
+ /**
+ * Records a severe message in the log.
+ *
+ * @param source The object requesting the logging (Usually "this" is passed in).
+ */
+ @Override
+ public void severe(Object source, Throwable thrown) {
+ throwing(source.getClass().getName(), null, thrown);
+ }
+
+ @Override
+ public void testpoint(ITestEnvironmentAccessor env, TestScript script, TestCase testCase, boolean passed, String testPointName, String exp, String act) {
+ log(new TestPointRecord(env, script, testCase, testPointName, exp, act, passed));
+ }
+
+ @Override
+ public void testpoint(TestPointRecord record) {
+ log(record);
+ }
+
+ @Override
+ public void testpoint(ITestEnvironmentAccessor env, TestScript script, TestCase testCase, ITestPoint testPoint) {
+ log(new TestPointRecord(env, script, testCase, testPoint));
+ }
+
+ /**
+ * Records that a test case began in the log.
+ *
+ * @param testCase The test case whose start is to be recorded.
+ */
+ @Override
+ public void testCaseBegan(TestCase testCase) {
+ log(testCase.getTestRecord());
+ }
+
+ /**
+ * Record a trace event. Such as when a function starts or stops.
+ *
+ * @param source The object requesting the logging (Usually "this" is passed in).
+ */
+ public void trace(ITestEnvironmentAccessor source, String objectName, String methodName, MethodFormatter methodArguments) {
+ log(new TraceRecord(source, objectName, methodName, methodArguments));
+ }
+
+ public void endtrace(ITestEnvironmentAccessor source, ReturnFormatter methodArguments) {
+ log(new TraceRecordEnd(source, methodArguments));
+ }
+
+ /**
+ * Record a requirement to the log.
+ *
+ * @param source The object requesting the logging (Usually "this" is passed in).
+ * @param message The log message.
+ */
+ public void requirement(ITestEnvironmentAccessor source, String message) {
+ log(new RequirementRecord(source, message));
+ }
+
+ /**
+ * Log the beginning of a method with no arguments.
+ *
+ * @param source The object requesting the logging (Usually "this" is passed in).
+ */
+ @Override
+ public void methodCalled(ITestEnvironmentAccessor source) {
+ methodCalled(source, new MethodFormatter(), 2);
+ }
+
+ /**
+ * Log the beginning of a method with a formatted string holding the arguments.
+ *
+ * @param source The object requesting the logging (Usually "this" is passed in).
+ * @param arguments The arguments in a formatted string.
+ */
+ @Override
+ public void methodCalled(ITestEnvironmentAccessor source, MethodFormatter arguments) {
+ methodCalled(source, arguments, 2);
+ }
+
+ // /**
+ // * Log the beginning of a method with a the MethodFormatter formatted argument object.
+ // *
+ // * @param source The object requesting the logging (Usually "this" is passed in).
+ // * @param methodFormat Reference to the MethodFormatter formatted argument list.
+ // */
+ // public void methodCalled(ITestEnvironmentAccessor source, MethodFormatter methodFormat) {
+ // methodCalled(source, methodFormat, 2);
+ // }
+
+ /**
+ * Log the beginning of a method.
+ *
+ * @param source The object requesting the logging (Usually "this" is passed in).
+ * @param arguments The arguments in a formatted string.
+ * @param methodCount The number of methods called to reach this point.
+ */
+ public void methodCalled(ITestEnvironmentAccessor source, MethodFormatter arguments, int methodCount) {
+ String methodName = new Exception().getStackTrace()[methodCount].getMethodName();
+ trace(source, "", methodName, arguments);
+ }
+
+ /**
+ * Log the start of a method with the object variable name.
+ *
+ * @param source The object requesting the logging (Usually "this" is passed in).
+ * @param objectName The class variable name.
+ */
+ @Override
+ public void methodCalledOnObject(ITestEnvironmentAccessor source, String objectName) {
+ methodCalledOnObject(source, objectName, new MethodFormatter(), 2);
+ }
+
+ // /**
+ // * Log the start of a method with the object variable name and a formatted string with the
+ // * arguments.
+ // *
+ // * @param source The object requesting the logging (Usually "this" is passed in).
+ // * @param objectName The class variable name.
+ // * @param arguments The arguments in a formatted string.
+ // */
+ // public void methodCalledOnObject(ITestEnvironmentAccessor source, String objectName, MethodFormatter arguments) {
+ // methodCalledOnObject(source, objectName, arguments, 2);
+ // }
+
+ /**
+ * Log the start of a method with the object variable name and a MethodFormatter formatted argument object.
+ *
+ * @param source The object requesting the logging (Usually "this" is passed in).
+ * @param objectName The class variable name.
+ * @param methodFormat Reference to the MethodFormatter formatted argument list.
+ */
+ @Override
+ public void methodCalledOnObject(ITestEnvironmentAccessor source, String objectName, MethodFormatter methodFormat) {
+ methodCalledOnObject(source, objectName, methodFormat, 2);
+ }
+
+ /**
+ * Log the start of a method with the object variable name.
+ *
+ * @param source The object requesting the logging (Usually "this" is passed in).
+ * @param objectName The class variable name.
+ * @param arguments The arguments in a formatted string.
+ * @param methodCount The number of methods called to reach this point.
+ */
+ public void methodCalledOnObject(ITestEnvironmentAccessor source, String objectName, MethodFormatter arguments, int methodCount) {
+
+ String methodName = new Exception().getStackTrace()[methodCount].getMethodName();
+ trace(source, objectName, methodName, arguments);
+ }
+
+ /**
+ * Specifies that a method has ended. This must be paired with the methodBegin() call.
+ *
+ * @param source The object requesting the logging (Usually "this" is passed in).
+ */
+ @Override
+ public void methodEnded(ITestEnvironmentAccessor source) {
+ endtrace(source, new ReturnFormatter());
+ }
+
+ @Override
+ public void methodEnded(ITestEnvironmentAccessor source, ReturnFormatter returnFormatter) {
+ endtrace(source, returnFormatter);
+ }
+
+ @Override
+ public void log(TestRecord record) {
+ this.log((LogRecord) record);
+ }
+
+ @Override
+ public void methodCalledOnObject(ITestEnvironmentAccessor source, String objectName, MethodFormatter methodFormat, Xmlizable xmlObject) {
+ methodCalledOnObject(source, objectName, methodFormat, xmlObject, 2);
+ }
+
+ private void methodCalledOnObject(ITestEnvironmentAccessor source, String objectName, MethodFormatter methodFormat, Xmlizable xmlObject, int methodCount) {
+ String methodName = new Exception().getStackTrace()[methodCount].getMethodName();
+ TraceRecord record = new TraceRecord(source, objectName, methodName, methodFormat, true);
+ record.addAdditionalElement(xmlObject);
+ if (xmlObject instanceof XmlizableStream) {
+ record.addAdditionalElement((XmlizableStream) xmlObject);
+ }
+ log(record);
+ }
+
+ @Override
+ public void log(ITestEnvironmentAccessor source, Level level, String message, Throwable th) {
+ if(level.intValue() >= Level.SEVERE.intValue()){
+ SevereRecord severe = new SevereRecord(source, message, true);
+ severe.setThrown(th);
+ this.log(severe);
+ } else if (level.intValue() >= Level.WARNING.intValue()){
+ WarningRecord warn = new WarningRecord(source, message, true);
+ warn.setThrown(th);
+ this.log(warn);
+ } else if (level.intValue() >= Level.INFO.intValue()){
+ InfoRecord info = new InfoRecord(source, message, true);
+ info.setThrown(th);
+ this.log(info);
+ } else {
+ this.log(level, message, th);
+ }
+ }
+
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/AttentionRecord.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/AttentionRecord.java
new file mode 100644
index 000000000..018aa08f3
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/AttentionRecord.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.log.record;
+
+import java.util.logging.Level;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.log.TestLevel;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Charles Shaw
+ */
+public class AttentionRecord extends TestRecord {
+
+ private static final long serialVersionUID = -6974833259038544176L;
+
+ /**
+ * AttentionRecord Constructor. Sets up generic message log message.
+ *
+ * @param source The object requesting the logging.
+ * @param msg The log message.
+ * @param timeStamp <b>True</b> if a timestamp should be recorded, <b>False</b> if not.
+ */
+ public AttentionRecord(ITestEnvironmentAccessor source, String msg, boolean timeStamp) {
+ super(source, TestLevel.ATTENTION, msg, timeStamp);
+ }
+
+ /**
+ * MessagingRecord Constructor. Sets up generic message log message.
+ *
+ * @param source The object requesting the logging.
+ * @param msg The log message.
+ */
+ public AttentionRecord(ITestEnvironmentAccessor source, String msg) {
+ this(source, msg, true);
+ }
+
+ /**
+ * Converts log element to XML format.
+ *
+ * @return xml formated element.
+ */
+ @Override
+ public Element toXml(Document doc) {
+ Element recordElement = doc.createElement(getLevel().getName());
+ recordElement.appendChild(Jaxp.createElement(doc, "Message", getMessage()));
+ // for (Xmlizable object : getAdditionalXml()) {
+ // recordElement.appendChild(object.toXml(doc));
+ // }
+ if (TestRecord.getLocationLoggingOn()) {
+ recordElement.appendChild(getLocation(doc));
+ }
+ return recordElement;
+ }
+
+ @Override
+ public void toXml(XMLStreamWriter writer) throws XMLStreamException {
+ writer.writeStartElement(getLevel().getName());
+ writeLocationCheckLocationLoggingOn(writer);
+ writeMessage(writer);
+ writer.writeEndElement();
+ }
+
+ @JsonProperty
+ @Override
+ public Level getLevel() {
+ return super.getLevel();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/DebugRecord.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/DebugRecord.java
new file mode 100644
index 000000000..3d28e0744
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/DebugRecord.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.log.record;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.log.TestLevel;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class DebugRecord extends TestRecord {
+
+ private static final long serialVersionUID = -5340996017961551683L;
+
+ /**
+ * DebugRecord Constructor. Invokes TestRecord with the log message source, the log message, and the ability to
+ * include a timestamp.
+ *
+ * @param source The object requesting the logging.
+ * @param msg The log message.
+ * @param timeStamp <b>True </b> if time stamp should be logged, <b>False </b> if not.
+ */
+ public DebugRecord(ITestEnvironmentAccessor source, String msg, boolean timeStamp) {
+ super(source, TestLevel.DEBUG, msg, timeStamp);
+ }
+
+ /**
+ * DebugRecord Constructor. Invokes TestRecord with the log message source and the log message.
+ *
+ * @param source The object requesting the logging.
+ * @param msg The log message.
+ */
+ public DebugRecord(ITestEnvironmentAccessor source, String msg) {
+ this(source, msg, true);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/ErrorRecord.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/ErrorRecord.java
new file mode 100644
index 000000000..4ec5383b7
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/ErrorRecord.java
@@ -0,0 +1,98 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.log.record;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.Date;
+import java.util.logging.Level;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.XmlSupport;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+public class ErrorRecord extends TestRecord {
+ private static final long serialVersionUID = -9083013356154141017L;
+ private final String executionResult;
+ private final String executionMessage;
+ private final boolean printTimeStamp;
+ private long timeStamp;
+
+ public ErrorRecord(ITestEnvironmentAccessor source, Level level, String executionResult, Throwable throwable, boolean timeStamp) {
+ super(source, level, executionResult, false);
+ this.executionResult = executionResult;
+ this.executionMessage = getThrowbableMessage(throwable);
+ this.printTimeStamp = timeStamp;
+ if (timeStamp) {
+ if (source != null) {
+ if (source instanceof TestEnvironment) {
+ TestEnvironment env = (TestEnvironment) source;
+ if (env.getTestScript() != null) {
+ this.timeStamp = System.currentTimeMillis() - env.getTestScript().getStartTime().getTime();
+ } else {
+ this.timeStamp = new Date().getTime();
+ }
+ }
+ } else {
+ this.timeStamp = new Date().getTime();
+ try {
+ throw new Exception("source was null");
+ } catch (Exception e) {
+ OseeLog.log(TestEnvironment.class, Level.SEVERE, e);
+ }
+ }
+ }
+ }
+
+ private String getThrowbableMessage(Throwable throwable) {
+ StringWriter sw = new StringWriter();
+ PrintWriter pw = new PrintWriter(sw);
+ pw.println("Exception " + throwable.getClass().getName() + ": " + throwable.getMessage());
+ throwable.printStackTrace(new PrintWriter(sw));
+ return sw.toString();
+ }
+
+ @Override
+ public Element toXml(Document doc) {
+ Element root = doc.createElement("ExecutionStatus");
+ if (this.printTimeStamp) {
+ root.appendChild(Jaxp.createElement(doc, "Time", Long.toString(timeStamp)));
+ }
+ root.appendChild(Jaxp.createElement(doc, "ExecutionResult", XmlSupport.sanitizeXMLContent(executionResult)));
+ root.appendChild(Jaxp.createElement(doc, "ExecutionDetails", XmlSupport.sanitizeXMLContent(executionMessage)));
+ return root;
+ }
+
+ @Override
+ public void toXml(XMLStreamWriter writer) throws XMLStreamException {
+ writer.writeStartElement("ExecutionStatus");
+ writeTime(writer);
+ writeElement(writer, "ExecutionResult", XmlSupport.sanitizeXMLContent(executionResult));
+ writeElement(writer, "ExecutionDetails", XmlSupport.sanitizeXMLContent(executionMessage));
+ writer.writeEndElement();
+ }
+
+ public String getExecutionResult() {
+ return executionResult;
+ }
+
+ public String getExecutionMessage() {
+ return executionMessage;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/InfoRecord.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/InfoRecord.java
new file mode 100644
index 000000000..7c6ed0d9d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/InfoRecord.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.log.record;
+
+import java.util.logging.Level;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+
+public class InfoRecord extends TestRecord {
+
+ private static final long serialVersionUID = -3124953320400273382L;
+
+ /**
+ * InfoRecord Constructor. Sets up a Warning log message.
+ *
+ * @param source The object requesting the logging.
+ * @param msg The log message.
+ * @param timeStamp <b>True </b> if a timestamp should be recorded, <b>False </b> if not.
+ */
+ public InfoRecord(ITestEnvironmentAccessor source, String msg, boolean timeStamp) {
+ super(source, Level.INFO, msg, timeStamp);
+ }
+
+ /**
+ * InfoRecord Constructor. Sets up a Warning log message.
+ *
+ * @param source The object requesting the logging.
+ * @param msg The log message.
+ */
+ public InfoRecord(ITestEnvironmentAccessor source, String msg) {
+ this(source, msg, true);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/ParentLogRecord.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/ParentLogRecord.java
new file mode 100644
index 000000000..e12af0dc3
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/ParentLogRecord.java
@@ -0,0 +1,39 @@
+package org.eclipse.osee.ote.core.log.record;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+
+import org.codehaus.jackson.annotate.JsonIgnore;
+import org.codehaus.jackson.annotate.JsonProperty;
+
+public class ParentLogRecord extends LogRecord {
+ private static final long serialVersionUID = 684361479587503820L;
+ private Collection<LogRecord> records = new ArrayList<>();
+
+ public ParentLogRecord() {
+ super(Level.OFF, "");
+ }
+
+ public void addChild(final LogRecord testPoint) {
+ records.add(testPoint);
+ }
+
+ @JsonProperty
+ public Collection<LogRecord> getChildRecords() {
+ return records;
+ }
+
+ @Override
+ @JsonIgnore
+ public Level getLevel() {
+ return super.getLevel();
+ };
+
+ @Override
+ @JsonIgnore
+ public String getMessage() {
+ return super.getMessage();
+ };
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/PropertyStoreRecord.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/PropertyStoreRecord.java
new file mode 100644
index 000000000..30576b63d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/PropertyStoreRecord.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.log.record;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Level;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.codehaus.jackson.annotate.JsonIgnore;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+
+public class PropertyStoreRecord extends TestRecord {
+
+ private static final long serialVersionUID = -6515147544821433102L;
+ private IPropertyStore store;
+
+ public PropertyStoreRecord(IPropertyStore store) {
+ super(null, Level.INFO, "PropertyStoreRecord", false);
+ this.store = store;
+ }
+
+ @Override
+ public void toXml(XMLStreamWriter writer) throws XMLStreamException {
+ writer.writeStartElement("PropertyStore");
+ if(store != null){
+ for(String key:store.keySet()){
+ String message = store.get(key);
+ writer.writeStartElement("Property");
+ writer.writeAttribute("key", key);
+ writer.writeCharacters(message);
+ writer.writeEndElement();
+ }
+ }
+ writer.writeEndElement();
+ }
+
+ @JsonProperty
+ public Map<String, String> getProperties() {
+ Map<String, String> result = new HashMap<>();
+ if (store != null && !store.isEmpty()) {
+ for (String key : store.keySet()) {
+ if (nonEmptyString(store.get(key)) != null) {
+ result.put(key, store.get(key));
+ }
+ }
+ return result;
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ @JsonIgnore
+ public String getMessage() {
+ return super.getMessage();
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/RequirementRecord.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/RequirementRecord.java
new file mode 100644
index 000000000..927c7502b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/RequirementRecord.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.log.record;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.log.TestLevel;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class RequirementRecord extends TestRecord {
+
+ private static final long serialVersionUID = -3533522844275324310L;
+
+ /**
+ * RequirementRecord Constructor. Sets up a Requirement log message.
+ *
+ * @param source The object requesting the logging.
+ * @param msg The log message.
+ * @param timeStamp <b>True </b> if a timestamp should be recorded, <b>False </b> if not.
+ */
+ public RequirementRecord(ITestEnvironmentAccessor source, String msg, boolean timeStamp) {
+ super(source, TestLevel.REQUIREMENT, msg, timeStamp);
+ }
+
+ /**
+ * RequirementRecord Constructor. Sets up a Requirement log message.
+ *
+ * @param source The object requesting the logging.
+ * @param msg The log message.
+ */
+ public RequirementRecord(ITestEnvironmentAccessor source, String msg) {
+ this(source, msg, true);
+ }
+
+ @JsonProperty
+ public String getRequirement() {
+ return getMessage();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/ScriptConfigRecord.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/ScriptConfigRecord.java
new file mode 100644
index 000000000..02c5a3b91
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/ScriptConfigRecord.java
@@ -0,0 +1,221 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.log.record;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.text.DateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.logging.Level;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.codehaus.jackson.annotate.JsonCreator;
+import org.codehaus.jackson.annotate.JsonIgnore;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.config.ScriptVersionConfig;
+import org.eclipse.osee.ote.core.log.TestLevel;
+import org.eclipse.osee.ote.core.test.tags.BaseTestTags;
+import org.w3c.dom.DOMException;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class ScriptConfigRecord extends TestRecord {
+ private ScriptVersionConfig scriptVersionRecord;
+ private String userName;
+ private String userEmail;
+ private String userId;
+ private static final long serialVersionUID = 6919229589873467398L;
+
+ /**
+ * ScriptConfigRecord Constructor. Constructs test script configuration log
+ * message with timestamp.
+ *
+ * @param script
+ * The test script who's configuration is to be recorded.
+ * @param timeStamp
+ * <b>True </b> if a timestamp should be recorded, <b>False </b>
+ * if not.
+ */
+ public ScriptConfigRecord(TestScript script, boolean timeStamp) {
+ super(script.getTestEnvironment(), TestLevel.TEST_POINT, script.getClass().getName(), timeStamp);
+ }
+
+ /**
+ * ScriptConfigRecord Constructor. Constructs test script configuration log
+ * message.
+ *
+ * @param script
+ * The test script who's configuration is to be recorded.
+ */
+ public ScriptConfigRecord(TestScript script) {
+ this(script, true);
+ }
+
+ /**
+ * Convert an element to XML format.
+ *
+ * @return XML formated config element.
+ */
+ @Override
+ public Element toXml(Document doc) {
+ Element configElement = doc.createElement(BaseTestTags.CONFIG_ENTRY);
+ try {
+ configElement.setAttribute("machineName", InetAddress.getLocalHost().getHostName());
+ } catch (DOMException e) {
+ OseeLog.log(TestEnvironment.class, Level.SEVERE, e);
+ } catch (UnknownHostException e) {
+ OseeLog.log(TestEnvironment.class, Level.SEVERE, e);
+ }
+ configElement.appendChild(Jaxp.createElement(doc, BaseTestTags.SCRIPT_NAME, getMessage()));
+ Element user = doc.createElement("User");
+ user.setAttribute("name", this.userName);
+ user.setAttribute("email", this.userEmail);
+ user.setAttribute("id", this.userId);
+ configElement.appendChild(user);
+ if (scriptVersionRecord != null) {
+ configElement.appendChild(scriptVersionRecord.toXml(doc));
+ }
+ // if (executedBy != null) {
+ // configElement.appendChild(executedBy.toXml(doc));
+ // }
+ DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);
+ configElement.appendChild(Jaxp.createElement(doc, BaseTestTags.EXECUTION_DATE, dateFormat.format(new Date()).toString()));
+ TestScript script = ((TestEnvironment) this.getSource()).getTestScript();
+ if (script != null) {
+ configElement.appendChild(Jaxp.createElement(doc, BaseTestTags.ENVIRONMENT_FIELD, script.getType().toString()));
+ } else {
+ // script is null
+ configElement.appendChild(Jaxp.createElement(doc, BaseTestTags.ENVIRONMENT_FIELD, "Null Script"));
+ }
+ return configElement;
+ }
+
+ @Override
+ public void toXml(XMLStreamWriter writer) throws XMLStreamException {
+ writer.writeStartElement(BaseTestTags.CONFIG_ENTRY);
+ try {
+ writer.writeAttribute("machineName", InetAddress.getLocalHost().getHostName());
+ } catch (DOMException e) {
+ OseeLog.log(TestEnvironment.class, Level.SEVERE, e);
+ } catch (UnknownHostException e) {
+ OseeLog.log(TestEnvironment.class, Level.SEVERE, e);
+ }
+ writeElement(writer, BaseTestTags.SCRIPT_NAME, getMessage());
+ writer.writeStartElement("User");
+ writer.writeAttribute("name", this.userName);
+ writer.writeAttribute("email", this.userEmail);
+ writer.writeAttribute("id", this.userId);
+ writer.writeEndElement();
+ if (scriptVersionRecord != null) {
+ scriptVersionRecord.toXml(writer);
+ }
+ DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);
+ writeElement(writer, BaseTestTags.EXECUTION_DATE, dateFormat.format(new Date()).toString());
+ TestScript script = ((TestEnvironment) this.getSource()).getTestScript();
+ if (script != null) {
+ writeElement(writer, BaseTestTags.ENVIRONMENT_FIELD, script.getType().toString());
+ } else {
+ // script is null
+ writeElement(writer, BaseTestTags.ENVIRONMENT_FIELD, "Null Script");
+ }
+ writer.writeEndElement();
+ }
+
+ @JsonProperty
+ public ScriptVersionConfig getScriptVersionRecord() {
+ return scriptVersionRecord;
+ }
+
+ public void setScriptVersion(ScriptVersionConfig scriptVersionRecord) {
+ this.scriptVersionRecord = scriptVersionRecord;
+ }
+
+ public void setExecutedBy(String name, String email, String id) {
+ this.userName = name;
+ this.userEmail = email;
+ this.userId = id;
+ }
+
+ @JsonProperty
+ public String getMachineName() {
+ try {
+ return InetAddress.getLocalHost().getHostName();
+ } catch (UnknownHostException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ @JsonProperty
+ public User getUser() {
+ return new User(this.userName, this.userEmail, this.userId);
+ }
+
+ public class User {
+ private String name, email, id;
+
+ @JsonCreator
+ public User(final String name, final String email, final String id) {
+ this.name = name;
+ this.email = email;
+ this.id = id;
+ }
+
+ @JsonProperty
+ public String getName() {
+ return nonEmptyString(name);
+ }
+
+ @JsonProperty
+ public String getEmail() {
+ return nonEmptyString(email);
+ }
+
+ @JsonProperty
+ public String getId() {
+ return nonEmptyString(id);
+ }
+ }
+
+ @JsonProperty
+ public String getExecutionDate() {
+ DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);
+ return dateFormat.format(new Date()).toString();
+ }
+
+ @JsonProperty
+ public String getEnvironment() {
+ TestScript script = ((TestEnvironment) this.getSource()).getTestScript();
+ if (script != null) {
+ return script.getType().toString();
+ } else {
+ return null;
+ }
+ }
+
+ @JsonIgnore
+ @Override
+ public List<String> getLocation() {
+ return super.getLocation();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/ScriptInitRecord.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/ScriptInitRecord.java
new file mode 100644
index 000000000..82f75cb41
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/ScriptInitRecord.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.log.record;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.LogRecord;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.log.TestLevel;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class ScriptInitRecord extends TestRecord {
+
+ private static final long serialVersionUID = -8573603873316659237L;
+ private final boolean startFlag;
+
+ /**
+ * ScriptInitRecord Constructor. Constructs test script configuration log message with timestamp.
+ *
+ * @param script The test script who's configuration is to be recorded.
+ * @param timeStamp <b>True</b> if a timestamp should be recorded, <b>False</b> if not.
+ */
+ public ScriptInitRecord(TestScript script, boolean timeStamp, boolean startFlag) {
+ super(script.getTestEnvironment(), TestLevel.TEST_POINT, script.getClass().getName(), timeStamp);
+ this.startFlag = startFlag;
+ }
+
+ /**
+ * ScriptConfigRecord Constructor. Constructs test script configuration log message.
+ *
+ * @param script The test script who's configuration is to be recorded.
+ * @param startFlag true for the beginning of init, false for the end.
+ */
+ public ScriptInitRecord(TestScript script, boolean startFlag) {
+ this(script, true, startFlag);
+ }
+
+ /**
+ * Returns whether this is the start of the init or end.
+ *
+ * @return <b>true</b> if start of the script init, <b>false</b> if the end.
+ */
+ public boolean getStartFlag() {
+ return startFlag;
+ }
+
+ @Override
+ public Element toXml(Document doc) {
+ //This element is not added to the output xml.
+ //It is here because ScriptLogHandler creates an
+ //element out of the record and adds it to the xml.
+ //We don't add it, but it was necessary to create the
+ //element so that we could test for ScriptInitRecord.
+ return doc.createElement("ScriptInit");
+ }
+
+ @Override
+ public void toXml(XMLStreamWriter writer) throws XMLStreamException {
+ writer.writeStartElement("ScriptInit");
+ }
+
+ @Override
+ @JsonProperty("Script")
+ public String getMessage() {
+ return super.getMessage();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/ScriptResultRecord.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/ScriptResultRecord.java
new file mode 100644
index 000000000..bd2ca9351
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/ScriptResultRecord.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.log.record;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.codehaus.jackson.annotate.JsonIgnore;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.eclipse.osee.framework.jdk.core.persistence.XmlizableStream;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.log.TestLevel;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class ScriptResultRecord extends TestRecord {
+ private static final long serialVersionUID = -6132341487630154239L;
+ private final List<Xmlizable> childElements;
+ private final List<XmlizableStream> childStreamElements;
+
+ /**
+ * ScriptConfigRecord Constructor. Constructs test script configuration log
+ * message with timestamp.
+ *
+ * @param script
+ * The test script who's configuration is to be recorded.
+ * @param timeStamp
+ * <b>True </b> if a timestamp should be recorded, <b>False </b>
+ * if not.
+ */
+ public ScriptResultRecord(TestScript script) {
+ super(script.getTestEnvironment(), TestLevel.TEST_POINT, script.getClass().getName(), false);
+ childElements = new ArrayList<>(1000);
+ childStreamElements = new ArrayList<>(100);
+ }
+
+ public void addChildElement(Xmlizable xml) {
+ childElements.add(xml);
+ }
+
+ public void addChildElement(XmlizableStream xml) {
+ childStreamElements.add(xml);
+ }
+
+ /**
+ * Convert an element to XML format.
+ *
+ * @return XML formated config element.
+ */
+ @Override
+ public Element toXml(Document doc) {
+ Element result = doc.createElement("ScriptResult");
+ for (Xmlizable xml : childElements) {
+ result.appendChild(xml.toXml(doc));
+ }
+ childElements.clear();
+ return result;
+ }
+
+ @Override
+ public void toXml(XMLStreamWriter writer) throws XMLStreamException {
+ writer.writeStartElement("ScriptResult");
+ for (XmlizableStream xml : childStreamElements) {
+ xml.toXml(writer);
+ }
+ writer.writeEndElement();
+ }
+
+ @JsonProperty
+ public List<XmlizableStream> getResults() {
+ return childStreamElements;
+ }
+
+ @Override
+ @JsonProperty("ScriptName")
+ public String getMessage() {
+ return super.getMessage();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/SevereRecord.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/SevereRecord.java
new file mode 100644
index 000000000..37449876f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/SevereRecord.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.log.record;
+
+import java.util.logging.Level;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class SevereRecord extends TestRecord {
+
+ private static final long serialVersionUID = -2717539209163922501L;
+
+ /**
+ * SevereRecord Constructor. Sets up a Severe log message.
+ *
+ * @param source The object requesting the logging.
+ * @param msg The log message.
+ * @param timeStamp <b>True </b> if a timestamp should be recorded, <b>False </b> if not.
+ */
+ public SevereRecord(ITestEnvironmentAccessor source, String msg, boolean timeStamp) {
+ super(source, Level.SEVERE, msg, timeStamp);
+ }
+
+ /**
+ * SevereRecord Constructor. Sets up a Severe log message.
+ *
+ * @param source The object requesting the logging.
+ * @param msg The log message.
+ */
+ public SevereRecord(ITestEnvironmentAccessor source, String msg) {
+ this(source, msg, true);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/SupportRecord.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/SupportRecord.java
new file mode 100644
index 000000000..bd6a08c8d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/SupportRecord.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.log.record;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.log.TestLevel;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class SupportRecord extends TestRecord {
+
+ private static final long serialVersionUID = 6889265206495780451L;
+
+ /**
+ * SupportRecord Constructor. Sets up a Support log message.
+ *
+ * @param source The object requesting the logging.
+ * @param msg The log message.
+ * @param timeStamp <b>True </b> if a timestamp should be recorded, <b>False </b> if not.
+ */
+ public SupportRecord(ITestEnvironmentAccessor source, String msg, boolean timeStamp) {
+ super(source, TestLevel.SUPPORT, msg, timeStamp);
+ }
+
+ /**
+ * SupportRecord Constructor. Sets up a Support log message.
+ *
+ * @param source The object requesting the logging.
+ * @param msg The log message.
+ */
+ public SupportRecord(ITestEnvironmentAccessor source, String msg) {
+ this(source, msg, true);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TestCaseRecord.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TestCaseRecord.java
new file mode 100644
index 000000000..a99f64b2b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TestCaseRecord.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.log.record;
+
+import java.util.logging.Level;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.TestCase;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.log.TestLevel;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class TestCaseRecord extends TestRecord {
+ private static final long serialVersionUID = -5049608072548003705L;
+ private final TestCase testCase;
+
+ /**
+ * TestCaseRecorded Constructor. Sets up a test case log message.
+ *
+ * @param source
+ * The object requesting the logging.
+ * @param testCase
+ * The current test case to be logged.
+ */
+ public TestCaseRecord(ITestEnvironmentAccessor source, TestCase testCase) {
+ super(source, TestLevel.TEST_POINT, "Test Case " + testCase.getTestCaseNumber() + " began.", true);
+ this.testCase = testCase;
+ if (testCase.getTestEnvironment() == null) {
+ OseeLog.log(TestEnvironment.class, Level.INFO, "env null");
+ }
+ /*
+ * else if (testCase.getTestEnvironment().getStatusBoard() == null)
+ * OseeLog.log(Activator.class, Level.INFO, "nullstatus board");
+ * testCase
+ * .getTestEnvironment().getStatusBoard().setCurrentScriptCurrentTestCase
+ * (testCase.getTestCaseNumber());
+ */
+ }
+
+ /**
+ * Convert an element to XML format.
+ *
+ * @return XML formated element.
+ */
+ @Override
+ public Element toXml(Document doc) {
+ return testCase.toXml(doc);
+ }
+
+ @Override
+ public void toXml(XMLStreamWriter writer) throws XMLStreamException {
+ testCase.toXml(writer);
+ }
+
+ @JsonProperty
+ public TestCase getTestCase() {
+ return testCase;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TestDescriptionRecord.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TestDescriptionRecord.java
new file mode 100644
index 000000000..d4fb6ba2a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TestDescriptionRecord.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.log.record;
+
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.log.TestLevel;
+import org.eclipse.osee.ote.core.test.tags.BaseTestTags;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+public class TestDescriptionRecord extends TestRecord {
+
+ private static final long serialVersionUID = -2188431468814850228L;
+ private String purpose;
+ private String preCondition;
+ private String postCondition;
+
+ public TestDescriptionRecord(ITestEnvironmentAccessor testEnvironment) {
+ super(testEnvironment, TestLevel.TEST_POINT, "Description Record", false);
+ this.purpose = " ";
+ this.preCondition = " ";
+ this.postCondition = " ";
+ }
+
+ public void setPurpose(String purpose) {
+ this.purpose = purpose;
+ }
+
+ public void setPreCondition(String preCondition) {
+ this.preCondition = preCondition;
+ }
+
+ public void setPostCondition(String postCondition) {
+ this.postCondition = postCondition;
+ }
+
+ @Override
+ public Element toXml(Document doc) {
+ Element root = doc.createElement(BaseTestTags.DESCRIPTION_FIELD);
+ root.appendChild(Jaxp.createElement(doc, BaseTestTags.PURPOSE_FIELD, purpose));
+ root.appendChild(Jaxp.createElement(doc, BaseTestTags.PRECONDITION_FIELD, preCondition));
+ root.appendChild(Jaxp.createElement(doc, BaseTestTags.POSTCONDITION_FIELD, postCondition));
+ return root;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TestPointRecord.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TestPointRecord.java
new file mode 100644
index 000000000..c9d659d90
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TestPointRecord.java
@@ -0,0 +1,214 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.log.record;
+
+import java.util.logging.Level;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.jdk.core.util.xml.XMLStreamWriterUtil;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.TestCase;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestPoint;
+import org.eclipse.osee.ote.core.log.TestLevel;
+import org.eclipse.osee.ote.core.testPoint.CheckPoint;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ * @author Robert A. Fisher
+ * @author Charles Shaw
+ */
+public class TestPointRecord extends TestRecord {
+ private static final long serialVersionUID = 921875066237859323L;
+ private int number;
+ protected ITestPoint testPoint;
+
+ public TestPointRecord(ITestEnvironmentAccessor source, ITestPoint testPoint, boolean timeStamp) {
+ this(source, source.getTestScript(), source.getTestScript().getTestCase(), testPoint, timeStamp);
+ }
+
+ /**
+ * TestPointRecord Constructor. Sets up a test point record of the result of
+ * the test point.
+ *
+ * @param source
+ * The object requesting the logging.
+ * @param accessor
+ * The test case the test point is in.
+ * @param testPoint
+ * The TestSubPoint object for the test point.
+ * @param timeStamp
+ * <b>True </b> if a timestamp should be recorded, <b>False </b>
+ * if not.
+ */
+ public TestPointRecord(ITestEnvironmentAccessor source, TestScript script, TestCase accessor, ITestPoint testPoint, boolean timeStamp) {
+ super(source, TestLevel.TEST_POINT, "", timeStamp);
+ this.testPoint = testPoint;
+ script.__addTestPoint(testPoint.isPass());
+ // this.testCase = accessor.getTestCase();
+ if (accessor == null) {
+ // OseeLog.log(Activator.class, Level.INFO, "test case null");
+ } else if (accessor.getTestScript() == null) {
+ OseeLog.log(TestEnvironment.class, Level.INFO, "test script null");
+ }
+ if (testPoint == null) {
+ OseeLog.log(TestEnvironment.class, Level.INFO, "test point null");
+ }
+ this.number = script.__recordTestPoint(testPoint.isPass());
+ }
+
+ /**
+ * TestPointRecord Constructor. Sets up a test point record of the result of
+ * the test point
+ *
+ * @param source
+ * The object requesting the logging.
+ * @param testPoint
+ * The TestPoint object for the test point.
+ */
+ public TestPointRecord(ITestEnvironmentAccessor source, TestScript script, TestCase testCase, ITestPoint testPoint) {
+ this(source, script, testCase, testPoint, true);
+ int point = script.getCurrentPointNumber();
+
+ if (!testPoint.isPass()) {
+ try {
+ if (testPoint instanceof CheckPoint) {
+ CheckPoint cp = (CheckPoint) testPoint;
+ String exp = cp.getExpected();
+ String act = cp.getActual();
+ String name = cp.getTestPointName();
+ Throwable th = new Throwable();
+ StringBuilder stack = new StringBuilder();
+ boolean printLine = false;
+ for (StackTraceElement element : th.getStackTrace()) {
+ if (!printLine && !element.toString().startsWith("org.eclipse.osee")) {
+ printLine = true;
+ }
+ if (printLine){
+ stack.append(element.toString());
+ stack.append("\n");
+ }
+ }
+ script.pauseScriptOnFail(point, name, exp, act, stack.toString());
+ script.printFailure(point, name, exp, act, stack.toString());
+ }
+ else {
+ script.pauseScriptOnFail(point);
+ script.printFailure(point);
+ }
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ /**
+ * TestPointRecord Constructor. Sets up a test point record of the result of
+ * the test point.
+ *
+ * @param source
+ * The object requesting the logging.
+ * @param script
+ * The test script object
+ * @param testCase
+ * The test case object
+ * @param testPointName
+ * The name of the item being tested.
+ * @param expected
+ * The expected value for the test point.
+ * @param actual
+ * The actual value for the test point.
+ * @param passed
+ * <b>True </b> if the test point passed, <b>False </b> if not.
+ * @param timeStamp
+ * <b>True </b> if a timestamp should be recorded, <b>False </b>
+ * if not.
+ */
+ public TestPointRecord(ITestEnvironmentAccessor source, TestScript script, TestCase testCase, String testPointName, String expected, String actual,
+ boolean passed, boolean timeStamp) {
+ this(source, script, testCase, new CheckPoint(testPointName, expected, actual, passed), timeStamp);
+ }
+
+ /**
+ * TestPointRecord Constructor. Sets up a test point record of the result of
+ * the test point.
+ *
+ * @param source
+ * The object requesting the logging.
+ * @param accessor
+ * The test case the test point is in.
+ * @param testPointName
+ * The name of the item being tested.
+ * @param expected
+ * The expected value for the test point.
+ * @param actual
+ * The actual value for the test point.
+ * @param passed
+ * <b>True </b> if the test point passed, <b>False </b> if not.
+ */
+ public TestPointRecord(ITestEnvironmentAccessor source, TestScript script, TestCase accessor, String testPointName, String expected, String actual,
+ boolean passed) {
+ this(source, script, accessor, testPointName, expected, actual, passed, true);
+ }
+
+ /**
+ * Converts element to XML formating.
+ *
+ * @return Element XML formated element.
+ */
+ @Override
+ public Element toXml(Document doc) {
+ Element tpElement = doc.createElement("TestPoint");
+ tpElement.appendChild(Jaxp.createElement(doc, "Number", String.valueOf(number)));
+ if (testPoint.isPass()) {
+ tpElement.appendChild(Jaxp.createElement(doc, "Result", "PASSED"));
+ } else {
+ tpElement.appendChild(Jaxp.createElement(doc, "Result", "FAILED"));
+ }
+ tpElement.appendChild(this.getLocation(doc));
+ tpElement.appendChild(testPoint.toXml(doc));
+
+ return tpElement;
+ }
+
+ @Override
+ public void toXml(XMLStreamWriter writer) throws XMLStreamException {
+ writer.writeStartElement("TestPoint");
+ XMLStreamWriterUtil.writeElement(writer, "Number", String.valueOf(number));
+ if (testPoint.isPass()) {
+ XMLStreamWriterUtil.writeElement(writer, "Result", "PASSED");
+ } else {
+ XMLStreamWriterUtil.writeElement(writer, "Result", "FAILED");
+ }
+ writeLocation(writer);
+ testPoint.toXml(writer);
+ writer.writeEndElement();
+ }
+
+ @JsonProperty
+ public ITestPoint getTestPoint() {
+ return testPoint;
+ }
+
+ @JsonProperty
+ public int getNumber() {
+ return number;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TestRecord.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TestRecord.java
new file mode 100644
index 000000000..07eef5d9f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TestRecord.java
@@ -0,0 +1,341 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.log.record;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+import java.util.regex.Pattern;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.codehaus.jackson.annotate.JsonIgnore;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.annotate.JsonSubTypes;
+import org.codehaus.jackson.annotate.JsonTypeInfo;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.eclipse.osee.framework.jdk.core.persistence.XmlizableStream;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.jdk.core.util.xml.XMLStreamWriterUtil;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.message.log.record.MessageJarConfigrecord;
+import org.eclipse.osee.ote.properties.OtePropertiesCore;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Michael A. Winston
+ */
+public abstract class TestRecord extends LogRecord implements Xmlizable, XmlizableStream {
+ private static final long serialVersionUID = 2663140700880844240L;
+ private static final ArrayList<Pattern> stacktraceExcludes = new ArrayList<>(32);
+ private static final ArrayList<Pattern> stacktraceIncludes = new ArrayList<>(32);
+ private static boolean filterTheStacktrace = true;
+ private static boolean locationLogginOn = true;
+ private List<LogRecord> children = new ArrayList<>();
+
+ public static void setLocationLoggingOn(boolean on) {
+ locationLogginOn = on;
+ }
+
+ public static boolean getLocationLoggingOn() {
+ return locationLogginOn;
+ }
+
+ static {
+ filterTheStacktrace = OtePropertiesCore.noStacktraceFilter.getValue() == null;
+ stacktraceExcludes.add(Pattern.compile("org\\.eclipse\\.osee\\..*"));
+ }
+
+ private final ITestEnvironmentAccessor source;
+ private long timeStamp;
+ private final boolean printTimeStamp;
+ private Throwable throwable;
+
+ /**
+ * TestRecord Constructor. This is an abstract class so this constructor is
+ * called via the super() call from the extended class. This sets the
+ * source, the logging level, the log message and whether a timestamp should
+ * be included.
+ *
+ * @param source
+ * The object requesting the logging.
+ * @param level
+ * The logging level.
+ * @param msg
+ * The log message.
+ * @param timeStamp
+ * <b>True </b> to include timestamp, <b>False </b> if not.
+ */
+ public TestRecord(ITestEnvironmentAccessor source, Level level, String msg, boolean timeStamp) {
+ super(level, msg);
+ this.throwable = new Throwable();
+ this.printTimeStamp = timeStamp;
+ this.source = source;
+ if (this.printTimeStamp) {
+ if (source != null) {
+ this.timeStamp = source.getEnvTime();
+ } else {
+ this.timeStamp = System.currentTimeMillis();
+ try {
+ throw new Exception("source was null");
+ } catch (Exception e) {
+ OseeLog.log(TestEnvironment.class, Level.SEVERE, e.getMessage(), e);
+ }
+ }
+ }
+ }
+
+ @JsonIgnore
+ public void setStackTrace(Throwable throwable) {
+ this.throwable = throwable;
+ }
+
+ private Element calc(Document doc) {
+ StackTraceElement[] stackElements = this.throwable.getStackTrace();
+ Element locationElement = doc.createElement("Location");
+ locationElement.setAttribute("id", Integer.toString(locationElement.hashCode()));
+ for (StackTraceElement stackElement : stackElements) {
+ addElement(doc, stackElement, locationElement);
+ }
+ return locationElement;
+ }
+
+ private void calc(XMLStreamWriter writer) throws XMLStreamException {
+ StackTraceElement[] stackElements = this.throwable.getStackTrace();
+ writer.writeStartElement("Location");
+ writer.writeAttribute("id", Integer.toString(stackElements.hashCode()));
+ for (StackTraceElement stackElement : stackElements) {
+ addElement(writer, stackElement);
+ }
+ }
+
+ private void addElement(XMLStreamWriter writer, StackTraceElement stackElement) throws XMLStreamException {
+ if (filterTheStacktrace) {
+ final String className = stackElement.getClassName();
+ for (Pattern includes : stacktraceIncludes) {
+ if (includes.matcher(className).matches()) {
+ writer.writeEmptyElement("Stacktrace");
+ writer.writeAttribute("source", stackElement.getClassName());
+ writer.writeAttribute("line", Integer.toString(stackElement.getLineNumber()));
+ // writer.writeEndElement();
+ return;
+ }
+ }
+ for (Pattern excludes : stacktraceExcludes) {
+ if (excludes.matcher(className).matches()) {
+ return;
+ }
+ }
+ }
+ writer.writeEmptyElement("Stacktrace");
+ writer.writeAttribute("source", stackElement.getClassName());
+ writer.writeAttribute("line", Integer.toString(stackElement.getLineNumber()));
+ // writer.writeEndElement();
+ }
+
+ private void addElement(Document doc, StackTraceElement stackElement, Element locationElement) {
+ if (filterTheStacktrace) {
+ final String className = stackElement.getClassName();
+ for (Pattern includes : stacktraceIncludes) {
+ if (includes.matcher(className).matches()) {
+ Element stackTrace = doc.createElement("Stacktrace");
+ stackTrace.setAttribute("source", stackElement.getClassName());
+ stackTrace.setAttribute("line", Integer.toString(stackElement.getLineNumber()));
+ locationElement.appendChild(stackTrace);
+ return;
+ }
+ }
+ for (Pattern excludes : stacktraceExcludes) {
+ if (excludes.matcher(className).matches()) {
+ return;
+ }
+ }
+ }
+ Element stackTrace = doc.createElement("Stacktrace");
+ stackTrace.setAttribute("source", stackElement.getClassName());
+ stackTrace.setAttribute("line", Integer.toString(stackElement.getLineNumber()));
+ locationElement.appendChild(stackTrace);
+ }
+
+ /**
+ * Converts log element to XML format.
+ *
+ * @return xml formated element.
+ */
+ @Override
+ public Element toXml(Document doc) {
+ Element recordElement = doc.createElement(getLevel().getName());
+ if (TestRecord.getLocationLoggingOn()) {
+ recordElement.appendChild(getLocation(doc));
+ }
+ recordElement.appendChild(Jaxp.createElement(doc, "Message", getMessage()));
+ return recordElement;
+ }
+
+ @Override
+ public void toXml(XMLStreamWriter writer) throws XMLStreamException {
+ writer.writeStartElement("OteLog");
+ writer.writeAttribute("Level", getLevel().getName());
+ writeMessage(writer);
+ writeLocationCheckLocationLoggingOn(writer);
+ writer.writeEndElement();
+ }
+
+ public Object getSource() {
+ return source;
+ }
+
+ /**
+ * @return Elements location.
+ */
+ protected Element getLocation(Document doc) {
+ Element locationElement = calc(doc);
+ if (this.printTimeStamp) {
+ locationElement.appendChild(Jaxp.createElement(doc, "Time", Long.toString(timeStamp)));
+ }
+ return locationElement;
+ }
+
+ protected void writeLocation(XMLStreamWriter writer) throws XMLStreamException {
+ calc(writer);
+ writeTime(writer);
+ writer.writeEndElement();
+ }
+
+ protected void writeLocationCheckLocationLoggingOn(XMLStreamWriter writer) throws XMLStreamException {
+ if (TestRecord.getLocationLoggingOn()) {
+ writeLocation(writer);
+ }
+ }
+
+ protected void writeTime(XMLStreamWriter writer) throws XMLStreamException {
+ if (this.printTimeStamp) {
+ writer.writeStartElement("Time");
+ writer.writeCharacters(Long.toString(timeStamp));
+ writer.writeEndElement();
+ }
+ }
+
+ protected void writeMessage(XMLStreamWriter writer) throws XMLStreamException {
+ writeElement(writer, "Message", getMessage());
+ }
+
+ protected void writeElement(XMLStreamWriter writer, String elementName, String characterData) throws XMLStreamException {
+ XMLStreamWriterUtil.writeElement(writer, elementName, characterData);
+ }
+
+ @JsonProperty
+ public List<String> getLocation() {
+ List<String> result = new ArrayList<>();
+ if (TestRecord.getLocationLoggingOn()) {
+ StackTraceElement[] stackTrace = this.throwable.getStackTrace();
+ result.addAll(filterStackTrace(stackTrace));
+ }
+ if (result.isEmpty()) {
+ return null;
+ } else {
+ return result;
+ }
+ }
+
+ private List<String> filterStackTrace(StackTraceElement[] stackTrace) {
+ // include everything if not filtered, otherwise ...
+ // default is to include unless explicitly excluded, but only if not
+ // explicitly included ... yuck
+ List<String> result = new ArrayList<>();
+ for (StackTraceElement stackElement : stackTrace) {
+ final String className = stackElement.getClassName();
+ if (!filterTheStacktrace || included(className) || !excluded(className)) {
+ result.add(stackElement.getClassName() + ":" + stackElement.getLineNumber());
+ }
+ }
+ return result;
+ }
+
+ private boolean excluded(String className) {
+ for (Pattern exclude : stacktraceExcludes) {
+ if (exclude.matcher(className).matches()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private boolean included(String className) {
+ for (Pattern include : stacktraceIncludes) {
+ if (include.matcher(className).matches()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @JsonProperty
+ public Long getTimeStamp() {
+ if (this.printTimeStamp) {
+ return timeStamp;
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ @JsonProperty
+ public String getMessage() {
+ return nonEmptyString(super.getMessage());
+ }
+
+ protected String nonEmptyString(final String subject) {
+ if (subject != null && subject.trim().length() > 0) {
+ return subject;
+ } else {
+ return null;
+ }
+ }
+
+
+ protected <T> List<T> nonEmptyList(final List<T> subject) {
+ return (List<T>) nonEmptyCollection(subject);
+ }
+
+ protected <T> Collection<T> nonEmptyCollection(final Collection<T> subject) {
+ if (subject.isEmpty()) {
+ return null;
+ } else {
+ return subject;
+ }
+ }
+
+ // we want LogRecord to record its level in the JSON, but not derivatives, but we must
+ // preserve default behavior for other things, like the log handler
+ @JsonIgnore
+ @Override
+ public Level getLevel() {
+ return super.getLevel();
+ }
+
+ public void addChildRecord(final LogRecord record) {
+ children.add(record);
+ }
+
+ @JsonProperty
+ public List<LogRecord> getChildRecords() {
+ return nonEmptyList(children);
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TraceRecord.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TraceRecord.java
new file mode 100644
index 000000000..191bac898
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TraceRecord.java
@@ -0,0 +1,139 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.log.record;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.LogRecord;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.annotate.JsonTypeInfo;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.eclipse.osee.framework.jdk.core.persistence.XmlizableStream;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.jdk.core.util.xml.XMLStreamWriterUtil;
+import org.eclipse.osee.ote.core.MethodFormatter;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.log.TestLevel;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class TraceRecord extends TestRecord implements Xmlizable {
+ private static final long serialVersionUID = 8567378567805515775L;
+ private final String objectName;
+ private final String methodName;
+ private final MethodFormatter methodArguments;
+ private final ArrayList<Xmlizable> additionalElements;
+ private final ArrayList<XmlizableStream> additionalStreamElements;
+
+ private static final String additionalString = "AdditionalInfo";
+
+ /**
+ * TraceRecord Constructor. Sets up a Trace log message.
+ *
+ * @param source The object requesting the logging.
+ * @param timeStamp <b>True </b> if a timestamp should be recorded, <b>False </b> if not.
+ */
+ public TraceRecord(ITestEnvironmentAccessor source, String objectName, String methodName, MethodFormatter methodArguments, boolean timeStamp, boolean startFlag) {
+ this(source, objectName, methodName, methodArguments, timeStamp);
+ }
+
+ public TraceRecord(ITestEnvironmentAccessor source, String objectName, String methodName, MethodFormatter methodArguments, boolean timeStamp) {
+ super(source, TestLevel.TRACE, "", timeStamp);
+ this.objectName = objectName;
+ this.methodName = methodName;
+ this.methodArguments = methodArguments;
+ this.additionalElements = new ArrayList<>();
+ this.additionalStreamElements = new ArrayList<>();
+ }
+
+ public TraceRecord(ITestEnvironmentAccessor source, String objectName2, String methodName2, MethodFormatter methodArguments2) {
+ this(source, objectName2, methodName2, methodArguments2, true);
+ }
+
+ public void addAdditionalElement(Xmlizable object) {
+ if (object != null) {
+ additionalElements.add(object);
+ }
+ }
+
+ public void addAdditionalElement(XmlizableStream object) {
+ if (object != null) {
+ additionalStreamElements.add(object);
+ }
+ }
+
+ /**
+ * Converts element to XML formating.
+ *
+ * @return Element XML formated element.
+ */
+ @Override
+ public Element toXml(Document doc) {
+ Element trElement = doc.createElement("Trace");
+ trElement.appendChild(Jaxp.createElement(doc, "ObjectName", objectName));
+ trElement.appendChild(Jaxp.createElement(doc, "MethodName", methodName));
+ trElement.appendChild(methodArguments.toXml(doc));
+ if (!additionalElements.isEmpty()) {
+ Element additional = doc.createElement(additionalString);
+ trElement.appendChild(additional);
+ for (Xmlizable object : additionalElements) {
+ additional.appendChild(object.toXml(doc));
+ }
+ }
+ if (TestRecord.getLocationLoggingOn()) {
+ trElement.appendChild(getLocation(doc));
+ }
+ return trElement;
+ }
+
+ @Override
+ public void toXml(XMLStreamWriter writer) throws XMLStreamException {
+ writer.writeStartElement("Trace");
+ XMLStreamWriterUtil.writeElement(writer, "ObjectName", objectName);
+ XMLStreamWriterUtil.writeElement(writer, "MethodName", methodName);
+ methodArguments.toXml(writer);
+ if (!additionalElements.isEmpty()) {
+ writer.writeStartElement(additionalString);
+ for (XmlizableStream object : additionalStreamElements) {
+ object.toXml(writer);
+ }
+ writer.writeEndElement();
+ }
+ writeLocationCheckLocationLoggingOn(writer);
+ }
+
+ @JsonProperty
+ public String getArguments() {
+ return nonEmptyString(methodArguments.toString());
+ }
+
+ @JsonProperty
+ public List<?> getAdditionalInfo() {
+ return nonEmptyList(additionalStreamElements);
+ }
+
+ @JsonProperty
+ public String getObjectName() {
+ return nonEmptyString(objectName);
+ }
+
+ @JsonProperty
+ public String getMethodName() {
+ return nonEmptyString(methodName);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TraceRecordEnd.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TraceRecordEnd.java
new file mode 100644
index 000000000..24b8a4aef
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/TraceRecordEnd.java
@@ -0,0 +1,104 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.log.record;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.codehaus.jackson.annotate.JsonIgnore;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.eclipse.osee.framework.jdk.core.persistence.XmlizableStream;
+import org.eclipse.osee.ote.core.ReturnFormatter;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.log.TestLevel;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+public class TraceRecordEnd extends TestRecord implements Xmlizable {
+
+ private static final long serialVersionUID = 8567378567805515775L;
+ private final ReturnFormatter returnFormatter;
+ private final ArrayList<Xmlizable> additionalElements;
+ private final ArrayList<XmlizableStream> additionalStreamElements;
+
+ private static final String additionalString = "AdditionalInfo";
+
+ public TraceRecordEnd(ITestEnvironmentAccessor source, ReturnFormatter returnFormatter) {
+ super(source, TestLevel.TRACE, "", true);
+ this.returnFormatter = returnFormatter;
+ this.additionalElements = new ArrayList<>();
+ this.additionalStreamElements = new ArrayList<>();
+ }
+
+ public void addAdditionalElement(Xmlizable object) {
+ if (object != null) {
+ additionalElements.add(object);
+ }
+ }
+
+ public void addAdditionalElement(XmlizableStream object) {
+ if (object != null) {
+ additionalStreamElements.add(object);
+ }
+ }
+
+ /**
+ * Converts element to XML formating.
+ *
+ * @return Element XML formated element.
+ */
+ @Override
+ public Element toXml(Document doc) {
+ Element trElement = doc.createElement("TraceEnd");
+ trElement.appendChild(returnFormatter.toXml(doc));
+ if (!additionalElements.isEmpty()) {
+ Element additional = doc.createElement(additionalString);
+ trElement.appendChild(additional);
+ for (Xmlizable object : additionalElements) {
+ additional.appendChild(object.toXml(doc));
+ }
+ }
+ return trElement;
+ }
+
+ @Override
+ public void toXml(XMLStreamWriter writer) throws XMLStreamException {
+ writer.writeStartElement("TraceEnd");
+ returnFormatter.toXml(writer);
+ if (!additionalElements.isEmpty()) {
+ writer.writeStartElement(additionalString);
+ for (XmlizableStream object : additionalStreamElements) {
+ object.toXml(writer);
+ }
+ }
+ writer.writeEndElement();
+ }
+
+ @JsonProperty
+ public ReturnFormatter getReturnValue() {
+ return returnFormatter;
+}
+
+@Override
+@JsonIgnore
+ public List<String> getLocation() {
+ return null;
+ }
+
+ @JsonProperty
+ public List<?> getAdditionalInfo() {
+ return nonEmptyList(additionalStreamElements);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/WarningRecord.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/WarningRecord.java
new file mode 100644
index 000000000..8267d7f5a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/WarningRecord.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.log.record;
+
+import java.util.logging.Level;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public class WarningRecord extends TestRecord {
+
+ private static final long serialVersionUID = -3124953320400273382L;
+
+ /**
+ * WarningRecord Constructor. Sets up a Warning log message.
+ *
+ * @param source The object requesting the logging.
+ * @param msg The log message.
+ * @param timeStamp <b>True </b> if a timestamp should be recorded, <b>False </b> if not.
+ */
+ public WarningRecord(ITestEnvironmentAccessor source, String msg, boolean timeStamp) {
+ super(source, Level.WARNING, msg, timeStamp);
+ }
+
+ /**
+ * WarningRecord Constructor. Sets up a Warning log message.
+ *
+ * @param source The object requesting the logging.
+ * @param msg The log message.
+ */
+ public WarningRecord(ITestEnvironmentAccessor source, String msg) {
+ this(source, msg, true);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/json/LogRecordModule.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/json/LogRecordModule.java
new file mode 100644
index 000000000..70fa79a5d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/log/record/json/LogRecordModule.java
@@ -0,0 +1,34 @@
+package org.eclipse.osee.ote.core.log.record.json;
+
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+
+import org.codehaus.jackson.Version;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.annotate.JsonSubTypes;
+import org.codehaus.jackson.annotate.JsonTypeInfo;
+import org.codehaus.jackson.map.module.SimpleModule;
+import org.eclipse.osee.ote.core.log.record.TestRecord;
+
+public class LogRecordModule extends SimpleModule {
+
+ public LogRecordModule() {
+ super("LogRecordModule", new Version(0, 0, 1, null));
+ }
+
+ @Override
+ public void setupModule(SetupContext context) {
+ context.setMixInAnnotations(LogRecord.class, MixIn.class);
+ }
+
+ abstract class MixIn {
+ MixIn(@JsonProperty("Level") Level level, @JsonProperty("Message") String message) {
+ };
+
+ @JsonProperty
+ abstract public Level getLevel();
+
+ @JsonProperty
+ abstract public String getMessage();
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModel.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModel.java
new file mode 100644
index 000000000..1265d6c44
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModel.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.model;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import org.eclipse.osee.ote.core.environment.EnvironmentTask;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IModel extends Remote {
+ void turnModelOn() throws RemoteException;
+
+ void turnModelOff() throws RemoteException;
+
+ void init(TestEnvironment testEnvironment, ModelKey key) throws RemoteException;
+
+ ModelState getState() throws RemoteException;
+
+ <CLASSTYPE extends IModel> ModelKey getKey() throws RemoteException;
+
+ void dispose() throws RemoteException;
+
+ EnvironmentTask getEnvironmentTask() throws RemoteException;
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModelKeyFactory.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModelKeyFactory.java
new file mode 100644
index 000000000..151e08e36
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModelKeyFactory.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.model;
+
+import java.util.Collection;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IModelKeyFactory {
+ Collection<ModelKey> getModelKeys();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModelListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModelListener.java
new file mode 100644
index 000000000..9dd542a96
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModelListener.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.model;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IModelListener extends Remote {
+
+ void onModelPreCreate(ModelKey key) throws RemoteException;
+
+ void onModelPostCreate(ModelKey key) throws RemoteException;
+
+ void onModelDispose(ModelKey key) throws RemoteException;
+
+ void onModelStateChange(ModelKey key, ModelState state) throws RemoteException;
+
+ int getHashCode() throws RemoteException;
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModelManager.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModelManager.java
new file mode 100644
index 000000000..3218c94b9
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModelManager.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.model;
+
+import java.rmi.RemoteException;
+import java.util.List;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IModelManager {
+ <CLASSTYPE extends IModel> CLASSTYPE getModel(ModelKey<CLASSTYPE> key);
+
+ <CLASSTYPE extends IModel> void disposeModel(ModelKey<?> key);
+
+ <CLASSTYPE extends IModel> void registerModel(ModelKey<?> key);
+
+ void changeModelState(ModelKey<?> key, ModelState state);
+
+ void notifyModelStateListener(ModelKey<?> key, ModelState state) throws RemoteException;
+
+ @Deprecated
+ void notifyModeStateListener(ModelKey key, ModelState state) throws RemoteException;
+
+ List<ModelKey> getRegisteredModels();
+
+ void releaseReference(IModel model);
+
+ void releaseAllReferences(ModelKey<?> key);
+
+ void addModelActivityListener(IModelListener listener);
+
+ void removeModelActivityListener(IModelListener listener);
+
+ void addModelActivityListener(IModelListener listener, ModelKey<?> key);
+
+ void removeModelActivityListener(IModelListener listener, ModelKey<?> key);
+
+ ModelState getModelState(ModelKey<?> key) throws RemoteException;
+
+ /**
+ * Releases a single reference of the model given by the class.
+ *
+ * @param key
+ */
+ void releaseReference(ModelKey<?> key);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModelManagerRemote.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModelManagerRemote.java
new file mode 100644
index 000000000..c2f7f2b6e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IModelManagerRemote.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.model;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import java.util.List;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IModelManagerRemote extends Remote {
+ List<ModelKey> getRegisteredModels() throws RemoteException;
+
+ Remote getRemoteModel(ModelKey<?> key) throws RemoteException;
+
+ ModelState getModelState(ModelKey<?> key) throws RemoteException;
+
+ void releaseReference(ModelKey<?> key) throws RemoteException;
+
+ void addModelActivityListener(IModelListener listener) throws RemoteException;
+
+ void removeModelActivityListener(IModelListener listener) throws RemoteException;
+
+ void addModelActivityListener(IModelListener listener, ModelKey<?> key) throws RemoteException;
+
+ void removeModelActivityListener(IModelListener listener, ModelKey<?> key) throws RemoteException;
+
+ void changeModelState(ModelKey<?> key, ModelState state) throws RemoteException;
+
+ void releaseAllReferences(ModelKey<?> key) throws RemoteException;
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IRemoteModel.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IRemoteModel.java
new file mode 100644
index 000000000..182b95c88
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/IRemoteModel.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.model;
+
+import java.rmi.Remote;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IRemoteModel extends Remote {
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/ModelKey.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/ModelKey.java
new file mode 100644
index 000000000..aa114f061
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/ModelKey.java
@@ -0,0 +1,119 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.model;
+
+import java.io.Serializable;
+
+/**
+ * This key is used by the model manager to search for a model already instanciated for this environment. Each of the
+ * getter functions MUST return a unique identifier for the specific model they represent ( or null if that particular
+ * type isn't available).
+ *
+ * @author Andrew M. Finkbeiner
+ */
+public class ModelKey<M extends IModel> implements Serializable, Comparable {
+ private static final long serialVersionUID = 4735332847721441142L;
+ private String className;
+ private String name;
+ private Class<M> modelClass;
+
+ public ModelKey(String className) {
+ this(className, null, null);
+ }
+
+ public ModelKey(ModelKey key) {
+ this(key.className, key.name, null);
+ }
+
+ public ModelKey(Class<M> clazz) {
+ this(clazz.getCanonicalName(), null, clazz);
+ }
+
+ public ModelKey(Class<M> clazz, String name) {
+ this(clazz.getCanonicalName(), name, clazz);
+ }
+
+ public ModelKey(String className, String name, Class<M> modelClass) {
+ this.className = className;
+ this.name = name;
+ this.modelClass = modelClass;
+ }
+
+ /**
+ * return the instance class for the model specified by this key. This class MUST match for all keys specifying this
+ * particular model.
+ *
+ * @return The class for the model described by this key. This may be null if no class name is available but in this
+ * case {@link #getClassName()} must NOT return null.
+ */
+ public Class<M> getModelClass() {
+ return this.modelClass;
+ }
+
+ public void setModelClass(Class<M> modelClass) {
+ this.modelClass = modelClass;
+ }
+
+ /**
+ * return the name of the model specified by this key.
+ *
+ * @return The name for the model described by this key
+ */
+ public String getName() {
+ if (this.name == null) {
+ this.name = this.getClassName().substring(this.getClassName().lastIndexOf(".") + 1);
+ }
+ return this.name;
+ }
+
+ /**
+ * return the fully qualified class name for the model specified by this key. This class name MUST match for all keys
+ * specifying this particular model.
+ *
+ * @return The class name for the model described by this key. This may be null if no class name is available but in
+ * this case {@link #getModelClass()} must NOT return null.
+ */
+ public String getClassName() {
+ if (className != null) {
+ return this.className;
+ } else if (modelClass != null) {
+ return modelClass.getCanonicalName();
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ return getClassName().equals(((ModelKey) obj).getClassName());
+ }
+
+ @Override
+ public int hashCode() {
+ return getClassName().hashCode();
+ }
+
+ @Override
+ public int compareTo(Object o) {
+ if (!(o instanceof ModelKey)) {
+ return -1;
+ }
+
+ ModelKey otherKey = (ModelKey) o;
+ return this.getName().compareTo(otherKey.getName());
+ }
+
+ @Override
+ public String toString() {
+ return getClassName();
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/ModelState.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/ModelState.java
new file mode 100644
index 000000000..b2079e30e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/model/ModelState.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.model;
+
+import java.io.Serializable;
+
+/**
+ * @author Michael P. Masterson
+ */
+public enum ModelState implements Serializable {
+ DISPOSED,
+ PAUSED,
+ RUNNING;
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/osgi/IServiceOperation.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/osgi/IServiceOperation.java
new file mode 100644
index 000000000..dc373eacb
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/osgi/IServiceOperation.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.osgi;
+
+/**
+ * An operation that interacts with an OSGI service in an atomic manner
+ *
+ * @author Ken J. Aguilar
+ */
+public interface IServiceOperation {
+
+ /**
+ * the operation to perform against the service. The service instance will be valid during the execution of the
+ * operation. Subclasses should handle the case when the operation is asynchronously interrupted.
+ */
+ void doOperation(Object service) throws InterruptedException;
+
+ /**
+ * called when the service is about to be removed.
+ */
+ void interrupt();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/osgi/ServiceOperationExecutor.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/osgi/ServiceOperationExecutor.java
new file mode 100644
index 000000000..ce0b89bc7
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/osgi/ServiceOperationExecutor.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.osgi;
+
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.ReentrantLock;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * A special service tracker that allows the atomic execution of an operation against a service. This provides a way for
+ * a complex operation to interact with an OSGI service without fear of the service being removed in the middle of the
+ * operation
+ *
+ * @author Ken J. Aguilar
+ */
+public class ServiceOperationExecutor extends ServiceTracker {
+
+ private IServiceOperation operationInProgress = null;
+ private final ReentrantLock operationLock = new ReentrantLock();
+ private final Condition operationComplete = operationLock.newCondition();
+
+ public ServiceOperationExecutor(BundleContext context, String serviceName) {
+ super(context, serviceName, null);
+ }
+
+ @Override
+ public void close() {
+ waitForOperationComplete();
+ super.close();
+ }
+
+ @Override
+ public void removedService(ServiceReference reference, Object service) {
+ waitForOperationComplete();
+ super.removedService(reference, service);
+ }
+
+ protected void waitForOperationComplete() {
+ operationLock.lock();
+ try {
+ if (operationInProgress != null) {
+ operationInProgress.interrupt();
+ while (operationInProgress != null) {
+ operationComplete.await();
+ }
+ }
+ } catch (InterruptedException e) {
+ /*
+ * we got interrupted ourselves!! Standard practice is to call the current threads interrupt() if we can't
+ * re-throw the interrupted exception
+ */
+ Thread.currentThread().interrupt();
+ } finally {
+ operationLock.unlock();
+ }
+ }
+
+ /**
+ * executes the operation.
+ *
+ * @return true if the operation completed or false if the dependent service was not acquired
+ * @throws InterruptedException if the service operation was interrupted
+ */
+ public boolean executeOperation(IServiceOperation operation) throws InterruptedException {
+
+ final Object service;
+ // lock so we can safely get the service and set the operation in progress
+ operationLock.lock();
+ service = getService();
+ if (service == null) {
+ // the tracked service has not been acquired yet
+ return false;
+ }
+ operationInProgress = operation;
+ /*
+ * unlock since we do not want to be holding the lock while the operation is in progress.
+ */
+ operationLock.unlock();
+
+ try {
+ operationInProgress.doOperation(service);
+ } finally {
+ /*
+ * if we get interrupted or something else happens make sure we signal operation complete so that we can
+ * prevent deadlocks if something was waiting on the operation
+ */
+ operationLock.lock();
+ operationInProgress = null;
+ operationComplete.signal();
+ operationLock.unlock();
+
+ }
+ return true;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/test/shells/BashShell.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/test/shells/BashShell.java
new file mode 100644
index 000000000..a4f4714a9
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/test/shells/BashShell.java
@@ -0,0 +1,138 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.test.shells;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintStream;
+import java.net.SocketException;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.io.InputBufferThread;
+
+public class BashShell {
+ private static final int MAX_RESPONSE_TIME = 20000;
+
+ private static final int ITERATION_TIME = 2000;
+
+ private final InputStream in;
+
+ private final PrintStream out;
+
+ private final InputBufferThread inputBuffer;
+
+ // private String prompt = "$ ";
+
+ /**
+ * Connects telnet to the specified ipAddress and port
+ */
+ public BashShell() throws SocketException, IOException {
+ String shell;
+ if (Lib.isWindows()) {
+ shell = "cmd.exe";
+ } else {
+ shell = "/bin/bash";
+ }
+ Process process;
+
+ process = Runtime.getRuntime().exec(new String[] {shell});
+
+ in = process.getInputStream();
+ out = new PrintStream(process.getOutputStream());
+
+ inputBuffer = new InputBufferThread(in);
+ inputBuffer.start();
+
+ }
+
+ /**
+ * writes the command given to the output stream ( telnet )
+ *
+ * @param string The command to give
+ */
+ public void write(String string) {
+ out.println(string);
+ out.flush();
+ }
+
+ /**
+ * Sits on the line, reading in characters, and waits for the expected output from telnet
+ *
+ * @param string The String this function will stop on and return
+ * @return The entire string seen up to finding the string provided
+ */
+ public synchronized String waitFor(String string) throws InterruptedException {
+
+ int elapsedTime = 0;
+ while (elapsedTime <= MAX_RESPONSE_TIME) {
+ if (inputBuffer.contains(string, true) >= 0) {
+ break;
+ }
+ this.wait(ITERATION_TIME);
+ elapsedTime += ITERATION_TIME;
+ }
+ if (elapsedTime > MAX_RESPONSE_TIME) {
+ throw new InterruptedException(
+ "Waiting for '" + string + "' took longer then " + MAX_RESPONSE_TIME + " miliseconds.");
+ }
+ return inputBuffer.getBuffer();
+ }
+
+ /**
+ * Writes the command to telnet and waits for the normal command prompt
+ *
+ * @param string The command to issue
+ * @return Returns the whole buffer up to the prompt
+ */
+ public String sendCommand(String string, long wait) throws InterruptedException {
+
+ write(string);
+ return waitFor(wait);
+ }
+
+ private String waitFor(long time) throws InterruptedException {
+ while (System.currentTimeMillis() - inputBuffer.getLastRead() < time) {
+ synchronized (this) {
+ this.wait(100);
+ }
+ }
+ return inputBuffer.getBuffer();
+ }
+
+ /**
+ * disconnects from telnet
+ */
+ public void disconnect() {
+ write("ls");
+ inputBuffer.stopOnNextRun(true);
+ write("exit");
+ }
+
+ // private String getBuffer() {
+ // return inputBuffer.getBuffer();
+ // }
+
+ public static void main(String[] args) {
+ BashShell shell;
+ try {
+ shell = new BashShell();
+ String env = shell.sendCommand("env", 4000L);
+ System.out.println(env);
+ shell.disconnect();
+ } catch (SocketException e) {
+
+ } catch (IOException e) {
+
+ } catch (InterruptedException e) {
+
+ }
+
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/test/shells/TelnetShell.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/test/shells/TelnetShell.java
new file mode 100644
index 000000000..ed0022838
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/test/shells/TelnetShell.java
@@ -0,0 +1,339 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2009 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.test.shells;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.UnsupportedEncodingException;
+import java.net.SocketException;
+import java.nio.ByteBuffer;
+import java.nio.channels.Channels;
+import java.nio.channels.ReadableByteChannel;
+import java.nio.channels.WritableByteChannel;
+import java.util.logging.Level;
+import java.util.regex.MatchResult;
+import java.util.regex.Pattern;
+import org.apache.commons.net.telnet.EchoOptionHandler;
+import org.apache.commons.net.telnet.InvalidTelnetOptionException;
+import org.apache.commons.net.telnet.SuppressGAOptionHandler;
+import org.apache.commons.net.telnet.TelnetClient;
+import org.apache.commons.net.telnet.TelnetNotificationHandler;
+import org.apache.commons.net.telnet.TelnetOption;
+import org.apache.commons.net.telnet.TerminalTypeOptionHandler;
+import org.eclipse.osee.framework.jdk.core.util.io.InputBufferThread;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+
+/**
+ * Created on Aug 15, 2005
+ */
+public class TelnetShell implements TelnetNotificationHandler {
+
+ private static final int MAX_RESPONSE_TIME = 10000;
+ public final static class Piper extends Thread {
+ private final InputStream inStream;
+ private final OutputStream outStream;
+
+ public final ByteBuffer buffer = ByteBuffer.allocateDirect(1024);
+
+ public Piper(InputStream in, OutputStream out) {
+ super("Stream Piper");
+ this.inStream = in;
+ this.outStream = out;
+ }
+
+ @Override
+ public void run() {
+ final ReadableByteChannel in = Channels.newChannel(inStream);
+ final WritableByteChannel out = Channels.newChannel(outStream);
+ try {
+ buffer.clear();
+ while (true) {
+ in.read(buffer);
+ buffer.flip();
+ out.write(buffer);
+ buffer.compact();
+ }
+ } catch (IOException e) {
+ e.printStackTrace(System.err);
+ }
+ }
+ }
+
+ private final TelnetClient telnet;
+ private final InputStream in;
+ private final OutputStream out;
+ private InputBufferThread inputBuffer;
+ private String prompt = "$ ";
+ private int currentOutput = 0;
+
+ /**
+ * Connects telnet to the specified ipAddress and port
+ */
+ public TelnetShell(String ipAddress, int port) throws SocketException, IOException {
+ this(ipAddress, port, true);
+ }
+
+ public TelnetShell(String ipAddress, int port, boolean start) throws SocketException, IOException {
+ telnet = new TelnetClient();
+ telnet.registerNotifHandler(this);
+ SuppressGAOptionHandler sgaOpt = new SuppressGAOptionHandler(true, true, true, true);
+ TerminalTypeOptionHandler ttOpt = new TerminalTypeOptionHandler("VT100", false, false, true, false);
+ EchoOptionHandler eOPt = new EchoOptionHandler(true, false, true, false);
+ try {
+ telnet.addOptionHandler(ttOpt);
+ telnet.addOptionHandler(sgaOpt);
+ telnet.addOptionHandler(eOPt);
+ } catch (InvalidTelnetOptionException e) {
+ throw new IllegalStateException("invalid telnet options", e);
+ }
+ telnet.connect(ipAddress, port);
+ try {
+ Thread.sleep(1500);
+ } catch (InterruptedException ex) {
+ ex.printStackTrace();
+ }
+
+ /*
+ * try { if (!telnet.sendAYT(5000)) { throw new SocketException("server appears to be in use"); } } catch
+ * (IllegalArgumentException ex) { ex.printStackTrace(); } catch (InterruptedException ex) { ex.printStackTrace();
+ * }
+ */
+ //printOptionStates();
+ in = telnet.getInputStream();
+ out = telnet.getOutputStream();
+ if (start) {
+ inputBuffer = new InputBufferThread(in);
+ inputBuffer.start();
+
+ }
+ }
+
+ /**
+ * writes the command given to the output stream ( telnet )
+ *
+ * @param string The command to give
+ */
+ public void write(String string) {
+ // currentOutput = inputBuffer.getLength() + string.length() + 1;
+ try {
+ for (byte b : string.getBytes("us-ascii")) {
+ out.write(b);
+ out.flush();
+
+ try {
+ Thread.sleep(10);
+ } catch (InterruptedException ex) {
+ ex.printStackTrace();
+ }
+
+ }
+ out.write(getNewline());
+ out.flush();
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ public String writeAndGetPrompt(String string, int timeout) throws Exception {
+ inputBuffer.clear();
+ // currentOutput = inputBuffer.getLength() + string.length() + 1;
+ for (byte b : string.getBytes("us-ascii")) {
+ out.write(b);
+ out.flush();
+
+ try {
+ Thread.sleep(10);
+ } catch (InterruptedException ex) {
+ ex.printStackTrace();
+ }
+
+ }
+ out.write(getNewline());
+ out.flush();
+ Thread.sleep(timeout);
+ return inputBuffer.getBuffer();
+
+ }
+
+ /**
+ * Sits on the line, reading in characters, and waits for the expected output from telnet
+ *
+ * @param string The String this function will stop on and return
+ */
+ public synchronized void waitFor(String string) throws InterruptedException {
+ if (inputBuffer.waitFor(string, true, MAX_RESPONSE_TIME) < 0) {
+ throw new InterruptedException(
+ "Waiting for '" + string + "' took longer then " + MAX_RESPONSE_TIME + " miliseconds.");
+ }
+ }
+
+ public synchronized MatchResult waitForPattern(Pattern pattern, int millis) throws InterruptedException {
+ MatchResult index = inputBuffer.waitFor(pattern, false, millis);
+ if (index == null) {
+ throw new InterruptedException(
+ "Waiting for '" + pattern.pattern() + "' took longer then " + millis + " miliseconds.");
+ }
+ return index;
+ }
+
+ public synchronized void waitForTransmission(int millis) throws InterruptedException {
+ if (!inputBuffer.waitFor(millis)) {
+ throw new InterruptedException("Waiting for transmission took longer then " + millis + " miliseconds.");
+ }
+ }
+
+ public synchronized String getBuffer(int start, int end) {
+ return inputBuffer.subString(start, end);
+ }
+
+ public synchronized String captureTo(String string) throws InterruptedException {
+ int index = inputBuffer.waitFor(string, false, MAX_RESPONSE_TIME);
+ if (index < 0) {
+ throw new InterruptedException(
+ "Waiting for '" + string + "' took longer then " + MAX_RESPONSE_TIME + " miliseconds.");
+ }
+ return inputBuffer.subString(0, index);
+ }
+
+ /**
+ * Writes the command to telnet and waits for the normal command prompt
+ *
+ * @param string The command to issue
+ */
+ public void sendCommand(String string) throws InterruptedException {
+ currentOutput = inputBuffer.getLength() + string.length() + 1;
+ write(string);
+ waitFor(prompt);
+ }
+
+ /**
+ * disconnects from telnet
+ */
+ public void disconnect() {
+ try {
+ try {
+ inputBuffer.stopNow();
+ } finally {
+ telnet.disconnect();
+ }
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ public static void main(String[] args) {
+ try {
+ BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
+ System.out.println("Enter host name or ip address (#.#.#.#))");
+ String host = reader.readLine();
+ System.out.println("Enter port");
+ String string = reader.readLine();
+ if (string == null) {
+ return;
+ }
+ int port = Integer.parseInt(string);
+ TelnetShell shell = new TelnetShell(host, port, false);
+ Piper piper = new Piper(shell.in, System.out);
+ piper.start();
+ try {
+ boolean done = false;
+ while (!done) {
+ String in = reader.readLine();
+ if (in.equals("quit")) {
+ done = true;
+ } else {
+ shell.write(in);
+ }
+ }
+ shell.disconnect();
+ } finally {
+ piper.interrupt();
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void setPrompt(String prompt) {
+ this.prompt = prompt;
+ }
+
+ public String getBuffer() {
+ return inputBuffer.getBuffer();
+ }
+
+ public String getCurrentBuffer() {
+ try {
+ inputBuffer.waitFor(MAX_RESPONSE_TIME);
+ } catch (InterruptedException e) {
+ OseeLog.log(TestEnvironment.class, Level.SEVERE, e.getMessage(), e);
+ }
+ return inputBuffer.subString(currentOutput);
+ }
+
+ public InputStream getInputStream() {
+ return in;
+ }
+
+ public TelnetClient getTelnet() {
+ return telnet;
+ }
+
+ public void clearBuffer() {
+ inputBuffer.clear();
+ }
+
+ @Override
+ public void receivedNegotiation(int negotiationCode, int option) {
+ final String negotiationCodeStr;
+ switch (negotiationCode) {
+ case TelnetNotificationHandler.RECEIVED_DO:
+ negotiationCodeStr = "DO";
+ break;
+ case TelnetNotificationHandler.RECEIVED_DONT:
+ negotiationCodeStr = "DONT";
+ break;
+ case TelnetNotificationHandler.RECEIVED_WILL:
+ negotiationCodeStr = "WILL";
+ break;
+ case TelnetNotificationHandler.RECEIVED_WONT:
+ negotiationCodeStr = "WONT";
+ break;
+ default:
+ throw new Error("unhandled negotiation code of " + negotiationCode);
+ }
+ System.out.printf("Negotiation recieved: %s for option %s\n", negotiationCodeStr, TelnetOption.getOption(option));
+ }
+
+ public void printOptionStates() {
+ for (int i = 0; i < TelnetOption.MAX_OPTION_VALUE; i++) {
+ String str = TelnetOption.getOption(i);
+ if (!str.equals("UNASSIGNED")) {
+ boolean local = telnet.getLocalOptionState(i);
+ boolean remote = telnet.getRemoteOptionState(i);
+ if (local || remote) {
+ System.out.printf("%s (%02d): local %b, remote %b\n", TelnetOption.getOption(i), i, local, remote);
+ }
+ }
+ }
+ }
+
+ private byte[] getNewline() throws UnsupportedEncodingException {
+ return "\n".getBytes("US-ASCII");
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/test/tags/BaseTestTags.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/test/tags/BaseTestTags.java
new file mode 100644
index 000000000..00467c335
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/test/tags/BaseTestTags.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.test.tags;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract interface BaseTestTags {
+ public static final String TEST_SCRIPT = "TestScript";
+
+ public static final String NAME_FIELD = "Name";
+ public static final String NUMBER_FIELD = "Number";
+ public static final String LOCATION_FIELD = "Location";
+ public static final String SCRIPT_SOURCE_FIELD = "ScriptSource";
+ public static final String SCRIPT_LINE_FIELD = "ScriptLine";
+ public static final String FAILURE_TYPE = "FailureType";
+
+ public static final String DESCRIPTION_FIELD = "Description";
+ public static final String MESSAGE_FIELD = "Message";
+ public static final String DETAILS_FIELD = "Details";
+ public static final String ITEMS_FIELD = "Item";
+ public static final String TIME_FIELD = "Time";
+
+ public static final String PURPOSE_FIELD = "Purpose";
+ public static final String PRECONDITION_FIELD = "PreCondition";
+ public static final String POSTCONDITION_FIELD = "PostCondition";
+
+ public static final String CONFIG_ENTRY = "Config";
+ public static final String SCRIPT_NAME = "ScriptName";
+ public static final String SCRIPT_VERSION = "ScriptVersion";
+ public static final String EXECUTED_BY = "ExecutedBy";
+ public static final String EXECUTION_DATE = "ExecutionDate";
+ public static final String ENVIRONMENT_FIELD = "Environment";
+ public static final String CLEAR_TOOL_VIEW = "ClearToolView";
+
+ public static final String NATIVE_ENVIRONMENT = "NativeEnvironment";
+ public static final String ENVIRONMENT_VARIABLE = "EnvironmentVariable";
+ public static final String OSEE_ENVIRONMENT_PREFIX = "OSEEKEY_";
+ public static final String PATH_FIELD = "Path";
+
+ public static final String SCRIPT_TIME_FIELD = "ScriptResult";
+ public static final String ELAPSED_TIME_FIELD = "ElapsedTime";
+
+ public static final String EXECUTION_STATUS = "ExecutionStatus";
+ public static final String EXECUTION_RESULT = "ExecutionResult";
+ public static final String EXECUTION_SUCCESS = "SUCCESS";
+ public static final String EXECUTION_ABORTED = "ABORTED";
+ public static final String EXECUTION_DETAILS = "ExecutionDetails";
+ public static final String TARGET_ENVIRONMENT = "TargetEnvironment";
+
+ public static final String SECTION_BREAK = "----------------------------------------------------------------";
+
+ public static final String BEMS_FIELD = "BEMS";
+ public static final String EMAIL_FIELD = "Email";
+
+ public static final String REPOSITORY_TYPE = "repositoryType";
+
+ public static final String MODIFIED_FIELD = "modifiedFlag";
+ public static final String REVISION_FIELD = "revision";
+ public static final String LAST_AUTHOR_FIELD = "lastAuthor";
+ public static final String LAST_MODIFIED = "lastModified";
+ public static final String URL = "url";
+
+ public static final String UNDEFINED_ENVIRONMENT = "Undefined";
+
+ public static final String Traceability = "Traceability";
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/test/tags/FunctionalTestTags.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/test/tags/FunctionalTestTags.java
new file mode 100644
index 000000000..f5c8e9114
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/test/tags/FunctionalTestTags.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.test.tags;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public abstract interface FunctionalTestTags extends BaseTestTags {
+ public static final String FUNCTIONAL_TEST_SCRIPT = "FunctionalTestScript";
+ public static final String FUNCTIONAL_TEST_CASE = "FunctionalTestCase";
+ public static final String FUNCTIONAL_TEST_POINT = "FunctionalTestPoint";
+ public static final String FUNCTIONAL_UNIT_EXECUTION = "FunctionalUnitExecution";
+ public static final String FUNCTIONAL_UNIT_HEADER = "FunctionalUnitHeader";
+
+ public static final String EXECUTABLE_FIELD = "Executable";
+ public static final String OPTIONS_FIELD = "Options";
+ public static final String GUID_FIELD = "Guid";
+
+ public static final String FUNCTIONAL_TEST_POINT_RESULT = "Result";
+ public static final String RESULT_PASSED = "PASSED";
+ public static final String RESULT_FAILED = "FAILED";
+ public static final String RESULT_NOT_RUN = "NOT RUN";
+ public static final String RESULT_MANUAL = "MANUAL";
+
+ public static final String MESSAGE_CHECK = "MessageCheck";
+ public static final String VALUE_FIELD = "Value";
+ public static final String ACTION_CMD = "ActionCmd";
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/testPoint/CheckGroup.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/testPoint/CheckGroup.java
new file mode 100644
index 000000000..dee71128e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/testPoint/CheckGroup.java
@@ -0,0 +1,156 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.testPoint;
+
+import java.util.ArrayList;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.jdk.core.util.xml.XMLStreamWriterUtil;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestGroup;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestPoint;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Robert A. Fisher
+ * @author Charles Shaw
+ */
+public class CheckGroup implements ITestGroup {
+ private final String groupName;
+ private final ArrayList<ITestPoint> testPoints;
+ private final Operation operation;
+
+ /**
+ * CheckGroup objects are used to setup complex TestPoint structures where the pass/fail behavior can be an <b>And
+ * </b>'ing or an <b>Or </b>'ing of the <b>getPass() </b> values of all the immediate children.
+ * <p>
+ * More complex TestPoint syntax can be obtained using the CheckGroup as a parent of other CheckGroup objects, of
+ * which the <b>And </b> or <b>Or </b> setting can be set differently.
+ *
+ * @param operation The logical operation used for combining items within this CheckGroup.
+ */
+ public CheckGroup(Operation operation, String groupName) {
+ super();
+ testPoints = new ArrayList<>();
+ // this.allTrue = allTrue;
+ this.operation = operation;
+ this.groupName = groupName;
+ }
+
+ public CheckGroup add(ITestPoint testPoint) {
+ this.testPoints.add(testPoint);
+
+ return this;
+ }
+
+ @JsonProperty
+ @Override
+ public ArrayList<ITestPoint> getTestPoints() {
+ return testPoints;
+ }
+
+ @JsonProperty
+ public Operation getOperation() {
+ return operation;
+ }
+
+ @JsonProperty
+ public String getGroupName() {
+ return groupName;
+ }
+
+ /**
+ * @return The number of test points added to this check group so far
+ */
+ @Override
+ public int size() {
+ return this.testPoints.size();
+ }
+
+ @Override
+ public boolean isPass() {
+ boolean passFail;
+
+ // Ensure that some points have been added
+ if (testPoints.size() > 0) {
+ // If this group is using AND logic then assume pass until find a
+ // fail
+ // if (allTrue) {
+ if (operation == Operation.AND) {
+ passFail = true;
+ // Else the group is using OR logic, so assume fail until find a
+ // pass
+ } else {
+ passFail = false;
+ }
+
+ for (ITestPoint testPoint : testPoints) {
+ if (operation == Operation.AND) {
+ passFail &= testPoint.isPass();
+ } else {
+ passFail |= testPoint.isPass();
+ }
+ }
+ } else {
+ passFail = false;
+ }
+ return passFail;
+ }
+
+ @Override
+ public Element toXml(Document doc) {
+ return buildXml(doc, "CheckGroup");
+ }
+
+ @Override
+ public void toXml(XMLStreamWriter writer) throws XMLStreamException {
+ buildXml(writer, "CheckGroup");
+ writer.writeEndElement();
+ }
+
+ protected Element buildXml(Document doc, String name) {
+ Element checkGroupElement = doc.createElement(name);
+
+ checkGroupElement.setAttribute("Mode", operation.toString());
+ checkGroupElement.appendChild(Jaxp.createElement(doc, "GroupName", groupName));
+
+ if (this.isPass()) {
+ checkGroupElement.appendChild(Jaxp.createElement(doc, "Result", "PASSED"));
+ } else {
+ checkGroupElement.appendChild(Jaxp.createElement(doc, "Result", "FAILED"));
+ }
+
+ for (ITestPoint testPoint : testPoints) {
+ checkGroupElement.appendChild(testPoint.toXml(doc));
+ }
+
+ return checkGroupElement;
+ }
+
+ protected void buildXml(XMLStreamWriter writer, String name) throws XMLStreamException {
+ writer.writeStartElement(name);
+ writer.writeAttribute("Mode", operation.toString());
+ XMLStreamWriterUtil.writeElement(writer, "GroupName", groupName);
+ if (this.isPass()) {
+ XMLStreamWriterUtil.writeElement(writer, "Result", "PASSED");
+ } else {
+ XMLStreamWriterUtil.writeElement(writer, "Result", "FAILED");
+ }
+
+ for (ITestPoint testPoint : testPoints) {
+ testPoint.toXml(writer);
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/testPoint/CheckPoint.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/testPoint/CheckPoint.java
new file mode 100644
index 000000000..4ca63cbea
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/testPoint/CheckPoint.java
@@ -0,0 +1,156 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.testPoint;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.jdk.core.util.xml.XMLStreamWriterUtil;
+import org.eclipse.osee.ote.core.XmlSupport;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestPoint;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class CheckPoint implements ITestPoint {
+ private final String testPointName;
+ private String expected;
+ private final String actual;
+ private final boolean pass;
+ private final long elpasedTime;
+ private final int numTransmissions;
+
+ /**
+ * CheckPoint objects are used for describing the result of a check and can
+ * be logged directly to a the logger as a testPoint or can be added to a
+ * CheckGroup if it is just a part of a larger series of checks being
+ * performed that all constitute one overall check.
+ *
+ * @param testPointName
+ * The item being tested. (i.e. TSD Button).
+ * @param expected
+ * The expected condition for a pass point.
+ * @param actual
+ * The actual condition during the check.
+ * @param pass
+ * The result of the check.
+ * @param elapsedTime
+ * The amount of time elapsed in milliseconds
+ */
+ public CheckPoint(String testPointName, String expected, String actual, boolean pass, long elapsedTime) {
+ this(testPointName, expected, actual, pass, 0, elapsedTime);
+ }
+
+ public CheckPoint(String testPointName, String expected, String actual, boolean pass, int numTransmissions, long elapsedTime) {
+ this.testPointName = testPointName;
+ this.expected = expected.equals("") ? " " : XmlSupport.convertNonPrintableCharacers(expected);
+ this.actual = actual.equals("") ? " " : XmlSupport.convertNonPrintableCharacers(actual);
+ this.pass = pass;
+ this.elpasedTime = elapsedTime;
+ this.numTransmissions = numTransmissions;
+ }
+
+ public CheckPoint(String testPointName, Object expected, Object actual, boolean pass, long elapsedTime) {
+ this(testPointName, expected.toString(), actual.toString(), pass, elapsedTime);
+ }
+
+ public CheckPoint(String testPointName, Object expected, Object actual, boolean pass) {
+ this(testPointName, expected.toString(), actual.toString(), pass, 0);
+ }
+
+ public CheckPoint(String testPointName, String expected, String actual, boolean pass) {
+ this(testPointName, expected, actual, pass, 0);
+ }
+
+ public CheckPoint(String testPointName, boolean expected, boolean actual) {
+ this(testPointName, expected, actual, expected == actual, 0);
+ }
+
+ /**
+ * @return Returns the actual.
+ */
+ @JsonProperty
+ public String getActual() {
+ return actual;
+ }
+
+ /**
+ * @return Returns the expected.
+ */
+ @JsonProperty
+ public String getExpected() {
+ return expected;
+ }
+
+ /**
+ * @return Returns the pass.
+ */
+ @Override
+ public boolean isPass() {
+ return pass;
+ }
+
+ public void setExpected(String expected) {
+ this.expected = XmlSupport.convertNonPrintableCharacers(expected);
+ }
+
+ @Override
+ public Element toXml(Document doc) {
+ Element checkPointElement = doc.createElement("CheckPoint");
+
+ checkPointElement.appendChild(Jaxp.createElement(doc, "TestPointName", testPointName));
+ checkPointElement.appendChild(Jaxp.createElement(doc, "Expected", expected));
+ checkPointElement.appendChild(Jaxp.createElement(doc, "Actual", actual));
+ checkPointElement.appendChild(Jaxp.createElement(doc, "Result", pass ? "PASSED" : "FAILED"));
+ checkPointElement.appendChild(Jaxp.createElement(doc, "ElapsedTime", Long.toString(this.elpasedTime)));
+ checkPointElement.appendChild(Jaxp.createElement(doc, "NumberOfTransmissions", Integer.toString(this.numTransmissions)));
+
+ return checkPointElement;
+ }
+
+ @Override
+ public void toXml(XMLStreamWriter writer) throws XMLStreamException {
+ writer.writeStartElement("CheckPoint");
+ XMLStreamWriterUtil.writeElement(writer, "TestPointName", testPointName);
+ XMLStreamWriterUtil.writeElement(writer, "Expected", expected);
+ XMLStreamWriterUtil.writeElement(writer, "Actual", actual);
+ XMLStreamWriterUtil.writeElement(writer, "Result", pass ? "PASSED" : "FAILED");
+ XMLStreamWriterUtil.writeElement(writer, "ElapsedTime", Long.toString(this.elpasedTime));
+ XMLStreamWriterUtil.writeElement(writer, "NumberOfTransmissions", Integer.toString(this.numTransmissions));
+ writer.writeEndElement();
+ }
+
+ @JsonProperty
+ public String getTestPointName() {
+ return testPointName;
+ }
+
+ /**
+ * @return the elpasedTime
+ */
+ @JsonProperty
+ public long getElpasedTime() {
+ return elpasedTime;
+ }
+
+ /**
+ * @return the numTransmissions
+ */
+ @JsonProperty
+ public int getNumTransmissions() {
+ return numTransmissions;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/testPoint/Operation.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/testPoint/Operation.java
new file mode 100644
index 000000000..50e21fff9
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/testPoint/Operation.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.testPoint;
+
+import javax.print.attribute.EnumSyntax;
+import org.codehaus.jackson.annotate.JsonCreator;
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.eclipse.osee.framework.jdk.core.util.EnumBase;
+
+public class Operation extends EnumBase {
+
+ private static final long serialVersionUID = -3132727420541603024L;
+ public static final Operation OR = new Operation(0);
+ public static final Operation AND = new Operation(1);
+
+ private static final String[] stringTable = new String[] {"OR", "AND"};
+ private static final Operation[] enumValueTable = new Operation[] {OR, AND};
+
+ private Operation(int value) {
+ super(value);
+ }
+
+ @JsonCreator
+ public static Operation toEnum(String str) {
+ return (Operation) getEnum(str, stringTable, enumValueTable);
+ }
+
+ protected static Operation toEnum(int value) {
+ return (Operation) getEnum(value, enumValueTable);
+ }
+
+ @Override
+ protected String[] getStringTable() {
+ return stringTable;
+ }
+
+ @Override
+ protected EnumSyntax[] getEnumValueTable() {
+ return enumValueTable;
+ }
+
+ @Override
+ @JsonProperty
+ public String getName() {
+ return super.getName();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/testPoint/RetryGroup.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/testPoint/RetryGroup.java
new file mode 100644
index 000000000..afba89e8a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/core/testPoint/RetryGroup.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.core.testPoint;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.eclipse.osee.framework.jdk.core.persistence.XmlizableStream;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class RetryGroup extends CheckGroup {
+ ArrayList<Xmlizable> childElements;
+ @JsonProperty("ChildRecords")
+ ArrayList<XmlizableStream> childStreamElements;
+
+ public RetryGroup(String groupName) {
+ super(Operation.OR, groupName);
+ childElements = new ArrayList<>();
+ childStreamElements = new ArrayList<>();
+ }
+
+ @Override
+ public Element toXml(Document doc) {
+ Element retVal = buildXml(doc, "RetryGroup");
+
+ for (Xmlizable object : childElements) {
+ retVal.appendChild(object.toXml(doc));
+ }
+ return retVal;
+ }
+
+ @Override
+ public void toXml(XMLStreamWriter writer) throws XMLStreamException {
+ buildXml(writer, "RetryGroup");
+ for (XmlizableStream object : childStreamElements) {
+ object.toXml(writer);
+ }
+ writer.writeEndElement();
+ }
+
+ public void addChildElement(XmlizableStream child) {
+ childStreamElements.add(child);
+ }
+
+ public void addChildren(List<XmlizableStream> children) {
+ childStreamElements.addAll(children);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/AddressBuffer.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/AddressBuffer.java
new file mode 100644
index 000000000..7e1ec2f33
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/AddressBuffer.java
@@ -0,0 +1,31 @@
+package org.eclipse.osee.ote.endpoint;
+
+import java.net.InetSocketAddress;
+import java.nio.ByteBuffer;
+
+public class AddressBuffer {
+
+ private ByteBuffer buffer;
+ private InetSocketAddress address;
+
+ public AddressBuffer(){
+ buffer = ByteBuffer.allocate(131072);
+ }
+
+ public ByteBuffer getBuffer(){
+ return buffer;
+ }
+
+ public void setBytes(byte[] bytes) {
+ buffer = ByteBuffer.wrap(bytes);
+ }
+
+ public InetSocketAddress getAddress(){
+ return address;
+ }
+
+ public void setAddress(InetSocketAddress address){
+ this.address = address;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/EndpointDataProcessor.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/EndpointDataProcessor.java
new file mode 100644
index 000000000..a0b8ed3b5
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/EndpointDataProcessor.java
@@ -0,0 +1,11 @@
+package org.eclipse.osee.ote.endpoint;
+
+import java.nio.ByteBuffer;
+
+public interface EndpointDataProcessor {
+
+ int getTypeId();
+
+ void processBuffer(ByteBuffer buffer);
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteEndpointReceiveRunnable.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteEndpointReceiveRunnable.java
new file mode 100644
index 000000000..ed2e6be4c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteEndpointReceiveRunnable.java
@@ -0,0 +1,174 @@
+package org.eclipse.osee.ote.endpoint;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InterruptedIOException;
+import java.net.BindException;
+import java.net.InetSocketAddress;
+import java.net.UnknownHostException;
+import java.nio.ByteBuffer;
+import java.nio.channels.ClosedByInterruptException;
+import java.nio.channels.DatagramChannel;
+import java.util.Date;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.logging.Level;
+import java.util.zip.DataFormatException;
+import java.util.zip.Inflater;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.OTEException;
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+import org.eclipse.osee.ote.message.event.OteEventMessageHeader;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+
+public class OteEndpointReceiveRunnable implements Runnable {
+
+ private static final int DATA_SIZE = 65536;
+ private static final int UDP_TIMEOUT = 240000; // 4 MINUTES
+ private static final int ONE_MEG = 1024 * 1024;
+
+ private volatile boolean run = true;
+ private volatile boolean debugOutput = false;
+ private Class<OteEndpointReceiveRunnable> logger = OteEndpointReceiveRunnable.class;
+ private final InetSocketAddress address;
+ private static final int MAGIC_NUMBER = ByteBuffer.wrap(OteEndpointSendRunnable.MAGIC_NUMBER).getInt();
+ private final Inflater inflater = new Inflater();
+
+ private CopyOnWriteArrayList<EndpointDataProcessor> dataProcessors = new CopyOnWriteArrayList<>();
+
+ public OteEndpointReceiveRunnable(InetSocketAddress address){
+ this.address = address;
+ }
+
+ public void stop(){
+ run = false;
+ }
+
+ @Override
+ public void run() {
+ ByteBuffer buffer = ByteBuffer.allocate(DATA_SIZE);
+ DatagramChannel channel = null;
+ try{
+ while(run){
+ try {
+ channel = DatagramChannel.open();
+ channel.socket().setReuseAddress(true);
+ channel.socket().bind(address);
+ channel.socket().setSoTimeout(UDP_TIMEOUT);
+ channel.socket().setReceiveBufferSize(ONE_MEG);
+ channel.configureBlocking(true);
+
+ while (run) {
+ try{
+ buffer.clear();
+ channel.receive(buffer);
+ buffer.flip();
+ processBuffer(buffer);
+ } catch(ClosedByInterruptException ex){
+ stop();
+ } catch (Throwable th){
+ th.printStackTrace();
+ }
+ }
+ } catch (BindException ex) {
+ if(debugOutput){
+ OseeLog.log(logger, Level.FINEST, ex);
+ }
+ channel.close();
+ Thread.sleep(1000);
+ }
+ }
+ }catch (InterruptedIOException ex) {
+ Thread.interrupted();
+ if (run && debugOutput) {
+ OseeLog.log(logger, Level.WARNING, "Unexpected interruption", ex);
+ }
+ } catch (ClosedByInterruptException ie) {
+ Thread.interrupted();
+ if (run && debugOutput) {
+ OseeLog.log(logger, Level.WARNING, "Unexpected interruption", ie);
+ }
+ } catch (Throwable t) {
+ throw new OTEException(t);
+ } finally {
+ try {
+ if (channel != null) {
+ channel.close();
+ }
+ } catch (IOException ex) {
+ if(debugOutput){
+ ex.printStackTrace();
+ }
+ }
+ }
+ }
+
+ private void processBuffer(ByteBuffer buffer) {
+ int magicNumber = 0;
+ if(buffer.remaining() > 4) {
+ magicNumber = buffer.getInt(0);
+ }
+ // compressed stream
+ if(magicNumber == MAGIC_NUMBER) {
+ inflater.reset();
+ inflater.setInput(buffer.array(), 4, buffer.remaining() - 4);
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream(buffer.remaining() - 4);
+ byte[] tempBuf = new byte[1024];
+ try {
+ while (!inflater.finished()) {
+ int count = inflater.inflate(tempBuf);
+ outputStream.write(tempBuf, 0, count);
+ }
+ outputStream.close();
+ buffer = ByteBuffer.wrap(outputStream.toByteArray());
+ }
+ catch (DataFormatException e) {
+ OseeLog.log(getClass(), Level.SEVERE, e);
+ }
+ catch (IOException e) {
+ OseeLog.log(getClass(), Level.SEVERE, e);
+ }
+ }
+ int typeId = buffer.getShort(0) & 0xFFFF;
+ if(typeId == OteEventMessageHeader.MARKER_VALUE){
+ byte[] data = new byte[buffer.remaining()];
+ buffer.get(data);
+ OteEventMessage msg = new OteEventMessage((byte[])data);
+ msg.getHeader().TTL.setNoLog(1);
+ if(debugOutput){
+ try {
+ System.out.printf("[%s] received: [%s][%d] from [%s:%d]\n", new Date(), msg.getHeader().TOPIC.getValue(), msg.getData().length, msg.getHeader().ADDRESS.getAddress().getHostAddress(), msg.getHeader().ADDRESS.getPort());
+ } catch (UnknownHostException e) {
+ e.printStackTrace();
+ }
+ }
+ OteEventMessageUtil.postEvent(msg);
+ } else {
+ for(EndpointDataProcessor processor: dataProcessors){
+ if(processor.getTypeId() == typeId){
+ try{
+ processor.processBuffer(buffer);
+ } catch (Throwable th){
+ th.printStackTrace();
+ }
+ }
+ }
+ }
+ }
+
+ public void setDebugOutput(boolean enable) {
+ debugOutput = enable;
+ }
+
+ public InetSocketAddress getAddress() {
+ return address;
+ }
+
+ public void addDataProcessor(EndpointDataProcessor processor) {
+ dataProcessors.add(processor);
+ }
+
+ public void removeDataProcessor(EndpointDataProcessor processor) {
+ dataProcessors.remove(processor);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteEndpointSendRunnable.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteEndpointSendRunnable.java
new file mode 100644
index 000000000..ea9a7dcd0
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteEndpointSendRunnable.java
@@ -0,0 +1,147 @@
+package org.eclipse.osee.ote.endpoint;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.nio.channels.AsynchronousCloseException;
+import java.nio.channels.ClosedByInterruptException;
+import java.nio.channels.ClosedChannelException;
+import java.nio.channels.DatagramChannel;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.TimeUnit;
+import java.util.logging.Level;
+import java.util.zip.Deflater;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.collections.ObjectPool;
+
+final class OteEndpointSendRunnable implements Runnable {
+
+ private static final int SEND_BUFFER_SIZE = 1024 * 512;
+ /**
+ * This is the header for a ZIP file
+ */
+ public static final byte[] MAGIC_NUMBER = {0x04, 0x03, 0x4b, 0x50};
+ private static final int MAX_DGRAM_SIZE = 65500;
+
+ private final ArrayBlockingQueue<AddressBuffer> toSend;
+ private final ObjectPool<AddressBuffer> buffers;
+ private final Deflater compressor = new Deflater();
+
+ private boolean debug = false;
+
+ OteEndpointSendRunnable(ArrayBlockingQueue<AddressBuffer> toSend, ObjectPool<AddressBuffer> buffers, boolean debug) {
+ this.toSend = toSend;
+ this.buffers = buffers;
+ this.debug = debug;
+ compressor.setLevel(Deflater.BEST_SPEED);
+ }
+
+ @Override
+ public void run() {
+ DatagramChannel threadChannel = null;
+ try {
+ threadChannel = openAndInitializeDatagramChannel();
+ boolean keepRunning = true;
+ final List<AddressBuffer> dataToSend = new ArrayList<>(32);
+ System.setSecurityManager(null);
+ while(keepRunning){
+ try{
+ dataToSend.clear();
+ if (toSend.drainTo(dataToSend) < 1) {
+ try {
+ // block until something is available
+ AddressBuffer addrBuf = toSend.poll(15, TimeUnit.SECONDS);
+ if (addrBuf == null) {
+ // no activity for a while so lets clean ourselves up. Our master will restart
+ // a new thread if another event comes along after we self terminate
+ keepRunning = false;
+ } else {
+ dataToSend.add(addrBuf);
+ }
+ } catch (InterruptedException e) {
+ keepRunning = false;
+ continue;
+ }
+ }
+ int size = dataToSend.size();
+ for (int i = 0; i < size; i++) {
+ AddressBuffer data = dataToSend.get(i);
+ if (data == OteUdpEndpointSender.POISON_PILL) {
+ keepRunning = false;
+ break;
+ }
+
+ int bufSize = data.getBuffer().remaining();
+ if(bufSize > MAX_DGRAM_SIZE) {
+ compressor.reset();
+ compressor.setInput(data.getBuffer().array(), 0, bufSize);
+ compressor.finish();
+
+ ByteArrayOutputStream bos = new ByteArrayOutputStream(bufSize);
+
+ byte[] buf = new byte[1024];
+ while (!compressor.finished()) {
+ int count = compressor.deflate(buf);
+ bos.write(buf, 0, count);
+ }
+ try {
+ bos.close();
+ byte[] dataBytes = new byte[bos.size() + 4];
+ System.arraycopy(MAGIC_NUMBER, 0, dataBytes, 0, 4);
+ System.arraycopy(bos.toByteArray(), 0, dataBytes, 4, bos.size());
+ data.setBytes(dataBytes);
+ }
+ catch (IOException e) {
+ OseeLog.log(getClass(), Level.SEVERE, "Error trying to compress data", e);
+ continue;
+ }
+ }
+
+ threadChannel.send(data.getBuffer(), data.getAddress());
+ }
+ } catch (ClosedByInterruptException ex){
+ if(debug){
+ OseeLog.log(getClass(), Level.SEVERE, "Error trying to send data", ex);
+ }
+ threadChannel = openAndInitializeDatagramChannel();
+ } catch (AsynchronousCloseException ex){
+ if(debug){
+ OseeLog.log(getClass(), Level.SEVERE, "Error trying to send data", ex);
+ }
+ Lib.close(threadChannel);
+ threadChannel = openAndInitializeDatagramChannel();
+ } catch (ClosedChannelException ex){
+ if(debug){
+ OseeLog.log(getClass(), Level.SEVERE, "Error trying to send data", ex);
+ }
+ Lib.close(threadChannel);
+ threadChannel = openAndInitializeDatagramChannel();
+ } catch (IOException ex){
+ OseeLog.log(getClass(), Level.SEVERE, "Error trying to send data", ex);
+ } finally {
+ int size = dataToSend.size();
+ for (int i = 0; i < size; i++) {
+ buffers.returnObj(dataToSend.get(i));
+ }
+ }
+ }
+ } catch (IOException ex){
+ OseeLog.log(getClass(), Level.SEVERE, "Error opening DatagramChannel. Ending OteEndpointSendRunnable unexpectedly.", ex);
+ } finally{
+ Lib.close(threadChannel);
+ }
+
+ }
+
+ private DatagramChannel openAndInitializeDatagramChannel() throws IOException {
+ DatagramChannel channel = DatagramChannel.open();
+ if (channel.socket().getSendBufferSize() < SEND_BUFFER_SIZE) {
+ channel.socket().setSendBufferSize(SEND_BUFFER_SIZE);
+ }
+ channel.socket().setReuseAddress(true);
+ channel.configureBlocking(true);
+ return channel;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteEndpointSender.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteEndpointSender.java
new file mode 100644
index 000000000..4a1a9e76e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteEndpointSender.java
@@ -0,0 +1,21 @@
+package org.eclipse.osee.ote.endpoint;
+
+import java.net.InetSocketAddress;
+
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+
+public interface OteEndpointSender {
+
+ void send(OteEventMessage sendMessage);
+
+ InetSocketAddress getAddress();
+
+ void stop() throws InterruptedException;
+
+ boolean isClosed();
+
+ void setDebug(boolean debug);
+
+ void start();
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteEndpointUtil.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteEndpointUtil.java
new file mode 100644
index 000000000..761a40548
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteEndpointUtil.java
@@ -0,0 +1,54 @@
+package org.eclipse.osee.ote.endpoint;
+
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.UnknownHostException;
+
+import org.eclipse.osee.ote.OTEException;
+
+public class OteEndpointUtil {
+
+ /**
+ * Get the socket address for the OTEUdpEndpoint from an encoded URI. You should catch OTEException and
+ * handle the case when the sting is not as expected.
+ *
+ * @param uriAddress
+ * @return
+ */
+ public static InetSocketAddress getAddress(final String uriAddress) throws OTEException {
+ String[] addPort = null;
+ if(uriAddress.startsWith("tcp://")){
+ String add = uriAddress.replaceFirst("tcp://", "");
+ addPort = add.split(":");
+ } else {
+ addPort = uriAddress.split(":");
+ }
+ if(addPort != null && addPort.length == 2){
+ try {
+ InetAddress byName = InetAddress.getByName(addPort[0]);
+ int port = Integer.parseInt(addPort[1]);
+ return new InetSocketAddress(byName, port);
+ } catch (UnknownHostException ex){
+ throw new OTEException(String.format("Invalid address[%s]", uriAddress), ex);
+ } catch (NumberFormatException ex){
+ throw new OTEException(String.format("Invalid address format[%s], can't determine port", uriAddress), ex);
+ }
+ } else {
+ throw new OTEException(String.format("Invalid address format[%s]", uriAddress));
+ }
+ }
+
+ public static InetSocketAddress getAddress(final String address, final int port) {
+ try {
+ InetAddress byName = InetAddress.getByName(address);
+ return new InetSocketAddress(byName, port);
+ } catch (UnknownHostException ex){
+ throw new OTEException(String.format("Invalid address[%s]", address), ex);
+ }
+ }
+
+ public static String getAddressURI(final InetSocketAddress address){
+ return String.format("tcp://%s:%d", address.getAddress().getHostAddress(), address.getPort());
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteUdpEndpoint.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteUdpEndpoint.java
new file mode 100644
index 000000000..e39113443
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteUdpEndpoint.java
@@ -0,0 +1,30 @@
+package org.eclipse.osee.ote.endpoint;
+
+import java.net.InetSocketAddress;
+import org.eclipse.osee.ote.core.CopyOnWriteNoIteratorList;
+
+public interface OteUdpEndpoint {
+
+ public void setDebugOutput(boolean enable);
+
+ public InetSocketAddress getLocalEndpoint();
+
+ public OteUdpEndpointSender getOteEndpointSender(InetSocketAddress address);
+
+ OteUdpEndpointInlineSender getOteEndpointInlineSender(InetSocketAddress address);
+
+ public void addBroadcast(OteUdpEndpointSender sender);
+
+ public void removeBroadcast(OteUdpEndpointSender sender);
+
+// public void clearBroadcast();
+
+ public CopyOnWriteNoIteratorList<OteUdpEndpointSender> getBroadcastSenders();
+
+ public void addDataProcessor(EndpointDataProcessor processor);
+
+ public void removeDataProcessor(EndpointDataProcessor processor);
+
+ OteUdpEndpointSender getOteEndpointThreadedSender(InetSocketAddress address);
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteUdpEndpointInlineSender.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteUdpEndpointInlineSender.java
new file mode 100644
index 000000000..aace55267
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteUdpEndpointInlineSender.java
@@ -0,0 +1,70 @@
+package org.eclipse.osee.ote.endpoint;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.nio.ByteBuffer;
+import java.nio.channels.DatagramChannel;
+import org.eclipse.osee.ote.OTEException;
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+
+/**
+ * Launches a Thread that monitors a queue for data to send to specified UDP endpoints.
+ *
+ * @author b1528444
+ */
+public class OteUdpEndpointInlineSender implements OteEndpointSender {
+ private static final int SEND_BUFFER_SIZE = 1024 * 512;
+
+ private final InetSocketAddress address;
+
+ public OteUdpEndpointInlineSender(InetSocketAddress address) {
+ this.address = address;
+ }
+
+ @Override
+ public InetSocketAddress getAddress() {
+ return address;
+ }
+
+ @Override
+ public void send(OteEventMessage message) {
+
+ try {
+ DatagramChannel channel = DatagramChannel.open();
+ if (channel.socket().getSendBufferSize() < SEND_BUFFER_SIZE) {
+ channel.socket().setSendBufferSize(SEND_BUFFER_SIZE);
+ }
+ channel.socket().setReuseAddress(true);
+ channel.configureBlocking(true);
+
+ ByteBuffer buffer = ByteBuffer.allocate(SEND_BUFFER_SIZE);
+
+ buffer.put(message.getData());
+ buffer.flip();
+ channel.send(buffer, address);
+ } catch (IOException e) {
+ throw new OTEException(e);
+ }
+ }
+
+ @Override
+ public void stop() {
+ //not needed
+ }
+
+ @Override
+ public boolean isClosed() {
+ return false;
+ }
+
+ @Override
+ public void setDebug(boolean debug) {
+ //not needed
+ }
+
+ @Override
+ public void start() {
+ //not needed
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteUdpEndpointReceiverImpl.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteUdpEndpointReceiverImpl.java
new file mode 100644
index 000000000..697485762
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteUdpEndpointReceiverImpl.java
@@ -0,0 +1,42 @@
+package org.eclipse.osee.ote.endpoint;
+
+import java.net.InetSocketAddress;
+
+public class OteUdpEndpointReceiverImpl {
+
+ private OteEndpointReceiveRunnable oteEndpointReceiveRunnable;
+ private Thread th;
+
+ public OteUdpEndpointReceiverImpl(InetSocketAddress address){
+ oteEndpointReceiveRunnable = new OteEndpointReceiveRunnable(address);
+ }
+
+ public void start(){
+ th = new Thread(oteEndpointReceiveRunnable);
+ th.setName("OTE UDP Endpoint Receiver");
+ th.setDaemon(true);
+ th.start();
+ }
+
+ public void stop(){
+ oteEndpointReceiveRunnable.stop();
+ th.interrupt();
+ }
+
+ public void setDebugOutput(boolean enable){
+ oteEndpointReceiveRunnable.setDebugOutput(enable);
+ }
+
+ public InetSocketAddress getEndpoint(){
+ return oteEndpointReceiveRunnable.getAddress();
+ }
+
+ public void addDataProcessor(EndpointDataProcessor processor) {
+ oteEndpointReceiveRunnable.addDataProcessor(processor);
+ }
+
+ public void removeDataProcessor(EndpointDataProcessor processor) {
+ oteEndpointReceiveRunnable.removeDataProcessor(processor);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteUdpEndpointSender.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteUdpEndpointSender.java
new file mode 100644
index 000000000..3ae2f4e78
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/endpoint/OteUdpEndpointSender.java
@@ -0,0 +1,95 @@
+package org.eclipse.osee.ote.endpoint;
+
+import java.net.InetSocketAddress;
+import java.util.Date;
+import java.util.concurrent.ArrayBlockingQueue;
+
+import org.eclipse.osee.ote.OTEException;
+import org.eclipse.osee.ote.collections.ObjectPool;
+import org.eclipse.osee.ote.collections.ObjectPoolConfiguration;
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+
+/**
+ * Launches a Thread that monitors a queue for data to send to specified UDP endpoints.
+ *
+ * @author b1528444
+ *
+ */
+public class OteUdpEndpointSender implements OteEndpointSender {
+
+ static final AddressBuffer POISON_PILL = new AddressBuffer();
+
+ private final ObjectPool<AddressBuffer> buffers;
+ private final ArrayBlockingQueue<AddressBuffer> toSend;
+
+ private final InetSocketAddress address;
+
+ private boolean debug = false;
+
+ private volatile boolean isClosed = false;
+
+ private volatile Thread thread;
+
+ public OteUdpEndpointSender(InetSocketAddress address){
+ toSend = new ArrayBlockingQueue<>(5000);
+ buffers = new ObjectPool<AddressBuffer>(new ObjectPoolConfiguration<AddressBuffer>(50,true) {
+ @Override
+ public AddressBuffer make() {
+ return new AddressBuffer();
+ }
+ });
+ this.address = address;
+ }
+
+ @Override
+ public void start(){
+ thread = new Thread(new OteEndpointSendRunnable(toSend, buffers, debug));
+ thread.setName(String.format("OTE Endpoint Sender[%s]", address.toString()));
+ thread.setDaemon(true);
+ thread.start();
+ }
+
+ @Override
+ public void stop() throws InterruptedException{
+ toSend.put(POISON_PILL);
+ isClosed = true;
+ }
+
+ @Override
+ public InetSocketAddress getAddress(){
+ return address;
+ }
+
+ @Override
+ public void send(OteEventMessage message) {
+ if(debug){
+ System.out.printf("[%s] sending: [%s] to [%s] [%d]\n", new Date(), message.getHeader().TOPIC.getValue(), address.toString(), message.getData().length);
+ }
+ AddressBuffer obj = buffers.getObject();
+ obj.getBuffer().clear();
+ obj.getBuffer().put(message.getData());
+ obj.getBuffer().flip();
+ obj.setAddress(address);
+ try {
+ toSend.put(obj);
+ } catch (InterruptedException e) {
+ throw new OTEException(e);
+ }
+
+ if (!thread.isAlive()) {
+ // our thread has sat idle for too long and self terminated go ahead and start a new one
+ start();
+ }
+ }
+
+ @Override
+ public boolean isClosed() {
+ return isClosed;
+ }
+
+ @Override
+ public void setDebug(boolean debug){
+ this.debug = debug;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/filetransfer/TcpFileTransfer.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/filetransfer/TcpFileTransfer.java
new file mode 100644
index 000000000..deb6a41bf
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/filetransfer/TcpFileTransfer.java
@@ -0,0 +1,282 @@
+package org.eclipse.osee.ote.filetransfer;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.SocketTimeoutException;
+import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
+import java.nio.channels.SelectionKey;
+import java.nio.channels.Selector;
+import java.nio.channels.ServerSocketChannel;
+import java.nio.channels.SocketChannel;
+import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+
+public class TcpFileTransfer {
+
+
+
+ private static final int SECRET_CODE = 0xF17E;
+ private static final int BLOCK_SIZE = 64*1024;
+
+ public static TcpFileTransferHandle sendFile(ExecutorService service, final File file, final InetSocketAddress address) throws IOException{
+ if (!file.exists()) {
+ throw new IllegalArgumentException("Invalid file specified: " + file.getAbsolutePath());
+ }
+ final TransferProgressMonitor monitor = new TransferProgressMonitor();
+ monitor.updateTransferStartTime(System.currentTimeMillis());
+ final SocketChannel sendChannel = SocketChannel.open(address);
+
+ final TcpFileTransfer fileTransfer = new TcpFileTransfer(Direction.FILE_TO_CHANNEL, file);
+ Callable<Boolean> c = new Callable<Boolean>() {
+
+ @Override
+ public Boolean call() throws Exception {
+ fileTransfer.openSender(monitor, sendChannel);
+ monitor.updateTransferCompleteTime(System.currentTimeMillis());
+ return true;
+ }
+ };
+ InetSocketAddress localAddress = (InetSocketAddress) sendChannel.socket().getLocalSocketAddress();
+ return new TcpFileTransferHandle(monitor, localAddress, service.submit(c));
+ }
+
+
+ /**
+ *
+ * @param service
+ * @param file
+ * @param port
+ * @return the transfer handle or null if the file to be written to is in use by another process
+ * @throws IOException
+ */
+ public static TcpFileTransferHandle receiveFile(ExecutorService service, final File file, int port) throws IOException{
+ if (service == null) {
+ throw new NullPointerException("Service cannot be null");
+ }
+
+ final TcpFileTransfer fileTransfer;
+ try {
+ fileTransfer = new TcpFileTransfer(Direction.CHANNEL_TO_FILE, file);
+ } catch (FileNotFoundException e) {
+ // most likely due to file being used by another process
+ return null;
+ }
+ final TransferProgressMonitor monitor = new TransferProgressMonitor();
+ monitor.updateTransferStartTime(System.currentTimeMillis());
+
+ final ServerSocketChannel channel = ServerSocketChannel.open();
+ channel.configureBlocking(false);
+ channel.socket().bind(new InetSocketAddress(InetAddress.getLocalHost(), port));
+ InetSocketAddress localAddress = (InetSocketAddress) channel.socket().getLocalSocketAddress();
+
+ Callable<Boolean> c = new Callable<Boolean>() {
+
+ @Override
+ public Boolean call() throws Exception {
+ fileTransfer.openReceiver(monitor, channel);
+ monitor.updateTransferCompleteTime(System.currentTimeMillis());
+
+ return true;
+
+ }
+ };
+ return new TcpFileTransferHandle(monitor, localAddress, service.submit(c));
+ }
+
+ private static enum Direction {
+ FILE_TO_CHANNEL {
+
+ @Override
+ long transfer(FileChannel fileChannel, SocketChannel byteChannel, long position, long count) throws IOException{
+ return fileChannel.transferTo(position, count, byteChannel);
+ }
+
+ @Override
+ FileChannel createChannel(File file) throws IOException{
+ return new FileInputStream(file).getChannel();
+ }
+
+ },
+ CHANNEL_TO_FILE {
+
+ @Override
+ long transfer(FileChannel fileChannel, SocketChannel byteChannel, long position, long count) throws IOException{
+ return fileChannel.transferFrom(byteChannel, position, count);
+ }
+
+ @Override
+ FileChannel createChannel(File file) throws IOException {
+ FileChannel channel = new FileOutputStream(file).getChannel();
+ channel.lock();
+ return channel;
+ }
+
+
+ };
+
+ abstract long transfer(FileChannel fileChannel, SocketChannel byteChannel, long position, long count) throws IOException;
+ abstract FileChannel createChannel(File file) throws IOException;
+ }
+
+ private final Direction direction;
+ private final File file;
+
+ private TcpFileTransfer(Direction direction, File file) throws FileNotFoundException, IOException{
+ this.direction = direction;
+ this.file = file;
+ }
+
+
+ private void openSender(TransferProgressMonitor monitor, SocketChannel sendChannel) throws IOException{
+ try {
+ Selector selector = Selector.open();
+ try {
+ sendChannel.configureBlocking(false);
+ sendChannel.register(selector, SelectionKey.OP_WRITE);
+ final File[] files;
+ if (file.isDirectory()) {
+ files = file.listFiles();
+ } else {
+ files = new File[]{file};
+ }
+ int fileCounter = 1;
+ ByteBuffer buffer = ByteBuffer.allocate(1024);
+ for (File targetFile : files) {
+ long size = targetFile.length();
+ monitor.updateTotalTransferAmount(size);
+ buffer.clear();
+ buffer.putInt(SECRET_CODE);
+ buffer.putInt(files.length);
+ buffer.putInt(fileCounter++);
+ String name = targetFile.getName();
+ buffer.putInt(name.length());
+ buffer.put(name.getBytes());
+ buffer.putLong(size);
+ buffer.flip();
+ sendChannel.write(buffer);
+ transfer(monitor, sendChannel, selector, size, targetFile);
+ buffer.clear();
+ sendChannel.keyFor(selector).interestOps(SelectionKey.OP_READ);
+ waitForData(selector, sendChannel, buffer);
+ sendChannel.keyFor(selector).interestOps(SelectionKey.OP_WRITE);
+ }
+ } finally {
+ selector.close();
+ }
+ } finally {
+ sendChannel.close();
+ }
+ }
+
+ private void openReceiver(TransferProgressMonitor monitor, ServerSocketChannel serverChannel) throws IOException{
+ try {
+ Selector selector = Selector.open();
+ try {
+ serverChannel.register(selector, SelectionKey.OP_ACCEPT);
+ // only way to timeout on accept with channels is to use a selector.
+ // ServerSocketChannel does not honor the socket.setSoTimeout() value
+ if (selector.select(10000) < 1) {
+ throw new SocketTimeoutException();
+ }
+ selector.selectedKeys().clear();
+ serverChannel.keyFor(selector).cancel();
+
+ SocketChannel receiveChannel = serverChannel.accept();
+ receiveChannel.configureBlocking(false);
+ receiveChannel.register(selector, SelectionKey.OP_READ);
+
+ // now we need to handle timeouts for the data channel
+ try {
+ boolean done = false;
+ ByteBuffer buffer = ByteBuffer.allocate(1024);
+ byte[] fileNameBytes = new byte[2048];
+ while (!done) {
+ buffer.clear();
+ // we only want to read the next 12 bytes, anything more than 12 is the file data
+ // and we want that left in the channel to be consumed later
+ buffer.limit(16);
+
+ waitForData(selector, receiveChannel, buffer);
+
+ buffer.flip();
+ int code = buffer.getInt();
+ if (code != SECRET_CODE) {
+ throw new IOException("Unexpected data during transfer negotiation");
+ }
+ int fileCount = buffer.getInt();
+ int currentFile = buffer.getInt();
+ monitor.updateNumberOfFiles(fileCount);
+ int fileNameLength = buffer.getInt();
+ buffer.clear();
+ buffer.limit(fileNameLength + 8);
+ waitForData(selector, receiveChannel, buffer);
+ buffer.flip();
+ buffer.get(fileNameBytes, 0, fileNameLength);
+ long fileSize = buffer.getLong();
+ monitor.updateTotalTransferAmount(fileSize);
+ File targetFile = file.isDirectory() ? new File(file, new String(fileNameBytes, 0, fileNameLength)) : file;
+ transfer(monitor, receiveChannel, selector, fileSize, targetFile);
+ buffer.clear();
+ buffer.putInt(0xF0F0);
+ buffer.flip();
+ receiveChannel.write(buffer);
+ done = currentFile == fileCount;
+
+ }
+ } finally {
+ receiveChannel.close();
+ }
+ } finally {
+ selector.close();
+ }
+ } finally {
+ serverChannel.close();
+ }
+ }
+
+ private static void waitForData(Selector selector, SocketChannel channel, ByteBuffer buffer) throws SocketTimeoutException, IOException{
+ if (selector.select(10000) < 1) {
+ throw new SocketTimeoutException();
+ }
+ selector.selectedKeys().clear();
+ channel.read(buffer);
+ }
+
+
+ private static void waitForChannel(Selector selector) throws SocketTimeoutException, IOException{
+ selector.select(10000);
+ Set<SelectionKey> set = selector.selectedKeys();
+ if (set.size() == 0) {
+ throw new SocketTimeoutException();
+ }
+ set.clear();
+ }
+
+ private void transfer(TransferProgressMonitor monitor, SocketChannel channel, Selector selector, long totalTransferAmount, File targetFile) throws IOException {
+ // we need a selector to deal with time outs
+ FileChannel fileChannel = direction.createChannel(targetFile);
+ try {
+ long position = 0;
+ while (position < totalTransferAmount) {
+ waitForChannel(selector);
+ long count = direction.transfer(fileChannel, channel, position, Math.min(BLOCK_SIZE, totalTransferAmount - position));
+ if (count < 0) {
+ channel.keyFor(selector).cancel();
+ continue;
+ }
+ position += count;
+ monitor.updateAmountTransferred(position);
+ }
+ } finally {
+ fileChannel.close();
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/filetransfer/TcpFileTransferHandle.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/filetransfer/TcpFileTransferHandle.java
new file mode 100644
index 000000000..3175631aa
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/filetransfer/TcpFileTransferHandle.java
@@ -0,0 +1,54 @@
+package org.eclipse.osee.ote.filetransfer;
+
+import java.net.InetSocketAddress;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+
+public class TcpFileTransferHandle {
+
+ private final Future<Boolean> future;
+ private final TransferProgressMonitor progressMonitor;
+
+ private final InetSocketAddress localAddress;
+
+ TcpFileTransferHandle(TransferProgressMonitor progressMonitor, InetSocketAddress localAddress,
+ Future<Boolean> future) {
+ super();
+ this.progressMonitor = progressMonitor;
+ this.future = future;
+ this.localAddress = localAddress;
+ }
+
+ public void cancelTransfer() {
+ future.cancel(true);
+ }
+
+ public TransferProgressMonitor getProgressMonitor() {
+ return progressMonitor;
+ }
+
+
+
+ /**
+ * blocks until transfer is complete.
+ * @return true if transfer was a success or false otherwise
+ * @throws ExecutionException
+ * @throws InterruptedException
+ */
+ public boolean awaitCompletion() throws ExecutionException, InterruptedException {
+ return future.get();
+ }
+
+ /**
+ * returns whether or not the transfer has completed. A transfer is considered complete
+ * once all bytes have been sent/received or if transfer was aborted due to an error
+ * @return
+ */
+ public boolean isComplete() {
+ return future.isDone();
+ }
+
+ public InetSocketAddress getLocalAddress() {
+ return localAddress;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/filetransfer/TransferProgressMonitor.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/filetransfer/TransferProgressMonitor.java
new file mode 100644
index 000000000..b72102c4f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/filetransfer/TransferProgressMonitor.java
@@ -0,0 +1,61 @@
+package org.eclipse.osee.ote.filetransfer;
+
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLong;
+
+public class TransferProgressMonitor {
+
+ private final AtomicInteger numberOfFiles = new AtomicInteger(-1);
+ private final AtomicLong total = new AtomicLong(-1L);
+ private final AtomicLong current = new AtomicLong(0L);
+ private final AtomicLong transferStartTime = new AtomicLong(-1L);
+ private final AtomicLong transferCompleteTime = new AtomicLong(-1L);
+
+ public long getAmountTransferred() {
+ return current.get();
+ }
+
+ public long getTotalTransferAmount() {
+ return total.get();
+ }
+
+ public long getPercentTransferred() {
+ return (current.get() * 100) / total.get();
+ }
+
+ void updateAmountTransferred(long amount) {
+ current.set(amount);
+ }
+
+ void updateTotalTransferAmount(long totalAmount) {
+ total.set(totalAmount);
+ }
+
+ void updateNumberOfFiles(int files) {
+ numberOfFiles.set(files);
+ }
+
+ public int getNumberOfFiles() {
+ return numberOfFiles.get();
+ }
+
+ public long getTransferStartTime() {
+ return transferStartTime.get();
+ }
+
+ public long getTransferCompleteTime() {
+ return transferCompleteTime.get();
+ }
+
+ void updateTransferStartTime(long time) {
+ transferStartTime.set(time);
+ }
+
+ void updateTransferCompleteTime(long time) {
+ transferCompleteTime.set(time);
+ }
+
+ public long getTotalTransferTime() {
+ return getTransferCompleteTime() - getTransferStartTime();
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/AddressResponseListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/AddressResponseListener.java
new file mode 100644
index 000000000..ed9e17d28
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/AddressResponseListener.java
@@ -0,0 +1,44 @@
+package org.eclipse.osee.ote.internal;
+
+import java.net.InetSocketAddress;
+
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.message.interfaces.IRemoteMessageService;
+import org.eclipse.osee.ote.remote.messages.GET_INET_ADDRESS_REQ;
+import org.eclipse.osee.ote.remote.messages.GET_INET_ADDRESS_RESP;
+import org.eclipse.osee.ote.remote.messages.SOCKET_ID;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventHandler;
+
+public class AddressResponseListener implements EventHandler {
+
+ private final EventAdmin eventAdmin;
+ private final IRemoteMessageService messageService;
+ private final GET_INET_ADDRESS_RESP resp;
+ private final GET_INET_ADDRESS_REQ req;
+
+ public AddressResponseListener(EventAdmin eventAdmin, IRemoteMessageService messageService) {
+ this.eventAdmin = eventAdmin;
+ this.messageService = messageService;
+ resp = new GET_INET_ADDRESS_RESP();
+ req = new GET_INET_ADDRESS_REQ();
+ }
+
+ @Override
+ public void handleEvent(Event event) {
+ OteEventMessageUtil.putBytes(event, req);
+ InetSocketAddress address;
+ resp.getHeader().RESPONSE_ID.setValue(req.getHeader().MESSAGE_SEQUENCE_NUMBER.getValue());
+ if(req.SOCKET_ID.getValue() == SOCKET_ID.MSG_UPDATES){
+ address = messageService.getMsgUpdateSocketAddress();
+ } else {
+ address = messageService.getRecorderSocketAddress();
+ }
+ resp.SOCKET_ID.setValue(req.SOCKET_ID.getValue());
+ resp.ADDRESS.setAddress(address.getAddress());
+ resp.ADDRESS.setPort(address.getPort());
+ OteEventMessageUtil.postEvent(resp, eventAdmin);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/Configure.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/Configure.java
new file mode 100644
index 000000000..e3e716ee2
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/Configure.java
@@ -0,0 +1,58 @@
+package org.eclipse.osee.ote.internal;
+
+import java.util.concurrent.Callable;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.Configuration;
+import org.eclipse.osee.ote.ConfigurationStatus;
+import org.eclipse.osee.ote.OTEStatusCallback;
+import org.eclipse.osee.ote.core.environment.interfaces.IRuntimeLibraryManager;
+
+public class Configure implements Callable<ConfigurationStatus> {
+
+ private final IRuntimeLibraryManager bundleLoader;
+ private final Configuration configuration;
+ private final OTEStatusCallback<ConfigurationStatus> callable;
+
+ public Configure(IRuntimeLibraryManager bundleLoader2, Configuration configuration, OTEStatusCallback<ConfigurationStatus> callable) {
+ this.bundleLoader = bundleLoader2;
+ this.configuration = configuration;
+ this.callable = callable;
+ }
+
+ @Override
+ public ConfigurationStatus call() throws Exception {
+ long startTime = System.currentTimeMillis();
+ ConfigurationStatus status = new ConfigurationStatus(configuration, true, "");
+ try{
+ boolean completedUninstall = true;
+ callable.setTotalUnitsOfWork(determineUnitsOfWork());
+ if(bundleLoader.installed()){
+ completedUninstall = bundleLoader.uninstall(callable);
+ callable.incrememtUnitsWorked(1);
+ }
+ if(completedUninstall){
+ if(bundleLoader.install(configuration, callable)){
+ if(!bundleLoader.start(callable)){
+ status.setFail("Bundle start failed.");
+ }
+ } else {
+ status.setFail("Bundle install failed.");
+ }
+ } else {
+ status.setFail("Failed to uninstall bundles.");
+ }
+ } finally {
+ callable.complete(status);
+ }
+ long elapsedTime = System.currentTimeMillis() - startTime;
+ OseeLog.log(getClass(), Level.INFO, String.format("Took %d ms to load and start the test environment.", elapsedTime));
+ return status;
+ }
+
+ private int determineUnitsOfWork() {
+ return (bundleLoader.installed() ? 1 : 0) + configuration.getItems().size()*2;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/ConfigureAndResponseListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/ConfigureAndResponseListener.java
new file mode 100644
index 000000000..552356b05
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/ConfigureAndResponseListener.java
@@ -0,0 +1,143 @@
+package org.eclipse.osee.ote.internal;
+
+import java.io.IOException;
+import java.util.concurrent.ExecutionException;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.ConfigurationStatus;
+import org.eclipse.osee.ote.OTEApi;
+import org.eclipse.osee.ote.OTEStatusCallback;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpoint;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpointSender;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.remote.messages.ConfigurationAndResponse;
+import org.eclipse.osee.ote.remote.messages.JobStatus;
+import org.eclipse.osee.ote.remote.messages.SerializedConfigurationAndResponse;
+import org.eclipse.osee.ote.remote.messages.SerializedOTEJobStatus;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventHandler;
+
+public class ConfigureAndResponseListener implements EventHandler {
+
+ private final OTEApi oteApi;
+ private final OteUdpEndpoint endpoint;
+
+ public ConfigureAndResponseListener(EventAdmin eventAdmin, OteUdpEndpoint endpoint, OTEApi oteApi) {
+ this.oteApi = oteApi;
+ this.endpoint = endpoint;
+ }
+
+ @Override
+ public void handleEvent(Event arg0) {
+ SerializedConfigurationAndResponse serialized = new SerializedConfigurationAndResponse(OteEventMessageUtil.getBytes(arg0));
+ try {
+ ConfigurationAndResponse config = serialized.getObject();
+
+ OteUdpEndpointSender oteEndpointSender = endpoint.getOteEndpointSender(serialized.getHeader().getSourceInetSocketAddress());
+ endpoint.addBroadcast(oteEndpointSender);
+ try{
+ String id = (String) oteApi.getIHostTestEnvironment().getProperties().getProperty("id");
+ /*
+ * Ensure that the id matches so that we are talking with the server we intended to talk to
+ */
+ if(id != null && config.getId().equals(id)){
+ if(config.install()){
+ oteApi.loadConfiguration(config.getConfiguration(), new Status(oteEndpointSender));
+ } else {
+ oteApi.downloadConfigurationJars(config.getConfiguration(), new Status(oteEndpointSender));
+ }
+ } else {
+ handleException(new Exception("Bad server id."), oteEndpointSender);
+ }
+ } catch (ExecutionException e) {
+ handleException(e, oteEndpointSender);
+ }
+ }catch (Throwable e) {
+ handleException(e);
+ }
+ }
+
+ private void handleException(Throwable e, OteUdpEndpointSender oteEndpointSender) {
+ SerializedOTEJobStatus message = new SerializedOTEJobStatus();
+ JobStatus jobStatus = new JobStatus();
+ StringBuilder sb = new StringBuilder();
+ sb.append("error: ").append(message).append("\n").append(Lib.exceptionToString(e)).append("\n");
+ jobStatus.setErrorLog(sb.toString());
+ jobStatus.setSuccess(false);
+ jobStatus.setJobComplete(true);
+ try {
+ message.setObject(jobStatus);
+ oteEndpointSender.send(message);
+ } catch (IOException e1) {
+ e1.printStackTrace();
+ }
+ }
+
+ private void handleException(Throwable e) {
+ OseeLog.log(getClass(), Level.SEVERE, e);
+ }
+
+ private static class Status implements OTEStatusCallback<ConfigurationStatus> {
+
+ private OteUdpEndpointSender oteEndpointSender;
+ private SerializedOTEJobStatus message;
+ private JobStatus jobStatus;
+ private StringBuilder sb;
+
+ public Status(OteUdpEndpointSender oteEndpointSender) {
+ this.oteEndpointSender = oteEndpointSender;
+ this.message = new SerializedOTEJobStatus();
+ this.jobStatus = new JobStatus();
+ sb = new StringBuilder();
+ }
+
+ private void setAndSend(){
+ try {
+ message.setObject(jobStatus);
+ oteEndpointSender.send(message);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public void complete(ConfigurationStatus done) {
+ this.jobStatus.setSuccess(done.isSuccess());
+ this.jobStatus.setJobComplete(true);
+ this.jobStatus.setErrorLog(done.getMessage());
+ setAndSend();
+ }
+
+ @Override
+ public void setTotalUnitsOfWork(int totalUnitsOfWork) {
+ jobStatus.setTotalUnitsOfWork(totalUnitsOfWork);
+ setAndSend();
+ }
+
+ @Override
+ public void incrememtUnitsWorked(int count) {
+ jobStatus.setUnitsWorked(jobStatus.getUnitsWorked() + count);
+ setAndSend();
+ }
+
+ @Override
+ public void log(String message) {
+ sb.append("log: ").append(message).append("\n");
+ }
+
+ @Override
+ public void error(String message, Throwable th) {
+ sb.append("error: ").append(message).append("\n").append(Lib.exceptionToString(th)).append("\n");
+ }
+
+ @Override
+ public void error(String message) {
+ sb.append("error: ").append(message).append("\n");
+ }
+
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/ConnectionListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/ConnectionListener.java
new file mode 100644
index 000000000..b0e31bdf9
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/ConnectionListener.java
@@ -0,0 +1,58 @@
+package org.eclipse.osee.ote.internal;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.rmi.RemoteException;
+
+import org.eclipse.osee.ote.OTEApi;
+import org.eclipse.osee.ote.core.ConnectionRequestResult;
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpoint;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpointSender;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.remote.messages.RequestRemoteTestEnvironment;
+import org.eclipse.osee.ote.remote.messages.SerializedConnectionRequestResult;
+import org.eclipse.osee.ote.remote.messages.SerializedRequestRemoteTestEnvironment;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventHandler;
+
+public class ConnectionListener implements EventHandler {
+
+ private OteUdpEndpoint oteEndpoint;
+ private OTEApi oteApi;
+
+ public ConnectionListener(EventAdmin eventAdmin, OteUdpEndpoint oteEndpoint, OTEApi oteApi) {
+ this.oteEndpoint = oteEndpoint;
+ this.oteApi = oteApi;
+ }
+
+
+ @Override
+ public void handleEvent(Event arg0) {
+ SerializedRequestRemoteTestEnvironment serialized = new SerializedRequestRemoteTestEnvironment(OteEventMessageUtil.getBytes(arg0));
+ RequestRemoteTestEnvironment request;
+ try {
+ request = serialized.getObject();
+ IHostTestEnvironment hostTestEnvironment = oteApi.getIHostTestEnvironment();
+ if(hostTestEnvironment != null){
+ try {
+ InetSocketAddress address = serialized.getHeader().getSourceInetSocketAddress();
+ ConnectionRequestResult requestEnvironment = hostTestEnvironment.requestEnvironment(request.getSession(), request.getId(), request.getConfig());
+ OteUdpEndpointSender oteEndpointSender = oteEndpoint.getOteEndpointSender(address);
+ SerializedConnectionRequestResult serializedConnectionRequestResult = new SerializedConnectionRequestResult(requestEnvironment);
+ serializedConnectionRequestResult.setResponse(serialized);
+ oteEndpointSender.send(serializedConnectionRequestResult);
+ oteEndpoint.addBroadcast(oteEndpointSender);
+ } catch (RemoteException e) {
+ e.printStackTrace();
+ }
+ }
+ } catch (IOException e1) {
+ e1.printStackTrace();
+ } catch (ClassNotFoundException e1) {
+ e1.printStackTrace();
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/DisconnectListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/DisconnectListener.java
new file mode 100644
index 000000000..a184a0df1
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/DisconnectListener.java
@@ -0,0 +1,39 @@
+package org.eclipse.osee.ote.internal;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.OTEApi;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpoint;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.remote.messages.DisconnectRemoteTestEnvironment;
+import org.eclipse.osee.ote.remote.messages.SerializedDisconnectRemoteTestEnvironment;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventHandler;
+
+public class DisconnectListener implements EventHandler {
+
+ private OTEApi oteApi;
+ private OteUdpEndpoint oteEndpoint;
+
+ public DisconnectListener(EventAdmin eventAdmin, OteUdpEndpoint oteEndpoint, OTEApi oteApi) {
+ this.oteApi = oteApi;
+ this.oteEndpoint = oteEndpoint;
+ }
+
+ @Override
+ public void handleEvent(Event arg0) {
+ SerializedDisconnectRemoteTestEnvironment serializedDisconnectRemoteTestEnvironment = new SerializedDisconnectRemoteTestEnvironment(OteEventMessageUtil.getBytes(arg0));
+ DisconnectRemoteTestEnvironment disconnect;
+ try {
+ disconnect = serializedDisconnectRemoteTestEnvironment.getObject();
+ oteApi.getIHostTestEnvironment().disconnect(disconnect.getId());
+ oteEndpoint.removeBroadcast(oteEndpoint.getOteEndpointSender(serializedDisconnectRemoteTestEnvironment.getHeader().getSourceInetSocketAddress()));
+ } catch (IOException e) {
+ e.printStackTrace();
+ } catch (ClassNotFoundException e) {
+ e.printStackTrace();
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/DownloadConfiguration.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/DownloadConfiguration.java
new file mode 100644
index 000000000..5667ef900
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/DownloadConfiguration.java
@@ -0,0 +1,40 @@
+package org.eclipse.osee.ote.internal;
+
+import java.util.concurrent.Callable;
+
+import org.eclipse.osee.ote.Configuration;
+import org.eclipse.osee.ote.ConfigurationStatus;
+import org.eclipse.osee.ote.OTEStatusCallback;
+import org.eclipse.osee.ote.core.environment.interfaces.IRuntimeLibraryManager;
+
+public class DownloadConfiguration implements Callable<ConfigurationStatus> {
+
+ private final IRuntimeLibraryManager bundleLoader;
+ private final Configuration configuration;
+ private final OTEStatusCallback<ConfigurationStatus> callable;
+
+ public DownloadConfiguration(IRuntimeLibraryManager bundleLoader2, Configuration configuration, OTEStatusCallback<ConfigurationStatus> callable) {
+ this.bundleLoader = bundleLoader2;
+ this.configuration = configuration;
+ this.callable = callable;
+ }
+
+ @Override
+ public ConfigurationStatus call() throws Exception {
+ ConfigurationStatus status = new ConfigurationStatus(configuration, true, "");
+ try{
+ callable.setTotalUnitsOfWork(determineUnitsOfWork());
+ if(!bundleLoader.acquireBundles(configuration, callable)){
+ status.setFail("Failed to download all bundles.");
+ }
+ } finally {
+ callable.complete(status);
+ }
+ return status;
+ }
+
+ private int determineUnitsOfWork() {
+ return configuration.getItems().size();
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/GetPropertiesListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/GetPropertiesListener.java
new file mode 100644
index 000000000..64aee764b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/GetPropertiesListener.java
@@ -0,0 +1,49 @@
+package org.eclipse.osee.ote.internal;
+
+import java.io.IOException;
+import java.rmi.RemoteException;
+
+import org.eclipse.osee.ote.OTEApi;
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpoint;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpointInlineSender;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpointSender;
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.remote.messages.SerializedEnhancedProperties;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventHandler;
+
+public class GetPropertiesListener implements EventHandler {
+
+ private final OTEApi oteApi;
+ private final OteUdpEndpoint endpoint;
+
+ public GetPropertiesListener(EventAdmin eventAdmin, OteUdpEndpoint endpoint, OTEApi oteApi) {
+ this.oteApi = oteApi;
+ this.endpoint = endpoint;
+ }
+
+ @Override
+ public void handleEvent(Event arg0) {
+ OteEventMessage oteEventMessage = OteEventMessageUtil.getOteEventMessage(arg0);
+ SerializedEnhancedProperties properties = new SerializedEnhancedProperties();
+ IHostTestEnvironment host = oteApi.getIHostTestEnvironment();
+ if(host != null){
+ try {
+ properties.setResponse(oteEventMessage);
+ OteUdpEndpointInlineSender oteEndpointSender =endpoint.getOteEndpointInlineSender(oteEventMessage.getHeader().getSourceInetSocketAddress());
+ properties.setObject(host.getProperties());
+ oteEndpointSender.send(properties);
+ } catch (RemoteException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/OTEApiImpl.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/OTEApiImpl.java
new file mode 100644
index 000000000..d38a15898
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/OTEApiImpl.java
@@ -0,0 +1,278 @@
+package org.eclipse.osee.ote.internal;
+
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.locks.ReentrantLock;
+
+import org.eclipse.osee.ote.Configuration;
+import org.eclipse.osee.ote.ConfigurationItem;
+import org.eclipse.osee.ote.ConfigurationStatus;
+import org.eclipse.osee.ote.OTEApi;
+import org.eclipse.osee.ote.OTEServerRuntimeCache;
+import org.eclipse.osee.ote.OTEStatusCallback;
+import org.eclipse.osee.ote.core.environment.TestEnvironmentInterface;
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.IRuntimeLibraryManager;
+import org.eclipse.osee.ote.core.model.IModelManager;
+import org.eclipse.osee.ote.io.OTEServerFolder;
+import org.eclipse.osee.ote.message.interfaces.IRemoteMessageService;
+
+public final class OTEApiImpl implements OTEApi {
+
+ private final Configuration emptyConfiguration;
+ private final ReentrantLock configurationLock;
+
+ private Future<ConfigurationStatus> currentConfigurationFuture;
+ private ExecutorService executor;
+ private IRuntimeLibraryManager runtimeLibraryManager;
+ private OTEServerFolder serverFolder;
+ private OTEServerRuntimeCache serverRuntimeCache;
+ private TestEnvironmentInterface env;
+ private IModelManager modelManager;
+ private IRemoteMessageService remoteMessageService;
+ private IHostTestEnvironment host;
+
+ /**
+ * ds component method
+ */
+ public void start(){
+ }
+
+ /**
+ * ds component method
+ */
+ public void stop(){
+ }
+
+ /**
+ * ds component method
+ */
+ public void bindRuntimeLibraryManager(IRuntimeLibraryManager runtimeLibraryManager){
+ this.runtimeLibraryManager = runtimeLibraryManager;
+ }
+
+ /**
+ * ds component method
+ */
+ public void unbindRuntimeLibraryManager(IRuntimeLibraryManager runtimeLibraryManager){
+ this.runtimeLibraryManager = null;
+ }
+
+ /**
+ * ds component method
+ */
+ public void bindOTEServerFolder(OTEServerFolder serverFolder){
+ this.serverFolder = serverFolder;
+ }
+
+ /**
+ * ds component method
+ */
+ public void unbindOTEServerFolder(OTEServerFolder serverFolder){
+ this.serverFolder = null;
+ }
+
+ /**
+ * ds component method
+ */
+ public void bindOTEServerRuntimeCache(OTEServerRuntimeCache serverRuntimeCache){
+ this.serverRuntimeCache = serverRuntimeCache;
+ }
+
+ /**
+ * ds component method
+ */
+ public void unbindOTEServerRuntimeCache(OTEServerRuntimeCache serverRuntimeCache){
+ this.serverRuntimeCache = null;
+ }
+
+ /**
+ * ds component method
+ */
+ public void bindTestEnvironmentInterface(TestEnvironmentInterface env){
+ this.env = env;
+ }
+
+ /**
+ * ds component method
+ */
+ public void unbindTestEnvironmentInterface(TestEnvironmentInterface env){
+ this.env = null;
+ }
+
+ /**
+ * ds component method
+ */
+ public void bindIModelManager(IModelManager modelManager){
+ this.modelManager = modelManager;
+ }
+
+ /**
+ * ds component method
+ */
+ public void unbindIModelManager(IModelManager modelManager){
+ this.modelManager = null;
+ }
+
+ /**
+ * ds component method
+ */
+ public void bindIRemoteMessageService(IRemoteMessageService remoteMessageService){
+ this.remoteMessageService = remoteMessageService;
+ }
+
+ /**
+ * ds component method
+ */
+ public void unbindIRemoteMessageService(IRemoteMessageService remoteMessageService){
+ this.remoteMessageService = null;
+ }
+
+ /**
+ * ds component method
+ */
+ public void bindIHostTestEnvironment(IHostTestEnvironment host){
+ this.host = host;
+ }
+
+ /**
+ * ds component method
+ */
+ public void unbindIHostTestEnvironment(IHostTestEnvironment host){
+ this.host = null;
+ }
+
+ public OTEApiImpl(){
+ this.configurationLock = new ReentrantLock();
+ this.emptyConfiguration = new Configuration();
+ this.currentConfigurationFuture = new OTEFutureImpl(new ConfigurationStatus(emptyConfiguration, true, ""));
+ this.executor = Executors.newSingleThreadExecutor(new ThreadFactory(){
+ @Override
+ public Thread newThread(Runnable arg0) {
+ Thread th = new Thread(arg0);
+ th.setName("OteConfiguration");
+ return th;
+ }
+ });
+ }
+
+ @Override
+ public Future<ConfigurationStatus> loadConfiguration(Configuration configuration, OTEStatusCallback<ConfigurationStatus> callable) throws InterruptedException, ExecutionException {
+ Future<ConfigurationStatus> status;
+ configurationLock.lock();
+ try{
+ if(currentConfigurationFuture != null && !currentConfigurationFuture.isDone()){
+ status = new OTEFutureImpl(new ConfigurationStatus(configuration, false, "In the process of loading a configuration."));
+ callable.complete(status.get());
+ } else if(currentConfigurationFuture.get().getConfiguration() == emptyConfiguration || configuration == emptyConfiguration || !currentConfigurationFuture.get().isSuccess()){
+ status = new OTEFutureImpl(executor.submit(new Configure(runtimeLibraryManager, configuration, callable)));
+ currentConfigurationFuture = status;
+ } else {
+ status = new OTEFutureImpl(new ConfigurationStatus(configuration, false, generateConfigDiff(configuration, currentConfigurationFuture.get().getConfiguration())));
+ callable.complete(status.get());
+ }
+ } finally {
+ configurationLock.unlock();
+ }
+ return status;
+ }
+
+ private String generateConfigDiff(Configuration configuration, Configuration configuration2) {
+ Collections.sort(configuration.getItems(), new ConfigurationItemComparator());
+ Collections.sort(configuration2.getItems(), new ConfigurationItemComparator());
+ StringBuilder missingBundles = new StringBuilder();
+ StringBuilder extraBundles = new StringBuilder();
+ StringBuilder differentVersion = new StringBuilder();
+ for(ConfigurationItem item:configuration.getItems()){
+ int i = Collections.binarySearch(configuration2.getItems(), item, new ConfigurationItemComparator());
+ if(i >= 0 ){
+ ConfigurationItem item2 = configuration2.getItems().get(i);
+ if(!item2.getVersion().equals(item.getVersion())){
+ differentVersion.append(String.format("%s [%s] != [%s]\n", item.getSymbolicName(), item.getVersion(), item2.getVersion()));
+ } else if(!item2.getMd5Digest().equals(item.getMd5Digest())){
+ differentVersion.append(String.format("%s binary contents do not match\n", item.getSymbolicName()));
+ }
+ } else {
+ missingBundles.append(String.format("%s missing\n", item.getSymbolicName()));
+ }
+ }
+ for(ConfigurationItem item:configuration2.getItems()){
+ int i = Collections.binarySearch(configuration.getItems(), item, new ConfigurationItemComparator());
+ if(i < 0 ){
+ extraBundles.append(String.format("%s extra bundle\n", item.getSymbolicName()));
+ }
+ }
+ return differentVersion.toString() + missingBundles.toString() + extraBundles.toString();
+ }
+
+ private static class ConfigurationItemComparator implements Comparator<ConfigurationItem> {
+
+ @Override
+ public int compare(ConfigurationItem arg0, ConfigurationItem arg1) {
+ return arg0.getSymbolicName().compareTo(arg1.getSymbolicName());
+ }
+
+ }
+
+
+
+ @Override
+ public Future<ConfigurationStatus> resetConfiguration(OTEStatusCallback<ConfigurationStatus> callable) throws InterruptedException, ExecutionException {
+ return loadConfiguration(emptyConfiguration, callable);
+ }
+
+ @Override
+ public Future<ConfigurationStatus> getConfiguration() {
+ return currentConfigurationFuture;
+ }
+
+ @Override
+ public Future<ConfigurationStatus> downloadConfigurationJars(Configuration configuration, OTEStatusCallback<ConfigurationStatus> callable) throws InterruptedException, ExecutionException {
+ return new OTEFutureImpl(executor.submit(new DownloadConfiguration(runtimeLibraryManager, configuration, callable)));
+ }
+
+ @Override
+ public IModelManager getModelManager() {
+ return modelManager;
+ }
+
+ @Override
+ public TestEnvironmentInterface getTestEnvironment() {
+ return env;
+ }
+
+ @Override
+ public OTEServerFolder getServerFolder() {
+ return serverFolder;
+ }
+
+ @Override
+ public OTEServerRuntimeCache getRuntimeCache() {
+ return serverRuntimeCache;
+ }
+
+ @Override
+ public Class<?> loadFromScriptClassLoader(String clazz) throws ClassNotFoundException {
+ return runtimeLibraryManager.loadFromRuntimeLibraryLoader(clazz);
+ }
+
+ @Override
+ public Class<?> loadFromRuntimeLibraryLoader(String clazz) throws ClassNotFoundException {
+ return runtimeLibraryManager.loadFromScriptClassLoader(clazz);
+ }
+
+ @Override
+ public IRemoteMessageService getRemoteMessageService() {
+ return remoteMessageService;
+ }
+
+ @Override
+ public IHostTestEnvironment getIHostTestEnvironment() {
+ return host;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/OTEBundleLoader.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/OTEBundleLoader.java
new file mode 100644
index 000000000..4f96ff60c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/OTEBundleLoader.java
@@ -0,0 +1,331 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.internal;
+
+import java.io.File;
+import java.io.InputStream;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.xml.XMLStreamWriterUtil;
+import org.eclipse.osee.framework.plugin.core.util.ExportClassLoader;
+import org.eclipse.osee.ote.Configuration;
+import org.eclipse.osee.ote.ConfigurationItem;
+import org.eclipse.osee.ote.ConfigurationStatus;
+import org.eclipse.osee.ote.OTEServerRuntimeCache;
+import org.eclipse.osee.ote.OTEStatusCallback;
+import org.eclipse.osee.ote.core.OseeURLClassLoader;
+import org.eclipse.osee.ote.core.ServiceUtility;
+import org.eclipse.osee.ote.core.environment.interfaces.IRuntimeLibraryManager;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.FrameworkUtil;
+
+/**
+ * When starting bundles users can specify an OTE-StartLevel: <int value> in the manifest of a bundle, if there are issues
+ * with the order in which bundles need to be started. The list of bundles to start will simply be sorted by that value,
+ * the default value is 0. This was implemented to work around a deadlock issue that can happen when you call Bundle.start()
+ * and there is a conflict with 'component resolving thread'. By waiting till the end to load the bundles that can cause the issue
+ * we avoid the deadlock issue which has a default 5 second time limit.
+ *
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class OTEBundleLoader implements IRuntimeLibraryManager{
+
+ public static final String MANIFEST_ENTRY_OTE_STARTLEVEL = "OTE-StartLevel";
+
+ private final List<Bundle> installedBundles;
+ private final Collection<Bundle> runningBundles;
+ private final Map<String, String> bundleNameToMd5Map;
+ private final BundleContext context;
+
+ private URLClassLoader scriptClassLoader;
+ private OTEServerRuntimeCache serverRuntimeCache;
+
+ public void bindOTEServerRuntimeCache(OTEServerRuntimeCache serverRuntimeCache){
+ this.serverRuntimeCache = serverRuntimeCache;
+ }
+
+ public void unbindOTEServerRuntimeCache(OTEServerRuntimeCache serverRuntimeCache){
+ this.serverRuntimeCache = serverRuntimeCache;
+ }
+
+ public OTEBundleLoader() {
+ this.context = FrameworkUtil.getBundle(getClass()).getBundleContext();
+ this.installedBundles = new LinkedList<>();
+ this.runningBundles = new LinkedList<>();
+ this.bundleNameToMd5Map = new HashMap<>();
+ }
+
+ @Override
+ public boolean install(Configuration oteConfiguration, OTEStatusCallback<ConfigurationStatus> statusCallback) {
+ boolean pass = true;
+ for (ConfigurationItem bundleDescription : oteConfiguration.getItems()) {
+ String bundleName = bundleDescription.getSymbolicName();
+ try {
+ boolean exists = false;
+ for (Bundle bundle : runningBundles) {
+ if (bundle.getSymbolicName().equals(bundleName)) {
+ exists = true;
+ break;
+ }
+ }
+ if (!exists) {
+ Bundle bundle = Platform.getBundle(bundleDescription.getSymbolicName());
+ if (bundle == null) {
+ Bundle installedBundle;
+ File bundleData = acquireSystemLibraryStream(bundleDescription);
+ installedBundle = context.installBundle("reference:" + bundleData.toURI().toURL().toExternalForm());
+ bundleNameToMd5Map.put(bundleName, bundleDescription.getMd5Digest());
+ installedBundles.add(installedBundle);
+ }
+ }
+ statusCallback.log("installed " + bundleName);
+ } catch (BundleException ex){
+ if(ex.getType() == BundleException.DUPLICATE_BUNDLE_ERROR){
+ statusCallback.log(String.format("Duplicate bundle [%s].", bundleName));
+ } else {
+ statusCallback.error(String.format("Unable to load [%s].", bundleName), ex);
+ pass = false;
+ }
+ } catch (Throwable th) {
+ statusCallback.error(String.format("Unable to load [%s].", bundleName), th);
+ pass = false;
+ } finally {
+ statusCallback.incrememtUnitsWorked(1);
+ }
+ }
+ return pass;
+ }
+
+ @Override
+ public boolean acquireBundles(Configuration oteConfiguration, OTEStatusCallback<ConfigurationStatus> statusCallback) {
+ boolean pass = true;
+ for (ConfigurationItem bundleDescription : oteConfiguration.getItems()) {
+ String bundleName = bundleDescription.getSymbolicName();
+ File bundleData = null;
+ try{
+ bundleData = acquireSystemLibraryStream(bundleDescription);
+ } catch (Exception e) {
+ pass = false;
+ statusCallback.error("Failed to aquire bundle from client.", e);
+ }
+ finally {
+ if(bundleData == null){
+ pass = false;
+ statusCallback.error("Failed to downloaded bundle " + bundleName);
+ }
+ statusCallback.incrememtUnitsWorked(1);
+ }
+ statusCallback.log("downloaded " + bundleName);
+ }
+ return pass;
+ }
+
+ @Override
+ public boolean start(OTEStatusCallback<ConfigurationStatus> statusCallback) {
+ boolean pass = true;
+ sortBundles(installedBundles);
+ Iterator<Bundle> iter = installedBundles.iterator();
+ while (iter.hasNext()) {
+ Bundle bundle = iter.next();
+ try {
+ String entry = bundle.getHeaders().get("Fragment-Host");
+ if (entry == null) {
+ int bundleState = bundle.getState();
+ if(bundleState != Bundle.ACTIVE) {
+ bundle.start();
+ }
+ }
+ // We got here because bundle.start did not exception
+ runningBundles.add(bundle);
+ iter.remove();
+ statusCallback.log("started " + bundle.getSymbolicName());
+ } catch (BundleException ex) {
+ pass = false;
+ statusCallback.error("Failed to start " + bundle.getSymbolicName(), ex);
+ } finally {
+ statusCallback.incrememtUnitsWorked(1);
+ }
+ }
+ return pass;
+ }
+
+ private void sortBundles(List<Bundle> installedBundles2) {
+ Collections.sort(installedBundles, new Comparator<Bundle>() {
+ @Override
+ public int compare(Bundle arg0, Bundle arg1) {
+ int startLevel0 = getStartLevel(arg0);
+ int startLevel1 = getStartLevel(arg1);
+ if(startLevel0 != 0 || startLevel1 != 0){
+ return startLevel0 - startLevel1;
+ } else {
+ return arg0.getSymbolicName().compareTo(arg1.getSymbolicName());
+ }
+ }
+
+ private int getStartLevel(Bundle arg0) {
+ String level = arg0.getHeaders().get(MANIFEST_ENTRY_OTE_STARTLEVEL);
+ if(level == null){
+ return 0;
+ } else {
+ try {
+ return Integer.parseInt(level);
+ } catch (NumberFormatException ex) {
+ return 0;
+ }
+ }
+ }
+ });
+ }
+
+ @Override
+ public boolean uninstall(OTEStatusCallback<ConfigurationStatus> statusCallback) {
+ boolean result = true;
+ for (Bundle bundle : installedBundles) {
+ try {
+ bundle.uninstall();
+ } catch (BundleException ex) {
+ result = false;
+ statusCallback.error("Failed to uninstall " + bundle.getSymbolicName(), ex);
+ }
+ }
+ installedBundles.clear();
+
+ for (Bundle bundle : runningBundles) {
+ try {
+ String entry = bundle.getHeaders().get("Fragment-Host");
+ if (entry == null) {
+ bundle.stop();
+ }
+ bundle.uninstall();
+ } catch (BundleException ex) {
+ result = false;
+ statusCallback.error("Failed to stop and uninstall " + bundle.getSymbolicName(), ex);
+ }
+ }
+ runningBundles.clear();
+
+ return result;
+ }
+
+ private File acquireSystemLibraryStream(ConfigurationItem bundleDescription) throws Exception {
+ File file = serverRuntimeCache.get(bundleDescription.getSymbolicName(), bundleDescription.getMd5Digest());
+ if (file == null) {
+ InputStream servedBundleIn = new URL(bundleDescription.getLocationUrl()).openConnection().getInputStream();
+ file = serverRuntimeCache.save(bundleDescription.getSymbolicName(), bundleDescription.getMd5Digest(), servedBundleIn);
+ servedBundleIn.close();
+ }
+ return file;
+ }
+
+ public void dispose() {
+ bundleNameToMd5Map.clear();
+ installedBundles.clear();
+ runningBundles.clear();
+ }
+
+ @Override
+ public boolean installed() {
+ return installedBundles.size() > 0 || runningBundles.size() > 0;
+ }
+
+ @Override
+ public void clearJarCache() {
+ serverRuntimeCache.clearJarCache();
+ }
+
+ @Override
+ public void resetScriptLoader(Configuration oteConfiguration, String[] classPaths) throws Exception {
+ List<URL> urls = new ArrayList<>();
+ if(oteConfiguration != null){
+ for(ConfigurationItem item:oteConfiguration.getItems()){
+ File file = serverRuntimeCache.get(item.getSymbolicName(), item.getMd5Digest());
+ if(file != null){
+ urls.add(file.toURI().toURL());
+ }
+ }
+ }
+ URL[] urlArray = urls.toArray(new URL[urls.size()+classPaths.length]);
+ URL[] urlClassPaths = Lib.getUrlFromString(classPaths);
+ System.arraycopy(urlClassPaths, 0, urlArray, urls.size(), urlClassPaths.length);
+ scriptClassLoader = new OseeURLClassLoader("Script ClassLoader", urlArray, ExportClassLoader.getInstance());
+ }
+
+ @Override
+ public Class<?> loadFromScriptClassLoader(String path) throws ClassNotFoundException {
+ if (scriptClassLoader == null) {
+ return loadFromRuntimeLibraryLoader(path);
+ }
+ Class<?> scriptClass = scriptClassLoader.loadClass(path);
+ return scriptClass;
+ }
+
+ @Override
+ public Class<?> loadFromRuntimeLibraryLoader(String clazz) throws ClassNotFoundException {
+ return ExportClassLoader.getInstance().loadClass(clazz);
+ }
+
+ @Override
+ public void toXml(XMLStreamWriter writer) throws XMLStreamException {
+ writer.writeStartElement("RuntimeVersions");
+ for (String bundleVersion : getBundleVersions()) {
+ XMLStreamWriterUtil.writeElement(writer, "Version", bundleVersion);
+ }
+ writer.writeEndElement();
+ }
+
+ @JsonProperty
+ public List<String> getBundleVersions() {
+ Bundle[] bundles = ServiceUtility.getContext().getBundles();
+ List<String> versions = new ArrayList<>();
+ for(Bundle bundle: bundles ){
+ String version = bundle.getHeaders().get("Bundle-Version");
+ String implVersion = bundle.getHeaders().get("Implementation-Version");
+ if (version != null && implVersion != null) {
+ versions.add(String.format("%s_%s_%s", bundle.getSymbolicName(), version, implVersion));
+ } else if (version != null){
+ versions.add(String.format("%s_%s", bundle.getSymbolicName(), version));
+ } else {
+ versions.add(String.format("%s", bundle.getSymbolicName()));
+ }
+ }
+ Collections.sort(versions);
+ return versions;
+ }
+
+ @Override
+ public ClassLoader getClassLoader() {
+ if (scriptClassLoader == null) {
+ return ExportClassLoader.getInstance();
+ } else {
+ return scriptClassLoader;
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/OTEFutureImpl.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/OTEFutureImpl.java
new file mode 100644
index 000000000..cf2ad43eb
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/OTEFutureImpl.java
@@ -0,0 +1,64 @@
+package org.eclipse.osee.ote.internal;
+
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+import org.eclipse.osee.ote.ConfigurationStatus;
+
+public class OTEFutureImpl implements Future<ConfigurationStatus> {
+
+ private final Future<ConfigurationStatus> submit;
+ private ConfigurationStatus oteConfigurationStatus;
+
+ public OTEFutureImpl(Future<ConfigurationStatus> submit) {
+ this.submit = submit;
+ }
+
+ public OTEFutureImpl(ConfigurationStatus oteConfigurationStatus) {
+ this.submit = null;
+ this.oteConfigurationStatus = oteConfigurationStatus;
+ }
+
+ @Override
+ public boolean cancel(boolean mayInterruptIfRunning) {
+ if(submit == null){
+ return false;
+ }
+ return submit.cancel(mayInterruptIfRunning);
+ }
+
+ @Override
+ public ConfigurationStatus get() throws InterruptedException, ExecutionException {
+ if(submit == null){
+ return oteConfigurationStatus;
+ }
+ return submit.get();
+ }
+
+ @Override
+ public ConfigurationStatus get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException {
+ if(submit == null){
+ return oteConfigurationStatus;
+ }
+ return submit.get(timeout, unit);
+ }
+
+ @Override
+ public boolean isCancelled() {
+ if(submit == null){
+ return false;
+ }
+ return submit.isCancelled();
+ }
+
+ @Override
+ public boolean isDone() {
+ if(submit == null){
+ return true;
+ }
+ return submit.isDone();
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/OTEServerRuntimeCacheImpl.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/OTEServerRuntimeCacheImpl.java
new file mode 100644
index 000000000..99eace740
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/OTEServerRuntimeCacheImpl.java
@@ -0,0 +1,222 @@
+package org.eclipse.osee.ote.internal;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.jdk.core.util.io.streams.StreamPumper;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.OTEServerRuntimeCache;
+import org.eclipse.osee.ote.io.OTEServerFolder;
+
+public class OTEServerRuntimeCacheImpl implements OTEServerRuntimeCache {
+
+ private static final SimpleDateFormat formatter = new SimpleDateFormat("yyyy_MM_dd___kk_mm_ss");
+
+ private File folder;
+ private OTEServerFolder oteServerFolder;
+
+ public OTEServerRuntimeCacheImpl(){
+ }
+
+ /**
+ * ds component method
+ */
+ public void start(){
+ folder = oteServerFolder.getCacheFolder();
+ if (!folder.exists()) {
+ if (!folder.mkdirs()) {
+ OseeLog.log(getClass(), Level.SEVERE, "Could not create JAR cache at " + folder.getAbsolutePath());
+ }
+ }
+ if (!folder.isDirectory()) {
+ OseeLog.log(getClass(), Level.SEVERE, "The JAR cache is not a directory! Path=" + folder.getAbsolutePath());
+ }
+ clean();
+ }
+
+ /**
+ * ds component method
+ */
+ public void stop(){
+ }
+
+ /**
+ * ds component method
+ */
+ public void bindOTEServerFolder(OTEServerFolder oteServerFolder){
+ this.oteServerFolder = oteServerFolder;
+ }
+
+ /**
+ * ds component method
+ */
+ public void unbindOTEServerFolder(OTEServerFolder oteServerFolder){
+ this.oteServerFolder = oteServerFolder;
+ }
+
+ @Override
+ public void clearJarCache() {
+ File[] bundleFolders = folder.listFiles();
+ for(File bundleFolder: bundleFolders){
+ if(bundleFolder.isDirectory()){
+ File[] jars = bundleFolder.listFiles(new FileFilter() {
+ @Override
+ public boolean accept(File file) {
+ return file.getAbsolutePath().endsWith(".jar");
+ }
+ });
+ for(File jar:jars){
+ jar.delete();
+ }
+ } else {
+ bundleFolder.delete();
+ }
+ }
+ }
+
+ @Override
+ public File save(String symbolicName, String md5Digest, InputStream servedBundleIn) throws IOException {
+ File namedFolder = new File(folder, symbolicName);
+ if(namedFolder.exists() && !namedFolder.isDirectory()){
+ namedFolder.delete();
+ }
+ namedFolder.mkdirs();
+
+ File newCachedFile = new File(namedFolder, md5Digest + ".jar");
+ OutputStream cachedFileOut = new FileOutputStream(newCachedFile);
+ StreamPumper.pumpData(servedBundleIn, cachedFileOut);
+ cachedFileOut.close();
+ servedBundleIn.close();
+ writeDateFile(newCachedFile);
+ return newCachedFile;
+ }
+
+ @Override
+ public File get(String symbolicName, String md5Digest) throws FileNotFoundException {
+ File foundFile = new File(new File(folder, symbolicName), md5Digest + ".jar");
+ if(foundFile.exists()){
+ writeDateFile(foundFile);
+ return foundFile;
+ }
+ return null;
+ }
+
+ /**
+ * Write out a file that has the date a cached file was last accessed. This file will be used to determine when it is ok to remove a file.
+ *
+ * @param foundFile
+ */
+ private void writeDateFile(File foundFile) {
+ File dateFile = new File(foundFile.getParentFile(), foundFile.getName()+ ".date");
+ FileOutputStream fos = null;
+ try{
+ fos = new FileOutputStream(dateFile);
+ fos.write(formatter.format(new Date()).getBytes());
+ fos.flush();
+ } catch(IOException ex) {
+ OseeLog.log(getClass(), Level.SEVERE, ex);
+ } finally {
+ if(fos != null){
+ try {
+ fos.close();
+ } catch (IOException e) {
+ }
+ }
+ }
+ }
+
+ private void clean(){
+ if(folder.exists()){
+ File[] bundleFolders = folder.listFiles();
+ if(bundleFolders != null){
+ for(File bundleFolder: bundleFolders){
+ if(bundleFolder.isDirectory()){
+ File[] jars = bundleFolder.listFiles(new FileFilter() {
+ @Override
+ public boolean accept(File file) {
+ return file.getAbsolutePath().endsWith(".jar");
+ }
+ });
+ if(jars.length == 0){
+ if(bundleFolder.listFiles().length == 0){
+ bundleFolder.delete();
+ }
+ } else {
+ for(File jar:jars){
+ File dateFile = new File(jar.getAbsolutePath() + ".date");
+ if(dateFile.exists()){
+ if(isDateFileOld(dateFile)){//delete files that haven't been recently used
+ if(jar.exists()){
+ jar.delete();
+ }
+ dateFile.delete();
+ }
+ } else { //delete a jar without a ".date" file
+ jar.delete();
+ }
+ }
+ }
+ } else { //delete legacy style cache items
+ bundleFolder.delete();
+ }
+ }
+ }
+ }
+ }
+
+ private boolean isDateFileOld(File dateFile) {
+ String dateStr = getDateFromFile(dateFile);
+ Date date;
+ try {
+ date = formatter.parse(dateStr);
+ } catch (ParseException e) {
+ return true;
+ }
+ Date oldDate = getOldDate();
+ if(date.before(oldDate)){
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ private String getDateFromFile(File dateFile){
+ FileInputStream fis = null;
+ String dateStr = null;
+ try{
+ byte[] buffer = new byte[1024];
+ fis = new FileInputStream(dateFile);
+ fis.read(buffer);
+ dateStr = new String(buffer);
+ } catch(IOException ex) {
+ OseeLog.log(getClass(), Level.SEVERE, ex);
+ } finally {
+ if(fis != null){
+ try {
+ fis.close();
+ } catch (IOException e) {
+ }
+ }
+ }
+ return dateStr;
+ }
+
+ private Date getOldDate(){
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(new Date());
+ cal.add(Calendar.DAY_OF_MONTH, -7);
+ return cal.getTime();
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/OTESystemOutConnection.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/OTESystemOutConnection.java
new file mode 100644
index 000000000..38a799c0d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/OTESystemOutConnection.java
@@ -0,0 +1,91 @@
+package org.eclipse.osee.ote.internal;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.endpoint.OteUdpEndpoint;
+import org.eclipse.osee.ote.io.SystemOutput;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.remote.messages.ConsoleInputMessage;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventHandler;
+
+public class OTESystemOutConnection {
+
+ private OteUdpEndpoint endpoint;
+ private SystemOutput output;
+ private OTESystemOutputHandler outputHandler;
+ private ServiceRegistration<EventHandler> subscribe;
+
+ /**
+ * osgi
+ */
+ public void start(){
+ outputHandler = new OTESystemOutputHandler(endpoint);
+ output.addListener(outputHandler);
+ subscribe = OteEventMessageUtil.subscribe(ConsoleInputMessage.TOPIC, new ConsoleInputHandler(output));
+ }
+
+ /**
+ * osgi
+ */
+ public void stop(){
+ output.removeListener(outputHandler);
+ if(subscribe != null){
+ subscribe.unregister();
+ subscribe = null;
+ }
+ }
+
+ /**
+ * osgi
+ */
+ public void bindOteUdpEndpoint(OteUdpEndpoint endpoint){
+ this.endpoint = endpoint;
+ }
+
+ /**
+ * osgi
+ */
+ public void unbindOteUdpEndpoint(OteUdpEndpoint endpoint){
+ this.endpoint = null;
+ }
+
+ /**
+ * osgi
+ */
+ public void bindSystemOutput(SystemOutput output){
+ this.output = output;
+ }
+
+ /**
+ * osgi
+ */
+ public void unbindSystemOutput(SystemOutput output){
+ this.output = null;
+ }
+
+ private static class ConsoleInputHandler implements EventHandler {
+
+ private SystemOutput output;
+ private ConsoleInputMessage message;
+
+ public ConsoleInputHandler(SystemOutput output) {
+ this.output = output;
+ message = new ConsoleInputMessage();
+ }
+
+ @Override
+ public void handleEvent(Event arg0) {
+ message.setBackingBuffer(OteEventMessageUtil.getBytes(arg0));
+ try {
+ output.write(message.getString());
+ } catch (IOException e) {
+ e.printStackTrace();
+ } catch (ClassNotFoundException e) {
+ e.printStackTrace();
+ }
+ }
+
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/OTESystemOutputHandler.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/OTESystemOutputHandler.java
new file mode 100644
index 000000000..3b825279d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/OTESystemOutputHandler.java
@@ -0,0 +1,87 @@
+package org.eclipse.osee.ote.internal;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.osee.ote.core.CopyOnWriteNoIteratorList;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpoint;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpointSender;
+import org.eclipse.osee.ote.io.SystemOutputListener;
+import org.eclipse.osee.ote.remote.messages.ConsoleOutputMessage;
+
+public class OTESystemOutputHandler implements SystemOutputListener {
+
+ private ByteBuffer buffer = ByteBuffer.allocate(4096);
+ private OteUdpEndpoint endpoint;
+ private ConsoleOutputMessage outputMessage;
+ private ScheduledExecutorService newSingleThreadScheduledExecutor;
+
+ public OTESystemOutputHandler(OteUdpEndpoint endpoint) {
+ this.endpoint = endpoint;
+ outputMessage = new ConsoleOutputMessage();
+ newSingleThreadScheduledExecutor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
+ @Override
+ public Thread newThread(Runnable arg0) {
+ Thread th = new Thread(arg0);
+ th.setDaemon(true);
+ th.setName("OTEConsole Send");
+ return th;
+ }
+ });
+ newSingleThreadScheduledExecutor.scheduleAtFixedRate(new Runnable(){
+ @Override
+ public void run() {
+ send();
+ }
+ }, 1000, 1000, TimeUnit.MILLISECONDS);
+ }
+
+ @Override
+ public void close() throws IOException {
+ flush();
+ }
+
+ @Override
+ public synchronized void flush() throws IOException {
+ send();
+ }
+
+ public synchronized void send(){
+ if(buffer.position() > 0){
+ try{
+ buffer.flip();
+ outputMessage.setStringData(buffer);
+ buffer.clear();
+ CopyOnWriteNoIteratorList<OteUdpEndpointSender> broadcastSenders = endpoint.getBroadcastSenders();
+ OteUdpEndpointSender[] oteUdpEndpointSenders = broadcastSenders.get();
+ for(int i = 0; i < oteUdpEndpointSenders.length; i++){
+ oteUdpEndpointSenders[i].send(outputMessage);
+ }
+ } catch (Throwable th){
+ }
+ }
+ }
+
+ @Override
+ public synchronized void write(byte[] b, int off, int len) throws IOException {
+ while(len > 0){
+ if(buffer.position() > 0 && buffer.remaining() <= len){
+ flush();
+ }
+ int length = (buffer.remaining() < len) ? buffer.remaining() : len;
+ len = len - length;
+ buffer.put(b, off, length);
+ off += length;
+ }
+ }
+
+ @Override
+ public synchronized void write(byte[] b) throws IOException {
+ write(b, 0, b.length);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/PhysicalTypesResponceListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/PhysicalTypesResponceListener.java
new file mode 100644
index 000000000..d9edf5282
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/PhysicalTypesResponceListener.java
@@ -0,0 +1,42 @@
+package org.eclipse.osee.ote.internal;
+
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.message.interfaces.IRemoteMessageService;
+import org.eclipse.osee.ote.remote.messages.AVAILABLE_PHYSICAL_TYPES_REQ;
+import org.eclipse.osee.ote.remote.messages.SerializedAvailablePhysicalTypesMessage;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventHandler;
+
+public class PhysicalTypesResponceListener implements EventHandler {
+
+ private final EventAdmin eventAdmin;
+ private final IRemoteMessageService messageService;
+ private final SerializedAvailablePhysicalTypesMessage resp;
+ private final AVAILABLE_PHYSICAL_TYPES_REQ req;
+
+ public PhysicalTypesResponceListener(EventAdmin eventAdmin, IRemoteMessageService messageService) {
+ this.eventAdmin = eventAdmin;
+ this.messageService = messageService;
+ resp = new SerializedAvailablePhysicalTypesMessage();
+ req = new AVAILABLE_PHYSICAL_TYPES_REQ();
+ }
+
+ @Override
+ public void handleEvent(Event event) {
+ OteEventMessageUtil.putBytes(event, req);
+ resp.getHeader().RESPONSE_ID.setValue(req.getHeader().MESSAGE_SEQUENCE_NUMBER.getValue());
+ try {
+ resp.setObject((Serializable)messageService.getAvailablePhysicalTypes());
+ OteEventMessageUtil.postEvent(resp, eventAdmin);
+ } catch (IOException e) {
+ OseeLog.log(getClass(), Level.SEVERE, e);
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/RecordCommandListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/RecordCommandListener.java
new file mode 100644
index 000000000..a7746af57
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/RecordCommandListener.java
@@ -0,0 +1,37 @@
+package org.eclipse.osee.ote.internal;
+
+import java.io.IOException;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.message.commands.RecordCommand;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.message.interfaces.IRemoteMessageService;
+import org.eclipse.osee.ote.remote.messages.SerializedRecordCommandMessage;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventHandler;
+
+public class RecordCommandListener implements EventHandler {
+
+ private final IRemoteMessageService messageService;
+
+ public RecordCommandListener(EventAdmin eventAdmin, IRemoteMessageService messageService) {
+ this.messageService = messageService;
+ }
+
+ @Override
+ public void handleEvent(Event arg0) {
+ RecordCommand cmd;
+ try {
+ SerializedRecordCommandMessage msg = new SerializedRecordCommandMessage(OteEventMessageUtil.getBytes(arg0));
+ cmd = msg.getObject();
+ messageService.startRecording(cmd);
+ } catch (IOException e) {
+ OseeLog.log(getClass(), Level.SEVERE, e);
+ } catch (ClassNotFoundException e) {
+ OseeLog.log(getClass(), Level.SEVERE, e);
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/RemoteMessageServiceHandler.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/RemoteMessageServiceHandler.java
new file mode 100644
index 000000000..ed426464f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/RemoteMessageServiceHandler.java
@@ -0,0 +1,86 @@
+package org.eclipse.osee.ote.internal;
+
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.message.interfaces.IRemoteMessageService;
+import org.eclipse.osee.ote.remote.messages.AVAILABLE_PHYSICAL_TYPES_REQ;
+import org.eclipse.osee.ote.remote.messages.GET_INET_ADDRESS_REQ;
+import org.eclipse.osee.ote.remote.messages.STOP_RECORDING_CMD;
+import org.eclipse.osee.ote.remote.messages.SerializedRecordCommandMessage;
+import org.eclipse.osee.ote.remote.messages.SerializedSetElementMessage;
+import org.eclipse.osee.ote.remote.messages.SerializedSubscribeToMessage;
+import org.eclipse.osee.ote.remote.messages.SerializedUnSubscribeMessage;
+import org.eclipse.osee.ote.remote.messages.SerializedZeroizeElementMessage;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventHandler;
+
+public class RemoteMessageServiceHandler {
+
+ private EventAdmin eventAdmin;
+ private IRemoteMessageService messageService;
+ private ServiceRegistration<EventHandler> addressResponseReg;
+ private ServiceRegistration<EventHandler> availablePhysicalTypesReg;
+ private ServiceRegistration<EventHandler> subscribeToMessageReg;
+ private ServiceRegistration<EventHandler> unsubscribeToMessageReg;
+ private ServiceRegistration<EventHandler> recordReg;
+ private ServiceRegistration<EventHandler> setElementReg;
+ private ServiceRegistration<EventHandler> zeroizeElementReg;
+ private ServiceRegistration<EventHandler> stopRecordReg;
+
+ /**
+ * osgi
+ */
+ public void bindEventAdmin(EventAdmin eventAdmin){
+ this.eventAdmin = eventAdmin;
+ }
+
+ /**
+ * osgi
+ */
+ public void unbindEventAdmin(EventAdmin eventAdmin){
+ this.eventAdmin = null;
+ }
+
+ /**
+ * osgi
+ */
+ public void bindIRemoteMessageService(IRemoteMessageService messageService){
+ this.messageService = messageService;
+ }
+
+ /**
+ * osgi
+ */
+ public void unbindIRemoteMessageService(IRemoteMessageService messageService){
+ this.messageService = null;
+ }
+
+ /**
+ * osgi
+ */
+ public void start(){
+ addressResponseReg = OteEventMessageUtil.subscribe(GET_INET_ADDRESS_REQ.TOPIC, new AddressResponseListener(eventAdmin, messageService));
+ availablePhysicalTypesReg = OteEventMessageUtil.subscribe(AVAILABLE_PHYSICAL_TYPES_REQ.TOPIC, new PhysicalTypesResponceListener(eventAdmin, messageService));
+ subscribeToMessageReg = OteEventMessageUtil.subscribe(SerializedSubscribeToMessage.EVENT, new SubscriptionCommandListener(eventAdmin, messageService));
+ unsubscribeToMessageReg = OteEventMessageUtil.subscribe(SerializedUnSubscribeMessage.EVENT, new UnSubscribeCommandListener(eventAdmin, messageService));
+ recordReg = OteEventMessageUtil.subscribe(SerializedRecordCommandMessage.EVENT, new RecordCommandListener(eventAdmin, messageService));
+ setElementReg = OteEventMessageUtil.subscribe(SerializedSetElementMessage.EVENT, new SetElementCommandListener(eventAdmin, messageService));
+ zeroizeElementReg = OteEventMessageUtil.subscribe(SerializedZeroizeElementMessage.EVENT, new ZeroizeElementCommandListener(eventAdmin, messageService));
+ stopRecordReg = OteEventMessageUtil.subscribe(STOP_RECORDING_CMD.TOPIC, new StopRecordCommandListener(eventAdmin, messageService));
+ }
+
+ /**
+ * osgi
+ */
+ public void stop(){
+ addressResponseReg.unregister();
+ availablePhysicalTypesReg.unregister();
+ subscribeToMessageReg.unregister();
+ unsubscribeToMessageReg.unregister();
+ recordReg.unregister();
+ setElementReg.unregister();
+ zeroizeElementReg.unregister();
+ stopRecordReg.unregister();
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/RemoteOteApiHandler.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/RemoteOteApiHandler.java
new file mode 100644
index 000000000..12e976bfc
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/RemoteOteApiHandler.java
@@ -0,0 +1,103 @@
+package org.eclipse.osee.ote.internal;
+
+import org.eclipse.osee.ote.OTEApi;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpoint;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.remote.messages.RequestHostEnvironmentProperties;
+import org.eclipse.osee.ote.remote.messages.RunTestsSerialized;
+import org.eclipse.osee.ote.remote.messages.SerializedConfigurationAndResponse;
+import org.eclipse.osee.ote.remote.messages.SerializedDisconnectRemoteTestEnvironment;
+import org.eclipse.osee.ote.remote.messages.SerializedRequestRemoteTestEnvironment;
+import org.eclipse.osee.ote.remote.messages.TestEnvironmentServerShutdown;
+import org.eclipse.osee.ote.remote.messages.TestEnvironmentSetBatchMode;
+import org.eclipse.osee.ote.remote.messages.TestEnvironmentTransferFile;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventHandler;
+
+public class RemoteOteApiHandler {
+
+ private EventAdmin eventAdmin;
+ private OTEApi oteApi;
+ private OteUdpEndpoint oteEndpoint;
+ private ServiceRegistration<EventHandler> configureAndResponse;
+ private ServiceRegistration<EventHandler> getProperties;
+ private ServiceRegistration<EventHandler> getConnection;
+ private ServiceRegistration<EventHandler> disconnect;
+ private ServiceRegistration<EventHandler> runTests;
+ private ServiceRegistration<EventHandler> setBatchMode;
+ private ServiceRegistration<EventHandler> transferFile;
+ private ServiceRegistration<EventHandler> serverShutdown;
+
+ /**
+ * osgi
+ */
+ public void bindEventAdmin(EventAdmin eventAdmin){
+ this.eventAdmin = eventAdmin;
+ }
+
+ /**
+ * osgi
+ */
+ public void unbindEventAdmin(EventAdmin eventAdmin){
+ this.eventAdmin = null;
+ }
+
+ /**
+ * osgi
+ */
+ public void bindOTEApi(OTEApi oteApi){
+ this.oteApi = oteApi;
+ }
+
+ /**
+ * osgi
+ */
+ public void unbindOTEApi(OTEApi oteApi){
+ this.oteApi = null;
+ }
+
+ /**
+ * osgi
+ */
+ public void bindOteUdpEndpoint(OteUdpEndpoint oteEndpoint){
+ this.oteEndpoint = oteEndpoint;
+ }
+
+ /**
+ * osgi
+ */
+ public void unbindOteUdpEndpoint(OteUdpEndpoint oteEndpoint){
+ this.oteEndpoint = null;
+ }
+
+
+ /**
+ * osgi
+ */
+ public void start(){
+ configureAndResponse = OteEventMessageUtil.subscribe(SerializedConfigurationAndResponse.EVENT, new ConfigureAndResponseListener(eventAdmin, oteEndpoint, oteApi));
+ getProperties = OteEventMessageUtil.subscribe(RequestHostEnvironmentProperties.TOPIC, new GetPropertiesListener(eventAdmin, oteEndpoint, oteApi));
+ getConnection = OteEventMessageUtil.subscribe(SerializedRequestRemoteTestEnvironment.TOPIC, new ConnectionListener(eventAdmin, oteEndpoint, oteApi));
+ disconnect = OteEventMessageUtil.subscribe(SerializedDisconnectRemoteTestEnvironment.TOPIC, new DisconnectListener(eventAdmin, oteEndpoint, oteApi));
+ runTests = OteEventMessageUtil.subscribe(RunTestsSerialized.RUNTESTS_NAMESPACE + "*", new RunTestListener(eventAdmin, oteEndpoint, oteApi));
+ setBatchMode = OteEventMessageUtil.subscribe(TestEnvironmentSetBatchMode.TOPIC, new SetBatchModeListener(eventAdmin, oteEndpoint, oteApi));
+ transferFile = OteEventMessageUtil.subscribe(TestEnvironmentTransferFile.TOPIC, new TransferFileToClientListener(eventAdmin, oteEndpoint, oteApi));
+ serverShutdown = OteEventMessageUtil.subscribe(TestEnvironmentServerShutdown.TOPIC, new ServerShutdownListener(eventAdmin, oteEndpoint, oteApi));
+ }
+
+ /**
+ * osgi
+ */
+ public void stop(){
+ configureAndResponse.unregister();
+ getProperties.unregister();
+ getConnection.unregister();
+ disconnect.unregister();
+ runTests.unregister();
+ setBatchMode.unregister();
+ transferFile.unregister();
+ serverShutdown.unregister();
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/RunTestListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/RunTestListener.java
new file mode 100644
index 000000000..639962df7
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/RunTestListener.java
@@ -0,0 +1,110 @@
+package org.eclipse.osee.ote.internal;
+
+import java.io.IOException;
+import java.rmi.server.ExportException;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.eclipse.osee.ote.OTEApi;
+import org.eclipse.osee.ote.core.framework.command.ICommandHandle;
+import org.eclipse.osee.ote.core.framework.command.ITestCommandResult;
+import org.eclipse.osee.ote.core.framework.command.RunTests;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpoint;
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.remote.messages.BooleanResponse;
+import org.eclipse.osee.ote.remote.messages.RunTestsCancel;
+import org.eclipse.osee.ote.remote.messages.RunTestsGetCommandResultReq;
+import org.eclipse.osee.ote.remote.messages.RunTestsGetCommandResultResp;
+import org.eclipse.osee.ote.remote.messages.RunTestsIsCancelled;
+import org.eclipse.osee.ote.remote.messages.RunTestsIsDone;
+import org.eclipse.osee.ote.remote.messages.RunTestsSerialized;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventHandler;
+
+public class RunTestListener implements EventHandler {
+
+ private OTEApi oteApi;
+
+ private ConcurrentHashMap<String, ICommandHandle> handles;
+
+ public RunTestListener(EventAdmin eventAdmin, OteUdpEndpoint oteEndpoint, OTEApi oteApi) {
+ this.oteApi = oteApi;
+ handles = new ConcurrentHashMap<>();
+ }
+
+ @Override
+ public void handleEvent(Event event) {
+ if(oteApi.getTestEnvironment() == null){
+ return;
+ }
+ OteEventMessage generic = OteEventMessageUtil.getOteEventMessage(event);
+ if(RunTestsSerialized.TOPIC.equals(generic.getHeader().TOPIC.getValue())){
+ RunTestsSerialized serialized = new RunTestsSerialized(OteEventMessageUtil.getBytes(event));
+ try {
+ RunTests runTests = serialized.getObject();
+ String guid = runTests.getGUID();
+ ICommandHandle addCommand = oteApi.getTestEnvironment().addCommand(runTests);
+ handles.put(guid, addCommand);
+ } catch (ExportException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ } catch (ClassNotFoundException e) {
+ e.printStackTrace();
+ }
+ } else if (RunTestsCancel.TOPIC.equals(generic.getHeader().TOPIC.getValue())){
+ BooleanResponse booleanResponse = new BooleanResponse();
+ RunTestsCancel cancel = new RunTestsCancel(OteEventMessageUtil.getBytes(event));
+ ICommandHandle iCommandHandle = handles.get(cancel.GUID.getValue());
+ boolean status = false;
+ if(iCommandHandle != null){
+ if(cancel.CANCEL_ALL.getValue()){
+ status = iCommandHandle.cancelAll(true);
+ } else {
+ status = iCommandHandle.cancelSingle(true);
+ }
+ }
+ booleanResponse.VALUE.setValue(status);
+ booleanResponse.setResponse(cancel);
+ OteEventMessageUtil.postEvent(booleanResponse);
+ } else if (RunTestsGetCommandResultReq.TOPIC.equals(generic.getHeader().TOPIC.getValue())){
+ RunTestsGetCommandResultReq req = new RunTestsGetCommandResultReq(OteEventMessageUtil.getBytes(event));
+ ICommandHandle iCommandHandle = handles.get(req.GUID.getValue());
+ RunTestsGetCommandResultResp resp = new RunTestsGetCommandResultResp();
+ if(iCommandHandle != null){
+ ITestCommandResult iTestCommandResult = iCommandHandle.get();
+ try {
+ resp.setObject(iTestCommandResult);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ resp.setResponse(req);
+ OteEventMessageUtil.postEvent(resp);
+ } else if (RunTestsIsCancelled.TOPIC.equals(generic.getHeader().TOPIC.getValue())){
+ BooleanResponse booleanResponse = new BooleanResponse();
+ RunTestsIsCancelled isCanceled = new RunTestsIsCancelled(OteEventMessageUtil.getBytes(event));
+ ICommandHandle iCommandHandle = handles.get(isCanceled.GUID.getValue());
+ boolean status = false;
+ if(iCommandHandle != null){
+ status = iCommandHandle.isCancelled();
+ }
+ booleanResponse.VALUE.setValue(status);
+ booleanResponse.setResponse(isCanceled);
+ OteEventMessageUtil.postEvent(booleanResponse);
+ } else if (RunTestsIsDone.TOPIC.equals(generic.getHeader().TOPIC.getValue())){
+ BooleanResponse booleanResponse = new BooleanResponse();
+ RunTestsIsDone isDone = new RunTestsIsDone(OteEventMessageUtil.getBytes(event));
+ ICommandHandle iCommandHandle = handles.get(isDone.GUID.getValue());
+ boolean status = false;
+ if(iCommandHandle != null){
+ status = iCommandHandle.isDone();
+ }
+ booleanResponse.VALUE.setValue(status);
+ booleanResponse.setResponse(isDone);
+ OteEventMessageUtil.postEvent(booleanResponse);
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/ServerShutdownListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/ServerShutdownListener.java
new file mode 100644
index 000000000..a70b0f9f3
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/ServerShutdownListener.java
@@ -0,0 +1,69 @@
+package org.eclipse.osee.ote.internal;
+
+import java.rmi.RemoteException;
+
+import org.eclipse.osee.ote.OTEApi;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpoint;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.remote.messages.TestEnvironmentServerShutdown;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventHandler;
+
+public class ServerShutdownListener implements EventHandler {
+
+ private OTEApi oteApi;
+
+ public ServerShutdownListener(EventAdmin eventAdmin, OteUdpEndpoint oteEndpoint, OTEApi oteApi) {
+ this.oteApi = oteApi;
+ }
+
+ @Override
+ public void handleEvent(Event arg0) {
+ if(oteApi.getIHostTestEnvironment() == null){
+ return;
+ }
+ TestEnvironmentServerShutdown serverShutdown = new TestEnvironmentServerShutdown(OteEventMessageUtil.getBytes(arg0));
+ String id;
+ try {
+ id = (String)oteApi.getIHostTestEnvironment().getProperties().getProperty("id", "dontknow");
+ if(serverShutdown.SERVER_ID.getValue().equals(id)){
+ shutdown();
+ }
+ } catch (RemoteException e) {
+ e.printStackTrace();
+ }
+ }
+
+ private void shutdown(){
+ BundleContext context = FrameworkUtil.getBundle(getClass()).getBundleContext();
+ Bundle systemBundle = context.getBundle(0);
+ try {
+ systemBundle.stop();
+ boolean canExit = false;
+ while(!canExit){
+ try{
+ Thread.sleep(20);
+ } catch (Throwable th){
+ }
+ canExit = true;
+ try{
+ for(Bundle b:context.getBundles()){
+ if(b.getState() != Bundle.ACTIVE){
+ canExit = false;
+ }
+ }
+ } catch (Throwable th){
+ canExit = true;
+ }
+ }
+ } catch (BundleException e) {
+ }
+ System.exit(0);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/SetBatchModeListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/SetBatchModeListener.java
new file mode 100644
index 000000000..1c179c514
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/SetBatchModeListener.java
@@ -0,0 +1,28 @@
+package org.eclipse.osee.ote.internal;
+
+import org.eclipse.osee.ote.OTEApi;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpoint;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.remote.messages.TestEnvironmentSetBatchMode;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventHandler;
+
+public class SetBatchModeListener implements EventHandler {
+
+ private OTEApi oteApi;
+
+ public SetBatchModeListener(EventAdmin eventAdmin, OteUdpEndpoint oteEndpoint, OTEApi oteApi) {
+ this.oteApi = oteApi;
+ }
+
+ @Override
+ public void handleEvent(Event arg0) {
+ if(oteApi.getTestEnvironment() == null){
+ return;
+ }
+ TestEnvironmentSetBatchMode testEnvironmentSetBatchMode = new TestEnvironmentSetBatchMode(OteEventMessageUtil.getBytes(arg0));
+ oteApi.getTestEnvironment().setBatchMode(testEnvironmentSetBatchMode.SET_BATCH_MODE.getValue());
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/SetElementCommandListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/SetElementCommandListener.java
new file mode 100644
index 000000000..d6abffa34
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/SetElementCommandListener.java
@@ -0,0 +1,37 @@
+package org.eclipse.osee.ote.internal;
+
+import java.io.IOException;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.message.commands.SetElementValue;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.message.interfaces.IRemoteMessageService;
+import org.eclipse.osee.ote.remote.messages.SerializedSetElementMessage;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventHandler;
+
+public class SetElementCommandListener implements EventHandler {
+
+ private final IRemoteMessageService messageService;
+
+ public SetElementCommandListener(EventAdmin eventAdmin, IRemoteMessageService messageService) {
+ this.messageService = messageService;
+ }
+
+ @Override
+ public void handleEvent(Event arg0) {
+ SetElementValue cmd;
+ try {
+ SerializedSetElementMessage msg = new SerializedSetElementMessage(OteEventMessageUtil.getBytes(arg0));
+ cmd = msg.getObject();
+ messageService.setElementValue(cmd);
+ } catch (IOException e) {
+ OseeLog.log(getClass(), Level.SEVERE, e);
+ } catch (ClassNotFoundException e) {
+ OseeLog.log(getClass(), Level.SEVERE, e);
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/StopRecordCommandListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/StopRecordCommandListener.java
new file mode 100644
index 000000000..3c042de26
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/StopRecordCommandListener.java
@@ -0,0 +1,21 @@
+package org.eclipse.osee.ote.internal;
+
+import org.eclipse.osee.ote.message.interfaces.IRemoteMessageService;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventHandler;
+
+public class StopRecordCommandListener implements EventHandler {
+
+ private final IRemoteMessageService messageService;
+
+ public StopRecordCommandListener(EventAdmin eventAdmin, IRemoteMessageService messageService) {
+ this.messageService = messageService;
+ }
+
+ @Override
+ public void handleEvent(Event arg0) {
+ messageService.stopRecording();
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/SubscriptionCommandListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/SubscriptionCommandListener.java
new file mode 100644
index 000000000..6b8182a3e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/SubscriptionCommandListener.java
@@ -0,0 +1,48 @@
+package org.eclipse.osee.ote.internal;
+
+import java.io.IOException;
+import java.net.UnknownHostException;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.message.commands.SubscribeToMessage;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.message.interfaces.IRemoteMessageService;
+import org.eclipse.osee.ote.message.tool.SubscriptionDetails;
+import org.eclipse.osee.ote.remote.messages.SerializedSubscribeToMessage;
+import org.eclipse.osee.ote.remote.messages.SerializedSubscriptionDetailsMessage;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventHandler;
+
+public class SubscriptionCommandListener implements EventHandler {
+
+ private final IRemoteMessageService messageService;
+ private final SerializedSubscribeToMessage cmd;
+
+ public SubscriptionCommandListener(EventAdmin eventAdmin, IRemoteMessageService messageService) {
+ this.messageService = messageService;
+ cmd = new SerializedSubscribeToMessage();
+ }
+
+ @Override
+ public void handleEvent(Event event) {
+ OteEventMessageUtil.putBytes(event, cmd);
+ SubscribeToMessage subscribe;
+ try {
+ subscribe = cmd.getObject();
+ SubscriptionDetails resp = messageService.subscribeToMessage(subscribe);
+ SerializedSubscriptionDetailsMessage stat = new SerializedSubscriptionDetailsMessage();
+ stat.getHeader().RESPONSE_ID.setValue(cmd.getHeader().MESSAGE_SEQUENCE_NUMBER.getValue());
+ stat.setObject(resp);
+ OteEventMessageUtil.postEvent(stat);
+ } catch (UnknownHostException e) {
+ OseeLog.log(getClass(), Level.SEVERE, e);
+ } catch (IOException e) {
+ OseeLog.log(getClass(), Level.SEVERE, e);
+ } catch (ClassNotFoundException e) {
+ OseeLog.log(getClass(), Level.SEVERE, e);
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/TransferFileToClientListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/TransferFileToClientListener.java
new file mode 100644
index 000000000..c376e323b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/TransferFileToClientListener.java
@@ -0,0 +1,54 @@
+package org.eclipse.osee.ote.internal;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.net.UnknownHostException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadFactory;
+
+import org.eclipse.osee.ote.OTEApi;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpoint;
+import org.eclipse.osee.ote.filetransfer.TcpFileTransfer;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.remote.messages.TestEnvironmentTransferFile;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventHandler;
+
+public class TransferFileToClientListener implements EventHandler {
+
+ private ExecutorService pool;
+ private OTEApi oteApi;
+
+ public TransferFileToClientListener(EventAdmin eventAdmin, OteUdpEndpoint oteEndpoint, OTEApi oteApi) {
+ this.oteApi = oteApi;
+ pool = Executors.newCachedThreadPool(new ThreadFactory() {
+ @Override
+ public Thread newThread(Runnable arg0) {
+ Thread th = new Thread(arg0);
+ th.setName("OTE File Transfer");
+ return th;
+ }
+ });
+ }
+
+ @Override
+ public void handleEvent(Event arg0) {
+ if(oteApi.getTestEnvironment() == null){
+ return;
+ }
+ TestEnvironmentTransferFile testEnvironmentTransferFile = new TestEnvironmentTransferFile(OteEventMessageUtil.getBytes(arg0));
+ InetSocketAddress inetSocketAddress;
+ try {
+ inetSocketAddress = new InetSocketAddress(testEnvironmentTransferFile.ADDRESS.getAddress(), testEnvironmentTransferFile.ADDRESS.getPort());
+ TcpFileTransfer.sendFile(pool, new File(testEnvironmentTransferFile.FILE_PATH.getValue()), inetSocketAddress);
+ } catch (UnknownHostException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/UnSubscribeCommandListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/UnSubscribeCommandListener.java
new file mode 100644
index 000000000..11d9d55cb
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/UnSubscribeCommandListener.java
@@ -0,0 +1,42 @@
+package org.eclipse.osee.ote.internal;
+
+import java.io.IOException;
+import java.net.UnknownHostException;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.message.commands.UnSubscribeToMessage;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.message.interfaces.IRemoteMessageService;
+import org.eclipse.osee.ote.remote.messages.SerializedUnSubscribeMessage;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventHandler;
+
+public class UnSubscribeCommandListener implements EventHandler {
+
+ private final IRemoteMessageService messageService;
+ private final SerializedUnSubscribeMessage cmd;
+
+ public UnSubscribeCommandListener(EventAdmin eventAdmin, IRemoteMessageService messageService) {
+ this.messageService = messageService;
+ cmd = new SerializedUnSubscribeMessage();
+ }
+
+ @Override
+ public void handleEvent(Event event) {
+ OteEventMessageUtil.putBytes(event, cmd);
+ UnSubscribeToMessage unsubscribe;
+ try {
+ unsubscribe = cmd.getObject();
+ messageService.unsubscribeToMessage(unsubscribe);
+ } catch (UnknownHostException e) {
+ OseeLog.log(getClass(), Level.SEVERE, e);
+ } catch (IOException e) {
+ OseeLog.log(getClass(), Level.SEVERE, e);
+ } catch (ClassNotFoundException e) {
+ OseeLog.log(getClass(), Level.SEVERE, e);
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/ZeroizeElementCommandListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/ZeroizeElementCommandListener.java
new file mode 100644
index 000000000..8bf3f9baf
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/ZeroizeElementCommandListener.java
@@ -0,0 +1,37 @@
+package org.eclipse.osee.ote.internal;
+
+import java.io.IOException;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.message.commands.ZeroizeElement;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.message.interfaces.IRemoteMessageService;
+import org.eclipse.osee.ote.remote.messages.SerializedZeroizeElementMessage;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventHandler;
+
+public class ZeroizeElementCommandListener implements EventHandler {
+
+ private final IRemoteMessageService messageService;
+
+ public ZeroizeElementCommandListener(EventAdmin eventAdmin, IRemoteMessageService messageService) {
+ this.messageService = messageService;
+ }
+
+ @Override
+ public void handleEvent(Event arg0) {
+ ZeroizeElement cmd;
+ try {
+ SerializedZeroizeElementMessage msg = new SerializedZeroizeElementMessage(OteEventMessageUtil.getBytes(arg0));
+ cmd = msg.getObject();
+ messageService.zeroizeElement(cmd);
+ } catch (IOException e) {
+ OseeLog.log(getClass(), Level.SEVERE, e);
+ } catch (ClassNotFoundException e) {
+ OseeLog.log(getClass(), Level.SEVERE, e);
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/endpoint/EndpointComponent.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/endpoint/EndpointComponent.java
new file mode 100644
index 000000000..579060d7c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/endpoint/EndpointComponent.java
@@ -0,0 +1,148 @@
+package org.eclipse.osee.ote.internal.endpoint;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.util.HashMap;
+
+import org.eclipse.osee.framework.jdk.core.util.network.PortUtil;
+import org.eclipse.osee.ote.core.CopyOnWriteNoIteratorList;
+import org.eclipse.osee.ote.endpoint.EndpointDataProcessor;
+import org.eclipse.osee.ote.endpoint.OteEndpointSender;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpoint;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpointInlineSender;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpointReceiverImpl;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpointSender;
+import org.eclipse.osee.ote.properties.OtePropertiesCore;
+
+public class EndpointComponent implements OteUdpEndpoint {
+
+ private OteUdpEndpointReceiverImpl receiver;
+ private HashMap<InetSocketAddress, OteUdpEndpointSender> senders = new HashMap<>();
+ private CopyOnWriteNoIteratorList<OteUdpEndpointSender> broadcastThreaded = new CopyOnWriteNoIteratorList<>(OteUdpEndpointSender.class);//for backwards compatibility
+ private boolean debug = false;
+
+ public EndpointComponent(){
+ int port;
+ try {
+ String strPort = OtePropertiesCore.endpointPort.getValue(Integer.toString(PortUtil.getInstance().getValidPort()));
+ try{
+ port = Integer.parseInt(strPort);
+ } catch (Throwable th){
+ port = PortUtil.getInstance().getValidPort();
+ }
+ receiver = new OteUdpEndpointReceiverImpl(new InetSocketAddress(InetAddress.getLocalHost(), port));
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void start(){
+ receiver.start();
+ setDebugOutput(false);
+ }
+
+ public synchronized void stop(){
+ receiver.stop();
+ for(OteEndpointSender sender: senders.values()){
+ try {
+ sender.stop();
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ @Override
+ public void setDebugOutput(boolean debug) {
+ String ioRedirect = OtePropertiesCore.ioRedirect.getValue();
+ if(ioRedirect != null){
+ if(Boolean.parseBoolean(ioRedirect)){
+ this.debug = false;
+ System.out.println("Unable to enable Endpoint debug because -Dote.io.redirect is enabled.");
+ return;
+ }
+ }
+ this.debug = debug;
+ receiver.setDebugOutput(debug);
+ for(OteUdpEndpointSender sender: senders.values()){
+ sender.setDebug(debug);
+ }
+ }
+
+ @Override
+ public InetSocketAddress getLocalEndpoint() {
+ return receiver.getEndpoint();
+ }
+
+ @Override
+ public synchronized OteUdpEndpointSender getOteEndpointThreadedSender(InetSocketAddress address) {
+ OteUdpEndpointSender sender = senders.get(address);
+ if(sender == null || (sender != null && sender.isClosed())){
+ sender = new OteUdpEndpointSender(address);
+ sender.setDebug(debug);
+ sender.start();
+ senders.put(address, sender);
+ }
+ return sender;
+ }
+
+ @Override
+ public OteUdpEndpointInlineSender getOteEndpointInlineSender(InetSocketAddress address) {
+ return new OteUdpEndpointInlineSender(address);
+ }
+
+ @Override
+ public synchronized OteUdpEndpointSender getOteEndpointSender(InetSocketAddress address) {
+ return getOteEndpointThreadedSender(address);
+ }
+
+ @Override
+ public void addBroadcast(OteUdpEndpointSender sender) {
+ if(!isAlreadyInBroadcastThreadedList(sender) && sender instanceof OteUdpEndpointSender){
+ broadcastThreaded.add((OteUdpEndpointSender)sender);
+ }
+ }
+
+ private boolean isAlreadyInBroadcastThreadedList(OteEndpointSender sender) {
+ OteEndpointSender[] oteUdpEndpointSenders = broadcastThreaded.get();
+ for(int i = 0; i < oteUdpEndpointSenders.length; i++) {
+ if(oteUdpEndpointSenders[i].getAddress().getPort() == sender.getAddress().getPort()){
+ if(oteUdpEndpointSenders[i].getAddress().getAddress().equals(sender.getAddress().getAddress())){
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public CopyOnWriteNoIteratorList<OteUdpEndpointSender> getBroadcastSenders() {
+ return broadcastThreaded;
+ }
+
+ @Override
+ public void addDataProcessor(EndpointDataProcessor processor) {
+ receiver.addDataProcessor(processor);
+ }
+
+ @Override
+ public void removeDataProcessor(EndpointDataProcessor processor) {
+ receiver.removeDataProcessor(processor);
+ }
+
+ @Override
+ public void removeBroadcast(OteUdpEndpointSender sender) {
+ if(sender == null){
+ broadcastThreaded.clear();
+ } else {
+ broadcastThreaded.remove(sender);
+ }
+ }
+
+// @Override
+// public void clearBroadcast() {
+// broadcastThreaded.clear();
+// }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/message/event/send/NotifyOnResponse.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/message/event/send/NotifyOnResponse.java
new file mode 100644
index 000000000..ec37344e5
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/message/event/send/NotifyOnResponse.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.internal.message.event.send;
+
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.Lock;
+
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventHandler;
+
+
+public class NotifyOnResponse<T extends OteEventMessage> implements EventHandler {
+
+ private final int responseId;
+ private final Condition responseReceived;
+ private final Lock lock;
+ private final Class<T> clazz;
+ private T recievedMessage;
+ private volatile boolean responded = false;
+ private final ServiceRegistration<EventHandler> reg;
+ private T responseMessage;
+
+ public NotifyOnResponse(Class<T> clazz, String responseTopic, int responseId, Lock lock, Condition responseReceived) {
+ this.responseId = responseId;
+ this.clazz = clazz;
+ this.responseReceived = responseReceived;
+ this.lock = lock;
+ reg = OteEventMessageUtil.subscribe(responseTopic, this);
+ }
+
+ @SuppressWarnings("unchecked")
+ public NotifyOnResponse(T responseMessage, int responseId2, Lock lock2, Condition responseReceived2) {
+ this((Class<T>)responseMessage.getClass(), responseMessage.getHeader().TOPIC.getValue(), responseId2, lock2, responseReceived2);
+ this.responseMessage = responseMessage;
+ }
+
+ @Override
+ public void handleEvent(Event event) {
+ try {
+ if(responseMessage == null){
+ recievedMessage = clazz.newInstance();
+ } else {
+ recievedMessage = responseMessage;
+ }
+ OteEventMessageUtil.putBytes(event, recievedMessage);
+ if(recievedMessage.getHeader().RESPONSE_ID.getValue() == responseId){
+ lock.lock();
+ try{
+ responded = true;
+ responseReceived.signal();
+ }finally{
+ lock.unlock();
+ }
+ } else {
+ recievedMessage = null;
+ }
+ } catch (InstantiationException e) {
+ recievedMessage = null;
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ recievedMessage = null;
+ e.printStackTrace();
+ }
+ }
+
+ public boolean hasResponse(){
+ return responded;
+ }
+
+ public T getMessage(){
+ return recievedMessage;
+ }
+
+ public void dispose(){
+ reg.unregister();
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/message/event/send/OteEventMessageFutureImpl.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/message/event/send/OteEventMessageFutureImpl.java
new file mode 100644
index 000000000..4d5a906d4
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/message/event/send/OteEventMessageFutureImpl.java
@@ -0,0 +1,143 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.internal.message.event.send;
+
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.ReentrantLock;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.message.event.send.OteEventMessageCallable;
+import org.eclipse.osee.ote.message.event.send.OteEventMessageFuture;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventHandler;
+
+
+public class OteEventMessageFutureImpl<T extends OteEventMessage, R extends OteEventMessage> implements OteEventMessageFuture<T, R>, EventHandler{
+
+ private final ServiceRegistration<EventHandler> reg;
+ protected final OteEventMessageCallable<T, R> callable;
+ protected final Class<R> recieveClasstype;
+ protected final int responseId;
+ protected final T sentMessage;
+ private final ScheduledExecutorService ex;
+ private final ReentrantLock lock;
+ private final Condition condition;
+ private final ScheduledFuture<?> wakeup;
+ private TimeoutRunnable<T, R> timeoutRunnable;
+ protected volatile boolean gotResponse = false;
+ protected volatile boolean isDone = false;
+
+ public OteEventMessageFutureImpl(Class<R> recieveClasstype, OteEventMessageCallable<T, R> callable, T sentMessage, String responseTopic, int responseId, long timeout) {
+ this.callable = callable;
+ this.responseId = responseId;
+ this.sentMessage = sentMessage;
+ this.recieveClasstype = recieveClasstype;
+ reg = OteEventMessageUtil.subscribe(responseTopic, this);
+ lock = new ReentrantLock();
+ condition = lock.newCondition();
+ ex = Executors.newSingleThreadScheduledExecutor(new ThreadFactory(){
+ @Override
+ public Thread newThread(Runnable arg0) {
+ Thread th = new Thread(arg0);
+ th.setDaemon(true);
+ th.setName("OteEventMessage Timeout");
+ return th;
+ }
+ });
+ timeoutRunnable = new TimeoutRunnable<>(lock, condition, sentMessage, callable, this);
+ wakeup = ex.schedule(timeoutRunnable, timeout, TimeUnit.MILLISECONDS);
+ }
+
+ @Override
+ public void handleEvent(Event event) {
+ try {
+ R msg = recieveClasstype.newInstance();
+ OteEventMessageUtil.putBytes(event, msg);
+ if(msg.getHeader().RESPONSE_ID.getValue() == responseId){
+ cancel();
+ gotResponse = true;
+ callable.call(sentMessage, msg, this);
+ executeCondition();
+ }
+ } catch (InstantiationException e) {
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ }
+
+ protected final void executeCondition(){
+ lock.lock();
+ try{
+ condition.signal();
+ } finally {
+ lock.unlock();
+ }
+ }
+
+ @Override
+ public void cancel(){
+ dispose();
+ }
+
+ @Override
+ public void waitForCompletion(){
+ lock.lock();
+ try{
+ while(!timeoutRunnable.isTimedOut() && !this.wakeup.isDone()){
+ try {
+ condition.await();
+ } catch (InterruptedException e) {
+ OseeLog.log(getClass(), Level.SEVERE, e);
+ }
+ }
+ } finally {
+ lock.unlock();
+ }
+ }
+
+ @Override
+ public boolean isTimedOut(){
+ return timeoutRunnable.isTimedOut();
+ }
+
+ @Override
+ public boolean gotResponse(){
+ return gotResponse ;
+ }
+
+ @Override
+ public void complete(){
+ cancel();
+ executeCondition();
+ }
+
+ private void dispose(){
+ reg.unregister();
+ wakeup.cancel(false);
+ this.ex.shutdown();
+ isDone = true;
+ }
+
+ @Override
+ public boolean isDone() {
+ return isDone;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/message/event/send/OteEventMessageFutureMultipleResponseImpl.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/message/event/send/OteEventMessageFutureMultipleResponseImpl.java
new file mode 100644
index 000000000..fafd13ba4
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/message/event/send/OteEventMessageFutureMultipleResponseImpl.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.internal.message.event.send;
+
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.message.event.send.OteEventMessageCallable;
+import org.osgi.service.event.Event;
+
+
+public class OteEventMessageFutureMultipleResponseImpl<T extends OteEventMessage, R extends OteEventMessage> extends OteEventMessageFutureImpl<T, R> {
+
+
+ public OteEventMessageFutureMultipleResponseImpl(Class<R> recieveClasstype, OteEventMessageCallable<T, R> callable, T sentMessage, String responseTopic, int responseId, long timeout) {
+ super(recieveClasstype, callable, sentMessage, responseTopic, responseId, timeout);
+ }
+
+ @Override
+ public void handleEvent(Event event) {
+ try {
+ R msg = recieveClasstype.newInstance();
+ OteEventMessageUtil.putBytes(event, msg);
+ callable.call(sentMessage, msg, this);
+ } catch (InstantiationException e) {
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/message/event/send/OteEventMessageResponseFutureImpl.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/message/event/send/OteEventMessageResponseFutureImpl.java
new file mode 100644
index 000000000..128ce15a8
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/message/event/send/OteEventMessageResponseFutureImpl.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.internal.message.event.send;
+
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.message.event.send.OteEventMessageResponseCallable;
+import org.eclipse.osee.ote.message.event.send.OteEventMessageResponseFuture;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventHandler;
+
+
+public class OteEventMessageResponseFutureImpl<R extends OteEventMessage> implements OteEventMessageResponseFuture<R>, EventHandler {
+ private final ServiceRegistration<EventHandler> reg;
+ private final OteEventMessageResponseCallable<R> callable;
+ private final Class<R> recieveClasstype;
+
+ public OteEventMessageResponseFutureImpl(Class<R> recieveClasstype, OteEventMessageResponseCallable<R> callable, String responseTopic) {
+ this.callable = callable;
+ this.recieveClasstype = recieveClasstype;
+ reg = OteEventMessageUtil.subscribe(responseTopic, this);
+ }
+
+ @Override
+ public void handleEvent(Event event) {
+ try {
+ R msg = recieveClasstype.newInstance();
+ OteEventMessageUtil.putBytes(event, msg);
+ callable.call(msg);
+ } catch (InstantiationException e) {
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public void cancel(){
+ dispose();
+ }
+
+ private void dispose(){
+ reg.unregister();
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/message/event/send/TimeoutRunnable.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/message/event/send/TimeoutRunnable.java
new file mode 100644
index 000000000..3681e2cea
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/internal/message/event/send/TimeoutRunnable.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.internal.message.event.send;
+
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.ReentrantLock;
+
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+import org.eclipse.osee.ote.message.event.send.OteEventMessageCallable;
+
+
+public class TimeoutRunnable<T extends OteEventMessage, R extends OteEventMessage> implements Runnable {
+
+ private final ReentrantLock lock;
+ private final Condition condition;
+ private final T sentMessage;
+ private boolean timedOut = false;
+ private final OteEventMessageCallable<T, R> callable;
+ private final OteEventMessageFutureImpl<T, R> oteByteMessageFuture;
+
+ public TimeoutRunnable(ReentrantLock lock, Condition condition, T sentMessage, OteEventMessageCallable<T, R> callable, OteEventMessageFutureImpl<T, R> oteByteMessageFuture) {
+ this.lock = lock;
+ this.condition = condition;
+ this.sentMessage = sentMessage;
+ this.callable = callable;
+ this.oteByteMessageFuture = oteByteMessageFuture;
+ }
+
+ @Override
+ public void run() {
+ lock.lock();
+ try{
+ timedOut = true;
+ try{
+ oteByteMessageFuture.cancel();
+ callable.timeout(sentMessage);
+ } finally {
+ condition.signal();
+ }
+ } finally {
+ lock.unlock();
+ }
+ }
+
+ public boolean isTimedOut(){
+ return timedOut;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/ElementPath.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/ElementPath.java
new file mode 100644
index 000000000..a6247f96d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/ElementPath.java
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message;
+
+import java.io.Serializable;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class ElementPath implements Serializable {
+
+ private static final long serialVersionUID = 4928814252711879251L;
+
+ private final List<Object> elementPath;
+ private String elementPathAsString = null;
+ private final boolean isHeaderElement;
+
+ public static ElementPath decode(String encodedPath) {
+ List<Object> path = new LinkedList<>();
+ String[] components = encodedPath.split("\\+");
+
+ for (String component : components) {
+ try {
+ Integer i = Integer.parseInt(component);
+ path.add(i);
+ } catch (NumberFormatException e) {
+ path.add(component);
+ }
+ }
+
+ return new ElementPath(path);
+ }
+
+ public String getMessageClass() {
+ return elementPath.get(0).toString();
+ }
+
+ public boolean isHeaderElement() {
+ return isHeaderElement;
+ }
+
+ public String getElementName() {
+ return elementPath.get(elementPath.size() - 1).toString();
+ }
+
+ public ElementPath(List<Object> path) {
+ elementPath = path;
+ String string = (String) path.get(1);
+ isHeaderElement = string.startsWith("HEADER(");
+
+ }
+
+ public List<Object> getList() {
+ return elementPath;
+ }
+
+ @Override
+ public String toString() {
+ if (elementPathAsString == null) {
+ StringBuilder sb = new StringBuilder(64);
+ if (isHeaderElement) {
+ String string = (String) elementPath.get(1);
+ String headerName = string.substring(string.indexOf('(') + 1, string.indexOf(')'));
+ sb.append(headerName).append("-HEADER").append('.').append(elementPath.get(2).toString());
+ } else {
+ for (int i = 1; i < elementPath.size(); i++) {
+ Object obj = elementPath.get(i);
+ if (obj instanceof Integer) {
+ sb.delete(sb.length() - 1, sb.length());
+ sb.append('[');
+ sb.append(((Integer) obj).intValue());
+ sb.append(']');
+ } else {
+
+ sb.append(obj.toString());
+ }
+ sb.append('.');
+ }
+ sb.deleteCharAt(sb.length() - 1);
+ }
+ elementPathAsString = sb.toString();
+ }
+ return elementPathAsString;
+ }
+
+ public String encode() {
+
+ StringBuilder buffer = new StringBuilder(256);
+ for (Object component : elementPath) {
+ buffer.append(component.toString());
+ buffer.append('+');
+ }
+ buffer.deleteCharAt(buffer.length() - 1);
+ return buffer.toString();
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IInstrumentationRegistrationListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IInstrumentationRegistrationListener.java
new file mode 100644
index 000000000..4da5002cf
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IInstrumentationRegistrationListener.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import org.eclipse.osee.ote.message.instrumentation.IOInstrumentation;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IInstrumentationRegistrationListener extends Remote {
+ void onRegistered(String name, IOInstrumentation instrumentation) throws RemoteException;
+
+ void onDeregistered(String name) throws RemoteException;
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IMemSourceChangeListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IMemSourceChangeListener.java
new file mode 100644
index 000000000..b1201bb22
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IMemSourceChangeListener.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message;
+
+import org.eclipse.osee.ote.message.enums.DataType;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IMemSourceChangeListener {
+ void onChange(DataType oldtype, DataType newType, Message<?, ?, ?> message);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IMessageDisposeListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IMessageDisposeListener.java
new file mode 100644
index 000000000..2f4a38183
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IMessageDisposeListener.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IMessageDisposeListener {
+ void onPreDispose(Message<?, ?, ?> message);
+
+ void onPostDispose(Message<?, ?, ?> message);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IMessageHeader.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IMessageHeader.java
new file mode 100644
index 000000000..c0988c173
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IMessageHeader.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message;
+
+import org.eclipse.osee.ote.message.elements.Element;
+
+/**
+ * Defines operations for setting and getting the raw bytes that comprise a message header as well as getting the name
+ * of the message that the header is attached to
+ *
+ * @author Ken J. Aguilar
+ */
+public interface IMessageHeader {
+ public String getMessageName();
+
+ public int getHeaderSize();
+
+ /**
+ * Sets the data that backs this header.
+ */
+ // public void copyData(byte[] data);
+ public byte[] getData();
+
+ public Element[] getElements();
+
+ public void setNewBackingBuffer(byte[] data);
+
+ public String toXml();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IMessageSendListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IMessageSendListener.java
new file mode 100644
index 000000000..729ec990e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IMessageSendListener.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message;
+
+import org.eclipse.osee.ote.message.data.MessageData;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IMessageSendListener {
+ void onPreSend(MessageData messageData);
+
+ void onPostSend(MessageData messageData);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IMessageTestContext.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IMessageTestContext.java
new file mode 100644
index 000000000..e4fe42186
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IMessageTestContext.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message;
+
+import org.eclipse.osee.ote.Configuration;
+import org.eclipse.osee.ote.core.framework.command.ITestContext;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IMessageTestContext extends ITestContext {
+ void resetScriptLoader(Configuration configuration, String[] strings) throws Exception;
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IOInstrumentationDB.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IOInstrumentationDB.java
new file mode 100644
index 000000000..5ea7b84f0
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IOInstrumentationDB.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArraySet;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.message.instrumentation.IOInstrumentation;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class IOInstrumentationDB {
+
+ private final Map<String, IOInstrumentation> ioInstrumentation = new ConcurrentHashMap<>();;
+ private final CopyOnWriteArraySet<IInstrumentationRegistrationListener> listeners =
+ new CopyOnWriteArraySet<IInstrumentationRegistrationListener>();
+
+ IOInstrumentationDB() {
+ }
+
+ public IOInstrumentation getIOInstrumentation(String name) {//, IOInstrumentation io){
+ return ioInstrumentation.get(name);
+ }
+
+ public IOInstrumentation registerIOInstrumentation(String name, IOInstrumentation io) {
+ IOInstrumentation old = ioInstrumentation.put(name, io);
+ if (old != io) {
+ notifyRegistration(name, io);
+ }
+ return old;
+ }
+
+ public void unregisterIOInstrumentation(String name) {
+ IOInstrumentation io = ioInstrumentation.remove(name);
+ if (io != null) {
+ notifyDeregistration(name);
+ }
+ }
+
+ public void addRegistrationListener(IInstrumentationRegistrationListener listener) {
+ listeners.add(listener);
+ for (Map.Entry<String, IOInstrumentation> entry : ioInstrumentation.entrySet()) {
+ try {
+ listener.onRegistered(entry.getKey(), entry.getValue());
+ } catch (Exception e) {
+ OseeLog.log(IOInstrumentation.class, Level.SEVERE,
+ "exception notifying listener of IO instrumentation registration", e);
+ }
+ }
+ }
+
+ public void removeRegistrationListener(IInstrumentationRegistrationListener listener) {
+ listeners.remove(listener);
+ }
+
+ private void notifyRegistration(String name, IOInstrumentation io) {
+ for (IInstrumentationRegistrationListener listener : listeners) {
+ try {
+ listener.onRegistered(name, io);
+ } catch (Exception e) {
+ OseeLog.log(IOInstrumentation.class, Level.SEVERE,
+ "exception notifying listener of IO instrumentation registration", e);
+ }
+ }
+ }
+
+ private void notifyDeregistration(String name) {
+ for (IInstrumentationRegistrationListener listener : listeners) {
+ try {
+ listener.onDeregistered(name);
+ } catch (Exception e) {
+ OseeLog.log(IOInstrumentation.class, Level.SEVERE,
+ "exception notifying listener of IO instrumentation de-registration", e);
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IOType.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IOType.java
new file mode 100644
index 000000000..a32ed8bf9
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IOType.java
@@ -0,0 +1,5 @@
+package org.eclipse.osee.ote.message;
+
+public interface IOType {
+ String name();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IOteIO.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IOteIO.java
new file mode 100644
index 000000000..7d6ee9d6c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IOteIO.java
@@ -0,0 +1,18 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IOteIO {
+ void send();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IPreScriptInstantiation.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IPreScriptInstantiation.java
new file mode 100644
index 000000000..11888ad4d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/IPreScriptInstantiation.java
@@ -0,0 +1,18 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IPreScriptInstantiation {
+ void run();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/Message.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/Message.java
new file mode 100644
index 000000000..ed68c72e5
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/Message.java
@@ -0,0 +1,1355 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.logging.Level;
+
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.eclipse.osee.framework.jdk.core.persistence.XmlizableStream;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.jdk.core.util.xml.XMLStreamWriterUtil;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.GCHelper;
+import org.eclipse.osee.ote.core.MethodFormatter;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.testPoint.CheckPoint;
+import org.eclipse.osee.ote.message.condition.ICondition;
+import org.eclipse.osee.ote.message.condition.TransmissionCountCondition;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.Element;
+import org.eclipse.osee.ote.message.elements.MsgWaitResult;
+import org.eclipse.osee.ote.message.elements.RecordElement;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.interfaces.IMessageManager;
+import org.eclipse.osee.ote.message.interfaces.IMessageRequestor;
+import org.eclipse.osee.ote.message.interfaces.IMessageScheduleChangeListener;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+import org.eclipse.osee.ote.message.interfaces.ITestEnvironmentMessageSystemAccessor;
+import org.eclipse.osee.ote.message.listener.IOSEEMessageListener;
+import org.eclipse.osee.ote.message.listener.MessageSystemListener;
+import org.eclipse.osee.ote.message.tool.MessageMode;
+import org.w3c.dom.Document;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public abstract class Message<S extends ITestEnvironmentMessageSystemAccessor, T extends MessageData, U extends Message<S, T, U>> implements Xmlizable, XmlizableStream {
+ private static volatile AtomicLong constructed = new AtomicLong(0);
+ private static volatile AtomicLong finalized = new AtomicLong(0);
+ private final LinkedHashMap<String, Element> elementMap;
+ @JsonProperty
+ private final String name;
+ private final MessageSystemListener listenerHandler;
+ protected final ArrayList<IMessageScheduleChangeListener> schedulingChangeListeners =
+ new ArrayList<IMessageScheduleChangeListener>(10);
+ private boolean destroyed = false;
+
+ private DataType currentMemType;
+ private final Map<DataType, ArrayList<U>> memTypeToMessageMap = new HashMap<>();
+ private final Map<DataType, ArrayList<T>> memToDataMap = new HashMap<>();
+ private final int phase;
+ protected double rate;
+ protected final double defaultRate;
+ private final boolean isScheduledFromStart;
+ private boolean regularUnscheduleCalled = false;
+ private boolean isTurnedOff = false;
+
+ @SuppressWarnings("rawtypes")
+ private IMessageRequestor messageRequestor = null;
+ private static final double doubleTolerance = 0.000001;
+ private final Set<DataType> memTypeActive = new HashSet<>();
+
+ private T defaultMessageData;
+
+ private final List<IMemSourceChangeListener> preMemSourceChangeListeners = new CopyOnWriteArrayList<>();
+ private final List<IMemSourceChangeListener> postMemSourceChangeListeners =
+ new CopyOnWriteArrayList<IMemSourceChangeListener>();
+ private final List<IMessageDisposeListener> preMessageDisposeListeners = new CopyOnWriteArrayList<>();
+ private final List<IMessageDisposeListener> postMessageDisposeListeners = new CopyOnWriteArrayList<>();
+
+ private final int defaultByteSize;
+ private final int defaultOffset;
+
+ protected final MessageSystemListener removableListenerHandler;
+
+ public Message(String name, int defaultByteSize, int defaultOffset, boolean isScheduled, int phase, double rate) {
+ constructed.incrementAndGet();
+ listenerHandler = new MessageSystemListener(this);
+ this.name = name;
+ this.defaultByteSize = defaultByteSize;
+ this.defaultOffset = defaultOffset;
+ elementMap = new LinkedHashMap<>(20);
+ this.phase = phase;
+ this.rate = rate;
+ this.defaultRate = rate;
+ this.isScheduledFromStart = isScheduled;
+ GCHelper.getGCHelper().addRefWatch(this);
+ this.removableListenerHandler = new MessageSystemListener(this);
+ }
+
+ /**
+ * Attemps to remove the specified listener from the list of REMOVABLE listeners. This will NOT remove any listener
+ * added using the addListener() call, only those added using the addRemovableListener() call will be removed.
+ *
+ * @param listener The removable listener to remove
+ */
+ public void removeRemovableListener(IOSEEMessageListener listener) {
+ removableListenerHandler.removeListener(listener);
+ }
+
+ /**
+ * Adds listener to the list of listeners removed at the end of every script.
+ *
+ * @param listener the removable listern to add.
+ */
+ public void addRemovableListener(IOSEEMessageListener listener) {
+ removableListenerHandler.addListener(listener);
+ }
+
+ /**
+ * Removes all the listeners from the RemovableListenerHandler. This method is meant to be called upon script
+ * completion but can be used by anyone. Other listeners can be removed using the traditional removeListener call.
+ */
+ public void clearRemovableListeners() {
+ this.removableListenerHandler.clearListeners();
+
+ }
+
+ public void destroy() {
+
+ notifyPreDestroyListeners();
+ destroyed = true;
+ defaultMessageData.dispose();
+
+ memToDataMap.clear();
+ memTypeToMessageMap.clear();
+ listenerHandler.dispose();
+
+ notifyPostDestroyListeners();
+ schedulingChangeListeners.clear();
+ postMessageDisposeListeners.clear();
+ preMessageDisposeListeners.clear();
+ postMemSourceChangeListeners.clear();
+ preMemSourceChangeListeners.clear();
+ elementMap.clear();
+
+ if (messageRequestor != null) {
+ messageRequestor.dispose();
+ }
+ removableListenerHandler.dispose();
+ }
+
+ private void notifyPostDestroyListeners() {
+ for (IMessageDisposeListener listener : postMessageDisposeListeners) {
+ listener.onPostDispose(this);
+ }
+ }
+
+ private void notifyPreDestroyListeners() {
+ for (IMessageDisposeListener listener : preMessageDisposeListeners) {
+ try {
+ listener.onPreDispose(this);
+ } catch (Exception e) {
+ OseeLog.log(MessageSystemTestEnvironment.class, Level.SEVERE, "exception during listener notification", e);
+ }
+ }
+ }
+
+ public void setData(byte[] data) {
+ checkState();
+ if (data == null) {
+ throw new IllegalArgumentException("data array cannot be null");
+ }
+ for (MessageData msgdata : memToDataMap.get(currentMemType)) {
+ msgdata.setFromByteArray(data);
+ }
+ }
+
+ public void setData(ByteBuffer data, int length) {
+ checkState();
+ if (data == null) {
+ throw new IllegalArgumentException("data array cannot be null");
+ }
+ for (MessageData msgdata : memToDataMap.get(currentMemType)) {
+ msgdata.setFromByteArray(data, length);
+ }
+ }
+
+ public void setData(byte[] data, int length) {
+ checkState();
+ if (data == null) {
+ throw new IllegalArgumentException("data array cannot be null");
+ }
+ for (MessageData msgdata : memToDataMap.get(currentMemType)) {
+ msgdata.setFromByteArray(data, length);
+ }
+ }
+
+ public void setBackingBuffer(byte[] data) {
+ checkState();
+ if (data == null) {
+ throw new IllegalArgumentException("data array cannot be null");
+ }
+ for (MessageData msgdata : memToDataMap.get(currentMemType)) {
+ msgdata.setNewBackingBuffer(data);
+ }
+ }
+
+ public byte[] getData() {
+ checkState();
+ return getActiveDataSource().toByteArray();
+ }
+
+ public T getMemoryResource() {
+ checkState();
+ return memToDataMap.get(currentMemType).get(0);
+ }
+
+ /**
+ * Returns the number of byte words in the payload of this message.
+ *
+ * @return number of bytes in the message payload
+ */
+ public int getPayloadSize() {
+ checkState();
+ return memToDataMap.get(currentMemType).get(0).getPayloadSize();
+ }
+
+ public int getPayloadSize(DataType type) {
+ checkState();
+ return memToDataMap.get(type).get(0).getPayloadSize();
+ }
+
+ /**
+ * Returns the number of byte words in the header of this message.
+ *
+ * @return the number of bytes in the header
+ */
+ public int getHeaderSize() {
+ checkState();
+ final IMessageHeader hdr = memToDataMap.get(currentMemType).get(0).getMsgHeader();
+ if (hdr != null) {
+ return hdr.getHeaderSize();
+ }
+ return 0;
+ }
+
+ public int getHeaderSize(DataType type) {
+ checkState();
+ return memToDataMap.get(type).get(0).getMsgHeader().getHeaderSize();
+ }
+
+ /*
+ * protected static final ThreadLocal current = new ThreadLocal() { protected Object initialValue() { return new
+ * MemMessageHolder(); } };
+ */
+ public void send() throws MessageSystemException {
+ checkState();
+ if (!isTurnedOff) {
+ ArrayList<T> dataList = memToDataMap.get(currentMemType);
+ if (dataList != null) {
+ int listSize = dataList.size();
+ for (int i = 0; i < listSize; i++) {
+ dataList.get(i).send();
+ }
+ } else {
+ throw new MessageSystemException(
+ "Message: " + name + " does not have the physical type " + currentMemType + " available for this environment!!!!!",
+ Level.SEVERE);
+ }
+ }
+ }
+
+ public void addSendListener(IMessageSendListener listener) {
+ getActiveDataSource().addSendListener(listener);
+ }
+
+ public void removeSendListener(IMessageSendListener listener) {
+ getActiveDataSource().removeSendListener(listener);
+ }
+
+ public boolean containsSendListener(IMessageSendListener listener) {
+ return getActiveDataSource().containsSendListener(listener);
+ }
+
+ public void send(DataType type) throws MessageSystemException {
+ checkState();
+ if (!isTurnedOff) {
+ Collection<T> dataList = memToDataMap.get(type);
+ if (dataList != null) {
+
+ for (T data : dataList) {
+ data.send();
+ }
+
+ } else {
+ throw new MessageSystemException(
+ "Message: " + name + " does not have a physical type available for this environment!!!!!", Level.SEVERE);
+ }
+ } else {
+ OseeLog.log(MessageSystemTestEnvironment.class, Level.WARNING,
+ this.getMessageName() + " has attempted a send(), but is currently turned off.");
+ }
+ }
+
+ // we may not really need this guy, in fact I think we don't
+ // protected void takeNextSample() {
+ // for (T item : memToDataMap.get(currentMemType)) {
+ // item.takeNextSample();
+ // }
+ // }
+
+ public boolean setMemSource(S accessor, DataType type) {
+ return setMemSource(type);
+ }
+
+ /**
+ * Associates Messages to MemTypes based on the memType's physical availability
+ */
+ // public abstract void associateMessages(S accessor);
+ /**
+ * Changes the element references for this message to a corresponding message with the given MemType. The messages
+ * defined for this memType must have been provided by the associateMessages function to be seen.
+ *
+ * @param memType the possibly new physical mem type.
+ */
+ public void switchElementAssociation(DataType memType) {
+ checkState();
+ switchElementAssociation(getMessageTypeAssociation(memType));
+ }
+
+ // public abstract void switchElementAssociation(Collection<U> messages);
+
+ public void addMessageTypeAssociation(DataType memType, U messageToBeAdded) {
+ checkState();
+ ArrayList<U> list;
+ if (!memTypeToMessageMap.containsKey(memType)) {
+ list = new ArrayList<>(4);
+ memTypeToMessageMap.put(memType, list);
+ } else {
+ list = memTypeToMessageMap.get(memType);
+ }
+ list.add(messageToBeAdded);
+
+ // addMessageDataSource(messageToBeAdded.defaultMessageData);
+ }
+
+ protected Collection<U> getMessageTypeAssociation(DataType type) {
+ final ArrayList<U> list = memTypeToMessageMap.get(type);
+ if (list != null) {
+ return Collections.unmodifiableCollection(list);
+ } else {
+ return new ArrayList<U>();
+ }
+ }
+
+ public void addMessageDataSource(T... dataList) {
+ checkState();
+ for (T data : dataList) {
+ addMessageDataSource(data);
+ }
+ }
+
+ public void addMessageDataSource(Collection<T> dataList) {
+ for (T data : dataList) {
+ addMessageDataSource(data);
+ }
+ }
+
+ protected void addMessageDataSource(T data) {
+ final DataType type = data.getType();
+ final ArrayList<T> list;
+ if (!memToDataMap.containsKey(type)) {
+ list = new ArrayList<>();
+ memToDataMap.put(type, list);
+ } else {
+ list = memToDataMap.get(type);
+ }
+ list.add(data);
+ data.addMessage(this);
+ }
+
+ public Collection<T> getMemSource(DataType type) {
+ checkState();
+ final ArrayList<T> list = memToDataMap.get(type);
+ if (list != null) {
+ return Collections.unmodifiableCollection(list);
+ } else {
+ return new ArrayList<T>();
+ }
+ }
+
+ public boolean getMemSource(DataType type, Collection<T> listToAddto) {
+ checkState();
+ final ArrayList<T> list = memToDataMap.get(type);
+ if (list != null) {
+ return listToAddto.addAll(list);
+ }
+ return false;
+ }
+
+ public DataType getMemType() {
+ return currentMemType;
+ }
+
+ public void addElement(Element element) {
+ checkState();
+ elementMap.put(element.getName(), element);
+ }
+
+ /**
+ * Gets a list of all the message's data elements.
+ * <br>
+ * This returns ALL the elements, which may not be mapped to the
+ * active data type and/or may be non-mapping elements.
+ *
+ * Use {@link #getElements(DataType)} to get mapped elements
+ *
+ * @return a collection of {@link Element}s
+ */
+ public Collection<Element> getElements() {
+ checkState();
+ return elementMap.values();
+ }
+
+ public void getAllElements(Collection<Element> elements) {
+ checkState();
+ IMessageHeader header = getActiveDataSource().getMsgHeader();
+ if (header != null) {
+ Collections.addAll(elements, header.getElements());
+ }
+ elements.addAll(elementMap.values());
+
+ }
+
+ /**
+ * @return a collection of mapped {@link Element}s for the specified DataType
+ */
+ public Collection<Element> getElements(DataType type) {
+ checkState();
+ LinkedList<Element> list = new LinkedList<>();
+ for (Element element : elementMap.values()) {
+ Element e = element.switchMessages(getMessageTypeAssociation(type));
+ if (!e.isNonMappingElement()) {
+ list.add(e);
+ }
+ }
+ return list;
+ }
+
+ /**
+ * @return true if the Message contains an element with the given name, false otherwise
+ */
+ public boolean hasElement(String elementName) {
+ checkState();
+ return elementMap.containsKey(elementName);
+ }
+
+ /**
+ * @return HashMap<String, Element>
+ */
+ public HashMap<String, Element> getElementMap() {
+ checkState();
+ return elementMap;
+ }
+
+ /**
+ * @param elementName the name of the element as defined in the message ( All caps ).
+ * @return the element associated with the given name
+ * @throws IllegalArgumentException if an element doesn't exist with given name. Use {@link #hasElement(String)} with
+ * any use of this function.
+ */
+ public Element getElement(String elementName) {
+ return getElement(elementName, currentMemType);
+ }
+
+ public <E extends Element> E getElement(String elementName, Class<E> clazz) {
+ checkState();
+ return clazz.cast(getElement(elementName, currentMemType));
+ }
+
+ public boolean hasElement(List<Object> elementPath) {
+ return getElement(elementPath) != null;
+ }
+
+ public Element getElement(List<Object> elementPath) {
+ checkState();
+ Element el = null;
+ RecordElement rel = null;
+ if (elementPath.size() == 1) {
+ el = elementMap.get(elementPath.get(0));
+ } else {
+ String string = (String) elementPath.get(1);
+ if (string.startsWith("HEADER(")) {
+ Element[] elements = getActiveDataSource(currentMemType).getMsgHeader().getElements();
+ for (Element element : elements) {
+ if (element.getName().equals(elementPath.get(2))) {
+ return element;
+ }
+ }
+ return null;
+ } else {
+ el = this.elementMap.get(string);
+ if (el instanceof RecordElement) {
+ rel = (RecordElement) el;
+ }
+ }
+ for (int i = 2; i < elementPath.size(); i++) {
+ if (elementPath.get(i) instanceof String) {
+ String name = (String) elementPath.get(i);
+ el = rel.getElementMap().get(name);
+ if (el instanceof RecordElement) {
+ rel = (RecordElement) el;
+ }
+ } else if (elementPath.get(i) instanceof Integer) {
+ Integer index = (Integer) elementPath.get(i);
+ rel = rel.get(index);
+ el = rel;
+ }
+ }
+ }
+ return el;
+ }
+
+ public Element getElement(List<Object> elementPath, DataType type) {
+ Element element = getElement(elementPath);
+ if (element == null) {
+ return null;
+ }
+ return element.switchMessages(this.getMessageTypeAssociation(type));
+ }
+
+ /**
+ * @return the element associated with the given name
+ * @throws IllegalArgumentException if an element doesn't exist with given name. Use {@link #hasElement(String)} with
+ * any use of this function.
+ */
+ public Element getElement(String elementName, DataType type) {
+ checkState();
+ Element retVal = elementMap.get(elementName);
+ if (retVal != null) {
+ return retVal.switchMessages(this.getMessageTypeAssociation(type));
+ }
+ return null;
+
+ }
+
+ public Element getBodyOrHeaderElement(String elementName) {
+ return getBodyOrHeaderElement(elementName, currentMemType);
+ }
+
+ public Element getBodyOrHeaderElement(String elementName, DataType type) {
+ checkState();
+ Element e = elementMap.get(elementName);
+ if (e == null) {
+ Element[] elements = getActiveDataSource(type).getMsgHeader().getElements();
+ for (Element element : elements) {
+ if (element.getName().equals(elementName)) {
+ return element;
+ }
+ }
+ } else {
+ e = e.switchMessages(this.getMessageTypeAssociation(type));
+ }
+ return e;
+ }
+
+ /**
+ * Turning off a message causes sends to be short-circuited and the message to be unscheduled.
+ */
+ public void turnOff() {
+ checkState();
+ isTurnedOff = true;
+ unschedule();
+ }
+
+ /**
+ * Turning on message allows sends to work again & reschedules message if that is the default state defined by the
+ * message constructor call.
+ */
+ public void turnOn() {
+ checkState();
+ isTurnedOff = false;
+ if (isScheduledFromStart()) {
+ schedule();
+ }
+ }
+
+ /**
+ * This is the turnOn being called from the method register in MessageCollection. Messages shouldn't be scheduled at
+ * this point b/c the control message hasn't gone out yet. Messages can't go out until the control message goes out
+ * the first time so that collisions in the box are avoided.
+ */
+ public void whenBeingRegisteredTurnOn() {
+ isTurnedOff = false;
+ }
+
+ /**
+ * Returns if the message is turned off.
+ */
+ public boolean isTurnedOff() {
+ return isTurnedOff;
+ }
+
+ private void setSchedule(boolean newValue) {
+ ArrayList<T> dataList = memToDataMap.get(currentMemType);
+ for (T d : dataList) {
+ d.setScheduled(newValue);
+ }
+ }
+
+ /**
+ * This method schedules the message. There is also some code that allows the scheduled state to be updated in
+ * Message Watch.
+ */
+ public void schedule() {
+ checkState();
+ if (!isTurnedOff) {
+ setSchedule(true);
+ regularUnscheduleCalled = false;
+ for (IMessageScheduleChangeListener listener : schedulingChangeListeners) {
+ listener.isScheduledChanged(true);
+ }
+ }
+ }
+
+ /**
+ * This method unschedules the message. The variable regularUnscheduledCalled is used to preserve unschedules that
+ * are called in constructors, which is before the control message goes out for the first time.
+ */
+ public void unschedule() {
+ checkState();
+ setSchedule(false);
+ regularUnscheduleCalled = true;
+ for (IMessageScheduleChangeListener listener : schedulingChangeListeners) {
+ listener.isScheduledChanged(false);
+ }
+ }
+
+ /**
+ * Returns if the message is scheduled or not.
+ */
+ @Deprecated
+ public boolean isScheduled() {
+ ArrayList<T> dataList = memToDataMap.get(currentMemType);
+ for (T d : dataList) {
+ if (!d.isScheduled()) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * This is called at the end of a script run to reset the "hard" unschedule variable that is used to preserve
+ * unschedules called in constructors.
+ */
+ public void resetScheduling() {
+ regularUnscheduleCalled = false;
+
+ }
+
+ /**
+ * @return - double - rate of message
+ */
+ public double getRate() {
+ return rate;
+ }
+
+ /**
+ * @return - int - phase of message
+ */
+ public int getPhase() {
+ return phase;
+ }
+
+ public MessageSystemListener getListener() {
+ return listenerHandler;
+ }
+
+ public MessageSystemListener getRemoveableListener() {
+ return removableListenerHandler;
+ }
+
+ public void setListenerTrace(MessageListenerTrace listener) {
+ if(listenerHandler != null){
+ listenerHandler.setMessageListenerTrace(this, listener);
+ }
+ }
+
+ public MessageListenerTrace clearListenerTrace() {
+ if(listenerHandler != null){
+ return listenerHandler.clearListenerTrace(this);
+ }
+ return null;
+ }
+
+ public void addListener(IOSEEMessageListener listener) {
+ listenerHandler.addListener(listener);
+ }
+
+ public boolean removeListener(IOSEEMessageListener listener) {
+ return listenerHandler.removeListener(listener);
+ }
+
+ /**
+ * Notifies all registered listeners of an update.
+ * <P>
+ * <B>NOTE: </B>Should only be called from sub classes of {@link MessageData}
+ *
+ * @param data the Message Data object that has been updated
+ * @param type the memtype of the message data object
+ */
+ public void notifyListeners(final MessageData data, final DataType type) {
+ checkState();
+ this.listenerHandler.onDataAvailable(data, type);
+ this.removableListenerHandler.onDataAvailable(data, type);
+ }
+
+ /*
+ * public HashMap getTypeToMessageData(){ return typeToMessageData; }
+ */
+ /**
+ * @return Returns the name.
+ */
+ public String getName() {
+ return name;
+ }
+
+ private static final int TransmissionTimeoutDefault = 15000;
+
+ @Override
+ public String toString() {
+ return name;
+ }
+
+ /**
+ * @return Returns the messageName.
+ */
+ public String getMessageName() {
+ return name;
+ }
+
+ @Override
+ public org.w3c.dom.Element toXml(Document doc) {
+ org.w3c.dom.Element rootElement = doc.createElement("Message");
+ rootElement.appendChild(Jaxp.createElement(doc, "Name", name));
+ rootElement.appendChild(Jaxp.createElement(doc, "Type", getMemType().name()));
+ return rootElement;
+ }
+
+ @Override
+ public void toXml(XMLStreamWriter writer) throws XMLStreamException {
+ writer.writeStartElement("Message");
+ XMLStreamWriterUtil.writeElement(writer, "Name", name);
+ XMLStreamWriterUtil.writeElement(writer, "Type", getMemType().name());
+ writer.writeEndElement();
+ }
+
+ @JsonProperty
+ public String getType() {
+ return getMemType().name();
+ }
+
+ public void zeroize() {
+ checkState();
+ for (DataType memType : memToDataMap.keySet()) {
+ for (Element el : getElements(memType)) {
+ el.zeroize();
+ }
+ }
+ }
+
+ /**
+ * Verifies that the message is sent at least once using the default message timeout. DO NOT override this method in
+ * production code.
+ *
+ * @return if the check passed
+ */
+ public boolean checkForTransmission(ITestAccessor accessor) throws InterruptedException {
+ return checkForTransmission(accessor, TransmissionTimeoutDefault);
+ }
+
+ /**
+ * Verifies that the message is sent at least once within the time specified. DO NOT override this method in
+ * production code.
+ *
+ * @param milliseconds the amount to time (in milliseconds) to allow
+ * @return if the check passed
+ */
+ public boolean checkForTransmission(ITestAccessor accessor, int milliseconds) throws InterruptedException {
+ return checkForTransmissions(accessor, 1, milliseconds);
+ }
+
+ /**
+ * Verifies that the message is sent at least "numTransmission" times within the default message timeout. DO NOT
+ * override this method in production code.
+ *
+ * @param numTransmissions the number of transmissions to look for
+ * @return if the check passed
+ */
+ public boolean checkForTransmissions(ITestAccessor accessor, int numTransmissions) throws InterruptedException {
+ return checkForTransmissions(accessor, numTransmissions, TransmissionTimeoutDefault);
+ }
+
+ /**
+ * Verifies that the message is sent at least "numTransmission" times within the time specified.
+ *
+ * @param numTransmissions the number of transmission to look for
+ * @param milliseconds the amount to time (in milliseconds) to allow
+ * @return if the check passed
+ */
+ public boolean checkForTransmissions(ITestAccessor accessor, int numTransmissions, int milliseconds) throws InterruptedException {
+ checkState();
+ accessor.getLogger().methodCalledOnObject(accessor, getMessageName(),
+ new MethodFormatter().add(numTransmissions).add(milliseconds));
+ TransmissionCountCondition c = new TransmissionCountCondition(numTransmissions);
+ MsgWaitResult result = waitForCondition(accessor, c, false, milliseconds);
+ CheckPoint passFail =
+ new CheckPoint(this.name, Integer.toString(numTransmissions), Integer.toString(result.getXmitCount()),
+ result.isPassed(), result.getXmitCount(), result.getElapsedTime());
+ accessor.getLogger().testpoint(accessor, accessor.getTestScript(), accessor.getTestCase(), passFail);
+ accessor.getLogger().methodEnded(accessor);
+ return passFail.isPass();
+ }
+
+ /**
+ * Verifies that the message is not sent within the time specified.
+ *
+ * @param milliseconds the amount to time (in milliseconds) to check
+ * @return if the check passed
+ */
+ public boolean checkForNoTransmissions(ITestEnvironmentMessageSystemAccessor accessor, int milliseconds) throws InterruptedException {
+ checkState();
+ if (accessor == null) {
+ throw new IllegalArgumentException("accessor cannot be null");
+ }
+ accessor.getLogger().methodCalledOnObject(accessor, getMessageName(), new MethodFormatter().add(milliseconds),
+ this);
+ long time = accessor.getEnvTime();
+ org.eclipse.osee.ote.core.environment.interfaces.ICancelTimer cancelTimer =
+ accessor.setTimerFor(listenerHandler, milliseconds);
+
+ boolean result;
+ listenerHandler.waitForData(); // will also return if the timer (set above)
+ // expires
+
+ result = listenerHandler.isTimedOut();
+
+ cancelTimer.cancelTimer();
+ time = accessor.getEnvTime() - time;
+
+ accessor.getLogger().testpoint(
+ accessor,
+ accessor.getTestScript(),
+ accessor.getTestScript().getTestCase(),
+ new CheckPoint(this.getMessageName(), "No Transmissions",
+ result ? "No Transmissions" : "Transmissions Occurred", result, time));
+ if (accessor != null) {
+ accessor.getLogger().methodEnded(accessor);
+ }
+ return result;
+ }
+
+ /**
+ * Waits until message is sent at least once within the default message timeout.
+ *
+ * @return if the check passed
+ */
+ public boolean waitForTransmission(ITestEnvironmentMessageSystemAccessor accessor) throws InterruptedException {
+ return waitForTransmission(accessor, TransmissionTimeoutDefault);
+ }
+
+ /**
+ * Waits until message is sent at least once within the time specified.
+ *
+ * @param milliseconds the amount to time (in milliseconds) to allow
+ * @return if the check passed
+ */
+ public boolean waitForTransmission(ITestEnvironmentMessageSystemAccessor accessor, int milliseconds) throws InterruptedException {
+ return waitForTransmissions(accessor, 1, milliseconds);
+ }
+
+ /**
+ * Waits until message is sent at least "numTransmission" times within the default message timeout.
+ *
+ * @param numTransmissions the number of transmissions to look for
+ * @return if the check passed
+ */
+ public boolean waitForTransmissions(ITestEnvironmentMessageSystemAccessor accessor, int numTransmissions) throws InterruptedException {
+ return waitForTransmissions(accessor, numTransmissions, TransmissionTimeoutDefault);
+ }
+
+ /**
+ * Waits until message is sent at least "numTransmission" times within the time specified.
+ *
+ * @param milliseconds the amount to time (in milliseconds) to allow
+ * @return if the check passed
+ */
+ public boolean waitForTransmissions(ITestEnvironmentMessageSystemAccessor accessor, int numTransmissions, int milliseconds) throws InterruptedException {
+ checkState();
+ accessor.getLogger().methodCalledOnObject(accessor, getMessageName(),
+ new MethodFormatter().add(numTransmissions).add(milliseconds), this);
+ boolean pass = waitForTransmissionsNoLog(accessor, numTransmissions, milliseconds);
+ accessor.getLogger().methodEnded(accessor);
+ return pass;
+ }
+
+ public boolean waitForTransmissionsNoLog(ITestEnvironmentMessageSystemAccessor accessor, int numTransmissions, int milliseconds) throws InterruptedException {
+ checkState();
+ if (accessor == null) {
+ throw new IllegalArgumentException("environment accessor parameter cannot be null");
+ }
+ TransmissionCountCondition c = new TransmissionCountCondition(numTransmissions);
+ MsgWaitResult result = waitForCondition(accessor, c, false, milliseconds);
+ return result.isPassed();
+ }
+
+ public MsgWaitResult waitForCondition(ITestEnvironmentAccessor accessor, ICondition condition, boolean maintain, int milliseconds) throws InterruptedException {
+ checkState();
+ return listenerHandler.waitForCondition(accessor, condition, maintain, milliseconds);
+ }
+
+ /**
+ * @return Returns size value.
+ */
+ public int getMaxDataSize() {
+ checkState();
+ return getMaxDataSize(currentMemType);
+ }
+
+ public int getMaxDataSize(DataType type) {
+ checkState();
+ int size = 0;
+ for (MessageData msgData : memToDataMap.get(type)) {
+ if (msgData != null && msgData.getPayloadSize() > size) {
+ size = msgData.getPayloadSize();
+ }
+ }
+ return size;
+ }
+
+ /*
+ * @Override public boolean equals(Object obj) { return this.getClass().equals(obj.getClass()); }
+ */
+
+ /*
+ * @Override public int hashCode() { return getClass().hashCode(); }
+ */
+
+ /**
+ * returns a {@link MessageState} object that represents this message's state. The state is intended to be used in
+ * synchronizing a remote instance of this message
+ *
+ * @return Returns MessageState object reference.
+ */
+ public MessageState getMessageState() {
+ checkState();
+ MessageMode mode = isWriter() ? MessageMode.WRITER : MessageMode.READER;
+ return new MessageState(currentMemType, getData(), memToDataMap.keySet(), mode);
+ }
+
+ /**
+ * restores the state of this message. The state is intended to come from a remote instance of this message.
+ */
+ public void setMessageState(final MessageState state) {
+ checkState();
+ setMemSource(state.getCurrentMemType());
+ setData(state.getData());
+ }
+
+ public void addSchedulingChangeListener(IMessageScheduleChangeListener listener) {
+ checkState();
+ schedulingChangeListeners.add(listener);
+ }
+
+ public void removeSchedulingChangeListener(IMessageScheduleChangeListener listener) {
+ checkState();
+ schedulingChangeListeners.remove(listener);
+ }
+
+ public T getActiveDataSource() {
+ checkState();
+ ArrayList<T> dataList = memToDataMap.get(currentMemType);
+ if (dataList == null) {
+ throw new IllegalStateException("no datas for " + currentMemType);
+ }
+ return dataList.get(0);
+ }
+
+ public T getActiveDataSource(DataType type) {
+ checkState();
+ ArrayList<T> dataList = memToDataMap.get(type);
+ return dataList != null ? dataList.get(0) : null;
+ }
+
+ public void addElements(Element... elements) {
+ checkState();
+ for (Element element : elements) {
+ elementMap.put(element.getElementName(), element);
+ element.addPath(this.getClass().getName());
+ }
+ }
+
+ public int getBitOffset() {
+ return 0;
+ }
+
+ /**
+ * @param currentMemType the currentMemType to set
+ */
+ protected void setCurrentMemType(DataType currentMemType) {
+ checkState();
+ this.currentMemType = currentMemType;
+ }
+
+ public boolean setMemSource(DataType type) {
+ checkState();
+ DataType oldMemType = getMemType();
+ notifyPreMemSourceChangeListeners(oldMemType, type, this);
+ this.switchElementAssociation(type);
+ setCurrentMemType(type);
+ notifyPostMemSourceChangeListeners(oldMemType, type, this);
+ return true;
+ }
+
+ public boolean activateMemSource(DataType type) {
+ checkState();
+ DataType oldMemType = getMemType();
+ notifyPreMemSourceChangeListeners(oldMemType, type, this);
+ // this.switchElementAssociation(type);
+ // setCurrentMemType(type);
+ notifyPostMemSourceChangeListeners(oldMemType, type, this);
+ return true;
+ }
+
+ private void notifyPostMemSourceChangeListeners(DataType old, DataType newtype, Message message) {
+ checkState();
+ for (IMemSourceChangeListener listener : postMemSourceChangeListeners) {
+ try {
+ listener.onChange(old, newtype, message);
+ } catch (Exception e) {
+ OseeLog.log(MessageSystemTestEnvironment.class, Level.SEVERE, e);
+ }
+ }
+ }
+
+ private void notifyPreMemSourceChangeListeners(DataType old, DataType newtype, Message message) {
+ checkState();
+ for (IMemSourceChangeListener listener : preMemSourceChangeListeners) {
+ listener.onChange(old, newtype, message);
+ }
+ }
+
+ public void addPreMemSourceChangeListener(IMemSourceChangeListener listener) {
+ checkState();
+ preMemSourceChangeListeners.add(listener);
+ }
+
+ public void addPostMemSourceChangeListener(IMemSourceChangeListener listener) {
+ checkState();
+ postMemSourceChangeListeners.add(listener);
+ }
+
+ public void removePreMemSourceChangeListener(IMemSourceChangeListener listener) {
+ checkState();
+ preMemSourceChangeListeners.remove(listener);
+ }
+
+ public void removePostMemSourceChangeListener(IMemSourceChangeListener listener) {
+ checkState();
+ postMemSourceChangeListeners.remove(listener);
+ }
+
+ public void addPreMessageDisposeListener(IMessageDisposeListener listener) {
+ checkState();
+ preMessageDisposeListeners.add(listener);
+ }
+
+ public void removePreMessageDisposeListener(IMessageDisposeListener listener) {
+ checkState();
+ preMessageDisposeListeners.remove(listener);
+ }
+
+ public void addPostMessageDisposeListener(IMessageDisposeListener listener) {
+ checkState();
+ postMessageDisposeListeners.add(listener);
+ }
+
+ /**
+ * @return the memToDataMap
+ */
+ public Collection<ArrayList<T>> getAllData() {
+ checkState();
+ return memToDataMap.values();
+ }
+
+ public Set<DataType> getAvailableMemTypes() {
+ checkState();
+ return memToDataMap.keySet();
+ }
+
+ public Collection<T> getMessageData(DataType type) {
+ checkState();
+ return memToDataMap.get(type);
+ }
+
+ public String getTypeName() {
+ return getName();
+ }
+
+ /**
+ * This variable reflects whether a message is defined to start out being scheduled.
+ *
+ * @return Returns the isScheduledFromStart.
+ */
+ public boolean isScheduledFromStart() {
+ return isScheduledFromStart;
+ }
+
+ /**
+ * This variable reflects whether unsubscribe has been called on the message. The main purpose of this is to preserve
+ * if an unschedule is called on a message from a constructor.
+ *
+ * @return Returns the regularUnscheduleCalled.
+ */
+ public boolean isRegularUnscheduleCalled() {
+ return regularUnscheduleCalled;
+ }
+
+ /**
+ * @return the defaultMessageData
+ */
+ public T getDefaultMessageData() {
+ checkState();
+ return defaultMessageData;
+ }
+
+ /**
+ * @param defaultMessageData the defaultMessageData to set
+ */
+ @SuppressWarnings("unchecked")
+ protected void setDefaultMessageData(T defaultMessageData) {
+ checkState();
+ this.defaultMessageData = defaultMessageData;
+ addMessageDataSource(defaultMessageData);
+ addMessageTypeAssociation(defaultMessageData.getType(), (U) this);
+ }
+
+ public boolean isWriter() {
+ checkState();
+ return defaultMessageData.isWriter();
+ }
+
+ public void setMemTypeActive(DataType type) {
+ checkState();
+ memTypeActive.add(type);
+ notifyPostMemSourceChangeListeners(currentMemType, currentMemType, this);
+ }
+
+ public void setMemTypeInactive(DataType type) {
+ checkState();
+ memTypeActive.add(type);
+ notifyPostMemSourceChangeListeners(currentMemType, currentMemType, this);
+ }
+
+ public boolean isMemTypeActive(DataType type) {
+ checkState();
+ return memTypeActive.contains(type);
+ }
+
+ protected void checkState() throws IllegalStateException {
+ if (isDestroyed()) {
+ throw new IllegalStateException(getName() + " is destroyed");
+ }
+ }
+
+ public boolean isDestroyed() {
+ return destroyed;
+ }
+
+ @Override
+ protected void finalize() throws Throwable {
+ finalized.incrementAndGet();
+ super.finalize();
+ }
+
+ public static long getConstructed() {
+ return constructed.get();
+ }
+
+ public static long getFinalized() {
+ return finalized.get();
+ }
+
+ public boolean isValidElement(Element currentElement, Element proposedElement) {
+ return true;
+ }
+
+ public IMessageHeader[] getHeaders() {
+ final Collection<T> dataSources = getMemSource(getMemType());
+ if (dataSources.size() > 0) {
+ final IMessageHeader[] headers = new IMessageHeader[dataSources.size()];
+ int i = 0;
+ for (T dataSrc : dataSources) {
+ headers[i] = dataSrc.getMsgHeader();
+ i++;
+ }
+ return headers;
+ } else {
+ return new IMessageHeader[0];
+ }
+ }
+
+ public long getActivityCount() {
+ return getActiveDataSource().getActivityCount();
+ }
+
+ public long getSentCount() {
+ return getActiveDataSource().getSentCount();
+ }
+
+ public void setActivityCount(long activityCount) {
+ getActiveDataSource().setActivityCount(activityCount);
+ }
+
+ public void switchElementAssociation(Collection<U> messages) {
+ }
+
+ @SuppressWarnings("rawtypes")
+ public Map<? extends DataType, Class<? extends Message>[]> getAssociatedMessages() {
+ return new HashMap<DataType, Class<? extends Message>[]>();
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ public void postCreateMessageSetup(IMessageManager messageManager, MessageData data) throws Exception {
+ Map<? extends DataType, Class<? extends Message>[]> o = getAssociatedMessages();
+ messageRequestor = messageManager.createMessageRequestor(getName());
+ for (Entry<? extends DataType, Class<? extends Message>[]> entry : o.entrySet()) {
+ if (messageManager.isPhysicalTypeAvailable(entry.getKey())) {
+ for (Class<? extends Message> clazz : entry.getValue()) {
+ final Message message;
+ if (data.isWriter()) {
+ message = messageRequestor.getMessageWriter(clazz);
+ } else {
+ message = messageRequestor.getMessageReader(clazz);
+ }
+ this.addMessageDataSource((T) message.getDefaultMessageData());
+ this.addMessageTypeAssociation(entry.getKey(), (U) message);
+ setMemSource(entry.getKey());
+ }
+ }
+ }
+ }
+
+ /**
+ * Changes the rate a message is being published at. NOTE: This is only going to be allowed to be used on periodic
+ * message & users are not allowed to set rate to zero.
+ *
+ * @param newRate - hz
+ */
+ public void changeRate(double newRate) {
+ if (Math.abs(newRate - 0.0) < doubleTolerance) { //newRate == 0.0
+ throw new IllegalArgumentException(
+ "Cannot change message rate to zero (" + getName() + ")!\n\tUse unschedule() to do that!");
+ }
+ if (Math.abs(newRate - rate) > doubleTolerance) { //newRate != rate
+ // accessor.getMsgManager().changeMessageRate(this, newRate, rate);
+ double oldRate = rate;
+ rate = newRate;
+ for (IMessageScheduleChangeListener listener : schedulingChangeListeners) {
+ listener.onRateChanged(this, oldRate, newRate);
+ }
+ }
+ }
+
+ /**
+ * Changes the rate back to the default rate.
+ */
+ public void changeRateToDefault(ITestEnvironmentMessageSystemAccessor accessor) {
+ // accessor.getMsgManager().changeMessageRate(this, defaultRate, rate);
+ double oldRate = getRate();
+ rate = defaultRate;
+ for (IMessageScheduleChangeListener listener : schedulingChangeListeners) {
+ listener.onRateChanged(this, oldRate, defaultRate);
+ }
+ }
+
+ public void sendWithLog(ITestAccessor accessor) {
+ if (accessor != null) {
+ accessor.getLogger().methodCalledOnObject(accessor, getMessageName(), new MethodFormatter(), this);
+ }
+ send();
+ if (accessor != null) {
+ accessor.getLogger().methodEnded(accessor);
+ }
+ }
+
+ public int getDefaultByteSize() {
+ return defaultByteSize;
+ }
+
+ public int getDefaultOffset() {
+ return defaultOffset;
+ }
+
+ public Element getElementByPath(ElementPath path) {
+ return getElementByPath(path, currentMemType);
+ }
+
+ public Element getElementByPath(ElementPath path, DataType type) {
+ if (path.isHeaderElement()) {
+ Element[] elements = getActiveDataSource(type).getMsgHeader().getElements();
+ for (Element element : elements) {
+ if (element.getName().equals(path.getElementName())) {
+ return element;
+ }
+ }
+ return null;
+ }
+ return getElement(path.getList(), type);
+ }
+
+ public ListIterator<Element> getElementIterator() {
+ ArrayList<Element> list = new ArrayList<>(elementMap.values());
+ return list.listIterator();
+ }
+
+ public ListIterator<Element> getElementIterator(Element elemnt) {
+ ArrayList<Element> list = new ArrayList<>(elementMap.values());
+ int index = list.indexOf(elemnt);
+ if (index >= 0) {
+ return list.listIterator(index);
+ }
+ return null;
+ }
+
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageDefinitionProvider.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageDefinitionProvider.java
new file mode 100644
index 000000000..088b6cf77
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageDefinitionProvider.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message;
+
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface MessageDefinitionProvider {
+
+ /**
+ * This function returns an ID that is intended to be unique to the running system. The system should not allow more
+ * than one active instance of a service with the same singletonId.
+ */
+ String singletonId();
+
+ String majorVersion();
+
+ String minorVersion();
+
+ void generateMessageIndex(MessageSink sink) throws Exception;
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageEventLogger.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageEventLogger.java
new file mode 100644
index 000000000..e9525a2b1
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageEventLogger.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message;
+
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.message.enums.DataType;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class MessageEventLogger implements UniversalMessageListener {
+ private static final class StackTrace extends RuntimeException {
+ private static final long serialVersionUID = 6805422596135323489L;
+
+ public StackTrace() {
+ super("Event stack trace");
+ }
+ }
+
+ private final Message message;
+ private final String modeStatus;
+
+ private volatile boolean showStackTrace = false;
+
+ public MessageEventLogger(Message message) {
+ this(message, false);
+ }
+
+ /**
+ * @return the message
+ */
+ public Message getMessage() {
+ return message;
+ }
+
+ /**
+ * Creates a message event logger that also prints a stack trace when the event is fired
+ */
+ public MessageEventLogger(Message message, boolean showStackTrace) {
+ this.message = message;
+ modeStatus = message.isWriter() ? "wirter " : "reader";
+ message.addPostMemSourceChangeListener(this);
+ message.addPostMessageDisposeListener(this);
+ message.addPreMessageDisposeListener(this);
+ message.addSchedulingChangeListener(this);
+ this.showStackTrace = showStackTrace;
+ }
+
+ @Override
+ public void onChange(DataType oldtype, DataType newType, Message message) {
+ log(Level.INFO, String.format("MemType for %s %s has changed from %s to %s", message.getName(), modeStatus,
+ oldtype.name(), newType.name()), showStackTrace ? new StackTrace() : null);
+ }
+
+ @Override
+ public void onPostDispose(Message message) {
+ log(Level.INFO, String.format("%s %s has been disposed", message.getName(), modeStatus),
+ showStackTrace ? new StackTrace() : null);
+ }
+
+ @Override
+ public void onPreDispose(Message message) {
+ log(Level.INFO, String.format("%s %s is about to be disposed", message.getName(), modeStatus),
+ showStackTrace ? new StackTrace() : null);
+ }
+
+ @Override
+ public void isScheduledChanged(boolean isScheduled) {
+ log(Level.INFO, String.format("schedule status for %s has changed to %s. Env time is %d", message.getName(),
+ modeStatus, isScheduled ? "scheduled" : "not scheduled"), showStackTrace ? new StackTrace() : null);
+ }
+
+ @Override
+ public void onRateChanged(Message message, double oldRate, double newRate) {
+ log(Level.INFO,
+ String.format("rate for %s %s change from %f to %f", message.getName(), modeStatus, oldRate, newRate),
+ showStackTrace ? new StackTrace() : null);
+ }
+
+ protected void log(Level level, String message) {
+ OseeLog.log(MessageSystemTestEnvironment.class, level, message);
+ }
+
+ protected void log(Level level, String message, StackTrace stackTrace) {
+ OseeLog.log(MessageSystemTestEnvironment.class, level, message, stackTrace);
+ }
+
+ protected StackTraceElement[] getStackTrace() {
+ return new Exception().getStackTrace();
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageListenerTrace.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageListenerTrace.java
new file mode 100644
index 000000000..164025b72
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageListenerTrace.java
@@ -0,0 +1,232 @@
+package org.eclipse.osee.ote.message;
+
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.listener.IOSEEMessageListener;
+
+/**
+ * The {@code MessageListenerTrace} class will time the listeners of a message. Only one can be set on a message at a time.
+ * <pre>
+ * This is measuring the timing of events that are occurring in the
+ * {@link org.eclipse.osee.ote.message.listener.MessageSystemListener#onDataAvailable(MessageData, DataType) MessageSystemListener.onDataAvailable()}
+ * The ALL will measure the time from when the preNotify to the postNotify.
+ * The other one will measure the time from right before the inner onDataAvailable is called to right after.
+ *
+ * <pre>
+ * {@code
+ * MessageListenerTrace trace = new MessageListenerTrace(TimeUnit.NANOSECONDS, testMessage, logger);
+ * trace.start();
+ * //wait or do stuff
+ * trace.stop();
+ * trace.printResults();
+ * }
+ * </pre>
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class MessageListenerTrace extends MessageTimeTrace {
+
+ public final String TRACE_TYPE = "MessageListenerTrace";
+ private int maxAllListenerTime = Integer.MAX_VALUE;
+ private int maxListenerTime = Integer.MAX_VALUE;
+ private int listenerWaitTimeMs;
+
+ private MessageTraceOutput messageTraceOutput;
+ private MessageTraceOutput messageTraceOutputAll;
+ private MessageTraceLogger messageTraceLogger;
+
+ /**
+ * @param environment - the test environment.
+ * @param timeUnit - determines the resolution of the timing that is measured.
+ * @param message - the message to measure
+ * @param messageTraceLogger - logger to write output
+ */
+ @SuppressWarnings("rawtypes")
+ public MessageListenerTrace(ITestEnvironmentAccessor environment, TimeUnit timeUnit, Message message, MessageTraceLogger messageTraceLogger) {
+ super(environment, message, timeUnit);
+ this.messageTraceOutput = new MessageTraceOutput();
+ this.messageTraceOutputAll = new MessageTraceOutput();
+ this.messageTraceLogger = messageTraceLogger;
+ }
+
+ public void setMaxAllListeners(int time){
+ maxAllListenerTime = time;
+ }
+
+ public void setMaxListeners(int time){
+ maxListenerTime = time;
+ }
+
+ @Override
+ public void start(){
+ super.start();
+ getMessage().setListenerTrace(this);
+ }
+
+ @Override
+ public void stop(){
+ super.stop();
+ getMessage().clearListenerTrace();
+ }
+
+ public void setListenerWaitTimeMs(int listenerWaitTimeMs) {
+ this.listenerWaitTimeMs = listenerWaitTimeMs;
+ }
+
+ @Override
+ public synchronized void printResults(){
+ List<TimeEvent> events = get();
+ int allCount = 0;
+ int allexceedanceCount = 0;
+ double allaverage = 0.0;
+ double allmax = -1.0;
+ double allmin = -1.0;
+
+ int count = 0;
+ int exceedanceCount = 0;
+ double average = 0.0;
+ double max = -1.0;
+ double min = -1.0;
+
+ ListenerEvent preNotify = null;
+ ListenerEvent postNotify = null;
+ ListenerEvent preListener = null;
+ ListenerEvent postListener = null;
+
+ for(TimeEvent event:events){
+ if(event instanceof ListenerEvent){
+ ListenerEvent sendEvent = (ListenerEvent)event;
+ if(sendEvent.type == ListenerEventType.startNotify){
+ preNotify = sendEvent;
+ } else if (sendEvent.type == ListenerEventType.endNotify) {
+ postNotify = sendEvent;
+ } else if (sendEvent.type == ListenerEventType.startListener){
+ preListener = sendEvent;
+ } else if (sendEvent.type == ListenerEventType.endListener){
+ postListener = sendEvent;
+ }
+ }
+ if(preNotify != null && postNotify != null){
+ long nanoDiff = postNotify.getNanoTime() - preNotify.getNanoTime();
+ preNotify = null;
+ postNotify = null;
+ allCount++;
+ long currentTime = getTimeUnit().convert(nanoDiff, TimeUnit.NANOSECONDS);
+
+ if(currentTime >= 0){
+ if(allmax < 0 || currentTime > allmax){
+ allmax = currentTime;
+ }
+ if(allmin < 0 || currentTime < allmin){
+ allmin = currentTime;
+ }
+ if(currentTime > maxAllListenerTime){
+ allexceedanceCount++;
+ String maxMessage = String.format("%s: count[%d] %d [%d (count)] [%s]", getName(), allCount, currentTime, allexceedanceCount, getTimeUnit().name());
+ System.out.println(maxMessage);
+ }
+ allaverage = (((allCount-1) * allaverage) + currentTime)/allCount;
+ }
+ }
+
+ if(preListener != null && postListener != null && preListener.listener == postListener.listener){
+ long nanoDiff = postListener.getNanoTime() - preListener.getNanoTime();
+ String listenerLabel = preListener.listener.getClass().getName();
+ preListener = null;
+ postListener = null;
+ count++;
+ long currentTime = getTimeUnit().convert(nanoDiff, TimeUnit.NANOSECONDS);
+
+ if(currentTime >= 0){
+ if(max < 0 || currentTime > max){
+ max = currentTime;
+ }
+ if(min < 0 || currentTime < min){
+ min = currentTime;
+ }
+ if(currentTime > maxListenerTime){
+ exceedanceCount++;
+ String maxMessage = String.format("%s: %s: count[%d] %d [%d (count)] [%s]", getName(), listenerLabel, count, currentTime, exceedanceCount, getTimeUnit().name());
+ System.out.println(maxMessage);
+ }
+ average = (((count-1) * average) + currentTime)/count;
+ }
+ }
+ }
+
+ messageTraceOutputAll.setMessage(getMessage().getMessageName());
+ messageTraceOutputAll.setMessageRate(getMessageRate());
+ messageTraceOutputAll.setTimeUnit(getTimeUnit().name());
+ messageTraceOutputAll.setTraceType(TRACE_TYPE);
+ messageTraceOutputAll.setCount(allCount);
+ messageTraceOutputAll.setAverage(allaverage);
+ messageTraceOutputAll.setMin(allmin);
+ messageTraceOutputAll.setMax(allmax);
+ messageTraceOutputAll.setExceedanceCount(allexceedanceCount);
+ messageTraceOutputAll.setExceedanceThreshold(maxAllListenerTime);
+ messageTraceOutputAll.setListenerWaitTimeMs(listenerWaitTimeMs);
+ messageTraceOutputAll.setTestDurationSec(testDurationSec);
+
+ messageTraceOutput.setMessage(getMessage().getMessageName());
+ messageTraceOutput.setMessageRate(getMessageRate());
+ messageTraceOutput.setTimeUnit(getTimeUnit().name());
+ messageTraceOutput.setTraceType(TRACE_TYPE);
+ messageTraceOutput.setCount(count);
+ messageTraceOutput.setAverage(average);
+ messageTraceOutput.setMin(min);
+ messageTraceOutput.setMax(max);
+ messageTraceOutput.setExceedanceCount(exceedanceCount);
+ messageTraceOutput.setExceedanceThreshold(maxListenerTime);
+ messageTraceOutput.setListenerWaitTimeMs(listenerWaitTimeMs);
+ messageTraceOutput.setTestDurationSec(testDurationSec);
+
+ messageTraceOutputAll.setExtraTraceOutput(messageTraceOutput);
+ if (messageTraceLogger != null){
+ messageTraceLogger.logMessageTraceOutput(messageTraceOutputAll);
+ }
+ }
+
+ public void addStartNotify() {
+ add(new ListenerEvent(ListenerEventType.startNotify));
+ }
+
+ public void addEndNotify() {
+ add(new ListenerEvent(ListenerEventType.endNotify));
+ }
+
+ public void addStartListener(IOSEEMessageListener listener) {
+ add(new ListenerEvent(ListenerEventType.startListener, listener));
+ }
+
+ public void addEndListener(IOSEEMessageListener listener) {
+ add(new ListenerEvent(ListenerEventType.endListener, listener));
+ }
+
+ private static class ListenerEvent extends TimeEvent {
+
+ public final ListenerEventType type;
+ public IOSEEMessageListener listener;
+
+ public ListenerEvent(ListenerEventType type) {
+ super(type.name());
+ this.type = type;
+ }
+
+ public ListenerEvent(ListenerEventType type, IOSEEMessageListener listener) {
+ this(type);
+ this.listener = listener;
+ }
+
+ }
+
+ private enum ListenerEventType {
+ startNotify,
+ endNotify,
+ startListener,
+ endListener
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageProviderVersion.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageProviderVersion.java
new file mode 100644
index 000000000..e18802265
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageProviderVersion.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message;
+
+import java.util.Set;
+import java.util.concurrent.ConcurrentSkipListSet;
+
+public class MessageProviderVersion {
+ Set<String> versions = new ConcurrentSkipListSet<>();
+
+ public synchronized void add(MessageDefinitionProvider provider){
+ versions.add(generateVersion(provider));
+ }
+
+ public synchronized void remove(MessageDefinitionProvider provider){
+ versions.remove(generateVersion(provider));
+ }
+
+ public synchronized String getVersion(){
+ if(versions.size() == 0){
+ return "no library detected";
+ }
+ StringBuilder sb = new StringBuilder();
+ for(String ver:versions){
+ sb.append(ver);
+ sb.append("\n");
+ }
+ sb.deleteCharAt(sb.length()-1);
+ return sb.toString();
+ }
+
+ private String generateVersion(MessageDefinitionProvider provider){
+ return String.format("%s[%s.%s]", provider.singletonId(), provider.majorVersion(), provider.minorVersion());
+ }
+
+ public synchronized boolean isAnyAvailable(){
+ return versions.size() > 0;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSendPeriodTrace.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSendPeriodTrace.java
new file mode 100644
index 000000000..c16e97dfe
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSendPeriodTrace.java
@@ -0,0 +1,165 @@
+package org.eclipse.osee.ote.message;
+
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.message.data.MessageData;
+
+/**
+ * This class will measure the time between sends.
+ * <pre>
+ * {@code
+ * MessageSendPeriodTrace trace = new MessageSendPeriodTrace(TimeUnit.NANOSECONDS, testMessage, logger);
+ * trace.start();
+ * //wait or do stuff
+ * trace.stop();
+ * trace.printResults();
+ * }
+ * </pre>
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class MessageSendPeriodTrace extends MessageTimeTrace {
+
+ public final String TRACE_TYPE = "MessageSendPeriodTrace";
+ private SendTimer sendTimer;
+ private int maxFlag = Integer.MAX_VALUE;
+ private int minError = Integer.MIN_VALUE;
+ private int maxError = Integer.MAX_VALUE;
+
+ private MessageTraceOutput messageTraceOutput;
+ private MessageTraceLogger messageTraceLogger;
+
+ /**
+ * @param environment - the test environment.
+ * @param timeUnit - determines the resolution of the timing that is measured.
+ * @param message - the message to measure
+ * @param messageTraceLogger - logger to write output
+ */
+ @SuppressWarnings("rawtypes")
+ public MessageSendPeriodTrace(ITestEnvironmentAccessor environment, TimeUnit timeUnit, Message message, MessageTraceLogger messageTraceLogger) {
+ super(environment, message, timeUnit);
+ sendTimer = new SendTimer(this);
+ this.messageTraceOutput = new MessageTraceOutput();
+ this.messageTraceLogger = messageTraceLogger;
+ }
+
+ /**
+ *
+ * @param expected the expected period in the constructed TimeUnit
+ * @param maxError the max variance off of the period in the constructed TimeUnit
+ */
+ public void setMaxVariance(int expected, int maxError){
+ this.maxFlag = maxError;
+ this.minError = expected - maxError;
+ this.maxError = expected + maxError;
+ }
+
+ public void addStartEvent(String message){
+ add(new TimeEvent(message));
+ }
+
+ @Override
+ public void start(){
+ super.start();
+ getMessage().getDefaultMessageData().addSendListener(sendTimer);
+ }
+
+ @Override
+ public void stop(){
+ super.stop();
+ getMessage().getDefaultMessageData().removeSendListener(sendTimer);
+ }
+
+ @Override
+ public synchronized void printResults(){
+ List<TimeEvent> events = get();
+ int count = 0;
+ int exceedanceCount = 0;
+ double average = 0.0;
+ double max = -1.0;
+ double min = -1.0;
+
+ SendEvent pre1 = null;
+ SendEvent pre2 = null;
+ for(TimeEvent event:events){
+ if(event instanceof SendEvent){
+ SendEvent sendEvent = (SendEvent)event;
+ if(sendEvent.type == SendEventType.pre){
+ pre1 = pre2;
+ pre2 = sendEvent;
+ }
+ }
+ if(pre1 != null && pre2 != null){
+ long nanoDiff = pre2.getNanoTime() - pre1.getNanoTime();
+ count++;
+ long currentTime = getTimeUnit().convert(nanoDiff, TimeUnit.NANOSECONDS);
+
+ if(currentTime >= 0){
+ if(max < 0 || currentTime > max){
+ max = currentTime;
+ }
+ if(min < 0 || currentTime < min){
+ min = currentTime;
+ }
+ if(currentTime > maxError || currentTime < minError){
+ exceedanceCount++;
+ String maxMessage = String.format("%s: count[%d] %d [%d (count)] [%s]", getName(), count, currentTime, exceedanceCount, getTimeUnit().name());
+ System.out.println(maxMessage);
+ }
+ average = (((count-1) * average) + currentTime)/count;
+ }
+ }
+ }
+ messageTraceOutput.setMessage(getMessage().getMessageName());
+ messageTraceOutput.setMessageRate(getMessageRate());
+ messageTraceOutput.setTimeUnit(getTimeUnit().name());
+ messageTraceOutput.setTraceType(TRACE_TYPE);
+ messageTraceOutput.setCount(count);
+ messageTraceOutput.setAverage(average);
+ messageTraceOutput.setMin(min);
+ messageTraceOutput.setMax(max);
+ messageTraceOutput.setExceedanceCount(exceedanceCount);
+ messageTraceOutput.setExceedanceThreshold(maxFlag);
+ messageTraceOutput.setTestDurationSec(testDurationSec);
+ if (messageTraceLogger != null){
+ messageTraceLogger.logMessageTraceOutput(messageTraceOutput);
+ }
+ }
+
+ private static class SendTimer implements IMessageSendListener {
+
+ private MessageSendPeriodTrace messageSendOperator;
+
+ public SendTimer(MessageSendPeriodTrace messageSendOperator) {
+ this.messageSendOperator = messageSendOperator;
+ }
+
+ @Override
+ public void onPreSend(MessageData messageData) {
+ messageSendOperator.add(new SendEvent(SendEventType.pre));
+ }
+
+ @Override
+ public void onPostSend(MessageData messageData) {
+ // Intentionally empty block
+ }
+
+ }
+
+ private static class SendEvent extends TimeEvent {
+
+ public final SendEventType type;
+
+ public SendEvent(SendEventType type) {
+ super(type.name());
+ this.type = type;
+ }
+
+ }
+
+ private enum SendEventType {
+ pre
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSendTrace.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSendTrace.java
new file mode 100644
index 000000000..18dc30c84
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSendTrace.java
@@ -0,0 +1,161 @@
+package org.eclipse.osee.ote.message;
+
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.message.data.MessageData;
+
+/**
+ * This class will time the send call of a message. From just after you call send to after socket.send() has been called.
+ *
+ * The results will be written to System.out or System.out and the Outfile, depending on which constructor you use.
+ *
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class MessageSendTrace extends MessageTimeTrace {
+
+ public final String TRACE_TYPE = "MessageSendTrace";
+ private SendTimer sendTimer;
+
+ private int maxFlag = Integer.MAX_VALUE;
+
+ private MessageTraceOutput messageTraceOutput;
+ private MessageTraceLogger messageTraceLogger;
+
+ /**
+ * @param environment - the test environment.
+ * @param timeUnit - determines the resolution of the timing that is measured.
+ * @param message - the message to measure
+ * @param messageTraceLogger - logger to write output
+ */
+ @SuppressWarnings("rawtypes")
+ public MessageSendTrace(ITestEnvironmentAccessor environment, TimeUnit timeUnit, Message message, MessageTraceLogger messageTraceLogger) {
+ super(environment, message, timeUnit);
+ sendTimer = new SendTimer(this);
+ this.messageTraceOutput = new MessageTraceOutput();
+ this.messageTraceLogger = messageTraceLogger;
+ }
+
+ /**
+ * Set the time that you want to flag for exceeding the expected time. It is in the scale of the passed in TimeUnit.
+ *
+ * @param maxFlagNS
+ */
+ public void setMaxFlag(int maxFlag){
+ this.maxFlag = maxFlag;
+ }
+
+ public void addStartEvent(String message){
+ add(new TimeEvent(message));
+ }
+
+
+ @Override
+ public void start(){
+ super.start();
+ getMessage().getDefaultMessageData().addSendListener(sendTimer);
+ }
+
+ @Override
+ public void stop(){
+ super.stop();
+ getMessage().getDefaultMessageData().removeSendListener(sendTimer);
+ }
+
+ @Override
+ public synchronized void printResults(){
+ List<TimeEvent> events = get();
+ int count = 0;
+ int exceedanceCount = 0;
+ double average = 0.0;
+ double max = -1.0;
+ double min = -1.0;
+
+ SendEvent pre = null;
+ SendEvent post = null;
+ for(TimeEvent event:events){
+ if(event instanceof SendEvent){
+ SendEvent sendEvent = (SendEvent)event;
+ if(sendEvent.type == SendEventType.pre){
+ pre = sendEvent;
+ } else {
+ post = sendEvent;
+ }
+ }
+ if(pre != null && post != null){
+ long nanoDiff = post.getNanoTime() - pre.getNanoTime();
+ pre = null;
+ post = null;
+ count++;
+ long currentTime = getTimeUnit().convert(nanoDiff, TimeUnit.NANOSECONDS);
+
+ if(currentTime >= 0){
+ if(max < 0 || currentTime > max){
+ max = currentTime;
+ }
+ if(min < 0 || currentTime < min){
+ min = currentTime;
+ }
+ if(currentTime > maxFlag){
+ exceedanceCount++;
+ String maxMessage = String.format("%s: count[%d] %d [%d (count)] [%s]", getName(), count, currentTime, exceedanceCount, getTimeUnit().name());
+ System.out.println(maxMessage);
+ }
+ average = (((count-1) * average) + currentTime)/count;
+ }
+ }
+ }
+ messageTraceOutput.setMessage(getMessage().getMessageName());
+ messageTraceOutput.setMessageRate(getMessageRate());
+ messageTraceOutput.setTimeUnit(getTimeUnit().name());
+ messageTraceOutput.setTraceType(TRACE_TYPE);
+ messageTraceOutput.setCount(count);
+ messageTraceOutput.setAverage(average);
+ messageTraceOutput.setMin(min);
+ messageTraceOutput.setMax(max);
+ messageTraceOutput.setExceedanceCount(exceedanceCount);
+ messageTraceOutput.setExceedanceThreshold(maxFlag);
+ messageTraceOutput.setTestDurationSec(testDurationSec);
+ if (messageTraceLogger != null){
+ messageTraceLogger.logMessageTraceOutput(messageTraceOutput);
+ }
+ }
+
+ private static class SendTimer implements IMessageSendListener {
+
+ private MessageSendTrace messageSendOperator;
+
+ public SendTimer(MessageSendTrace messageSendOperator) {
+ this.messageSendOperator = messageSendOperator;
+ }
+
+ @Override
+ public void onPreSend(MessageData messageData) {
+ messageSendOperator.add(new SendEvent(SendEventType.pre));
+ }
+
+ @Override
+ public void onPostSend(MessageData messageData) {
+ messageSendOperator.add(new SendEvent(SendEventType.post));
+ }
+
+ }
+
+ private static class SendEvent extends TimeEvent {
+
+ public final SendEventType type;
+
+ public SendEvent(SendEventType type) {
+ super(type.name());
+ this.type = type;
+ }
+
+ }
+
+ private enum SendEventType {
+ pre,
+ post
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSink.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSink.java
new file mode 100644
index 000000000..4556d642a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSink.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message;
+
+/**
+ * @author Ryan D. Brooks
+ */
+public interface MessageSink {
+
+ /**
+ * called once by each provider before it calls absorbMessage or absorbElement
+ * @param providerName The name of the provider
+ */
+ public void absorbProvider(String providerName);
+
+ /**
+ * called once for each message in the message list
+ * @param messageName The name of the message
+ */
+ public void absorbMessage(String messageName);
+
+ /**
+ * called once for each element in a message after absorbMessage is called for that message
+ * @param elementName The name of the element
+ */
+ public void absorbElement(String elementName);
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageState.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageState.java
new file mode 100644
index 000000000..2b42104dc
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageState.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.tool.MessageMode;
+
+/**
+ * Holds a state of a message intended to be transferred from the message manager server to an interest client. In other
+ * words, helps synchronize two remote instances of a message object
+ *
+ * @author Ken J. Aguilar
+ * @see org.eclipse.osee.ote.message.Message
+ */
+public final class MessageState implements Serializable {
+
+ private static final long serialVersionUID = -8977593021184452337L;
+
+ private final DataType currentMemType;
+ private final byte[] data;
+ private final Set<DataType> availableMemTypes;
+ private final MessageMode mode;
+
+ public MessageState(final DataType currentMemType, final byte[] data, final Set<DataType> availableMemTypes, final MessageMode mode) {
+ this.currentMemType = currentMemType;
+ this.data = data;
+
+ this.availableMemTypes = new HashSet<>(availableMemTypes);
+ this.mode = mode;
+ }
+
+ public DataType getCurrentMemType() {
+ return currentMemType;
+ }
+
+ public byte[] getData() {
+ return data;
+ }
+
+ public Set<DataType> getAvailableMemTypes() {
+ return availableMemTypes;
+ }
+
+ public MessageMode getMode() {
+ return mode;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSystemException.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSystemException.java
new file mode 100644
index 000000000..208653be7
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSystemException.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message;
+
+import java.util.logging.Level;
+import org.eclipse.osee.ote.core.TestException;
+
+public class MessageSystemException extends TestException {
+
+ private static final long serialVersionUID = -8476610648021756216L;
+
+ public MessageSystemException(String message, Level level) {
+ this(message, level, null);
+ }
+
+ public MessageSystemException(String message, Level level, Throwable cause) {
+ super(message, level, cause);
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSystemTestCase.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSystemTestCase.java
new file mode 100644
index 000000000..a2311c992
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSystemTestCase.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message;
+
+import java.util.Set;
+import org.eclipse.osee.ote.core.TestCase;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.interfaces.IMessageManager;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+import org.eclipse.osee.ote.message.interfaces.ITestEnvironmentMessageSystemAccessor;
+
+/**
+ * @author Andy Jury
+ */
+public abstract class MessageSystemTestCase extends TestCase implements ITestAccessor {
+
+ private final ITestEnvironmentMessageSystemAccessor msgSysTestEnvironment;
+
+ protected MessageSystemTestCase(TestScript testScript, boolean standAlone, boolean addToRunList) {
+ super(testScript, standAlone, addToRunList);
+ msgSysTestEnvironment = (MessageSystemTestScript) testScript;
+ }
+
+ /**
+ * TestCase Constructor.
+ */
+ public MessageSystemTestCase(TestScript testScript, boolean standAlone) {
+ this(testScript, standAlone, true);
+ }
+
+ /**
+ * TestCase Constructor.
+ */
+ public MessageSystemTestCase(TestScript testScript) {
+ this(testScript, false);
+ }
+
+ @Override
+ public IMessageManager<?, ?> getMsgManager() {
+ return msgSysTestEnvironment.getMsgManager();
+ }
+
+ @Override
+ public boolean isPhysicalTypeAvailable(DataType mux) {
+ return msgSysTestEnvironment.isPhysicalTypeAvailable(mux);
+ }
+
+ @Override
+ public void associateObject(Class<?> c, Object obj) {
+ msgSysTestEnvironment.associateObject(c, obj);
+ }
+
+ @Override
+ public Set<? extends DataType> getDataTypes() {
+ return msgSysTestEnvironment.getDataTypes();
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSystemTestEnvironment.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSystemTestEnvironment.java
new file mode 100644
index 000000000..67326b83b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSystemTestEnvironment.java
@@ -0,0 +1,128 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message;
+
+import java.lang.reflect.InvocationTargetException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.osee.ote.Configuration;
+import org.eclipse.osee.ote.core.IUserSession;
+import org.eclipse.osee.ote.core.ServiceUtility;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.BasicTimeout;
+import org.eclipse.osee.ote.core.environment.interfaces.IEnvironmentFactory;
+import org.eclipse.osee.ote.core.environment.interfaces.ITimeout;
+import org.eclipse.osee.ote.core.model.IModelManager;
+import org.eclipse.osee.ote.message.instrumentation.IOInstrumentation;
+import org.eclipse.osee.ote.message.interfaces.IMessageManager;
+import org.eclipse.osee.ote.message.interfaces.ITestEnvironmentMessageSystemAccessor;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Robert A. Fisher
+ * @author Andrew M. Finkbeiner
+ */
+public abstract class MessageSystemTestEnvironment extends TestEnvironment implements ITestEnvironmentMessageSystemAccessor, IMessageTestContext {
+ protected URL[] clientClasses;
+ private final List<IPreScriptInstantiation> preInstantiation = new ArrayList<>();
+ protected boolean promptResponse = false;
+ private IOInstrumentationDB ioInstrumentation;
+
+ protected MessageSystemTestEnvironment(IEnvironmentFactory factory) {
+ super(factory);
+ getScriptCtrl().setScriptReady(false);
+ }
+
+ private void setupIOInstrumentation() {
+ if (ioInstrumentation == null) {
+ ioInstrumentation = new IOInstrumentationDB();
+ }
+ }
+
+ public void envWait(int milliseconds) throws InterruptedException {
+ envWait(new BasicTimeout(), milliseconds);
+ }
+
+ public void envWait(ITimeout obj, int milliseconds) throws InterruptedException {
+ setTimerFor(obj, milliseconds);
+ synchronized (obj) {
+ obj.wait();
+ }
+ }
+
+ @SuppressWarnings("rawtypes")
+ @Override
+ public IMessageManager getMsgManager() {
+ return ServiceUtility.getService(IMessageManager.class, false);
+ }
+
+ public IModelManager getModelManager() {
+ return ServiceUtility.getService(IModelManager.class, 5000);
+ }
+
+ /**
+ * provides a way for sub classes to instantiate test scripts in their own way.
+ */
+ protected abstract TestScript instantiateScriptClass(Class<?> scriptClass, IUserSession connection) throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException;
+
+ public abstract void singleStepEnv();
+
+ @Override
+ public void resetScriptLoader(Configuration configuration, String[] strings) throws Exception {
+ getRuntimeManager().resetScriptLoader(configuration, strings);
+ }
+
+ public void addPreInstantiationListener(IPreScriptInstantiation listener) {
+ preInstantiation.add(listener);
+ }
+
+ public void removePreInstantiationListener(IPreScriptInstantiation listener) {
+ preInstantiation.remove(listener);
+ }
+
+ public void notifyPreInstantiationListeners() {
+ for (IPreScriptInstantiation pre : preInstantiation) {
+ pre.run();
+ }
+ }
+
+ public IOInstrumentation getIOInstrumentation(String name) {
+ setupIOInstrumentation();
+ return ioInstrumentation.getIOInstrumentation(name);
+ }
+
+ public IOInstrumentation registerIOInstrumentation(String name, IOInstrumentation io) {
+ setupIOInstrumentation();
+ return ioInstrumentation.registerIOInstrumentation(name, io);
+ }
+
+ public void deregisterIOInstrumentation(String name) {
+ setupIOInstrumentation();
+ ioInstrumentation.unregisterIOInstrumentation(name);
+ }
+
+ public void addInstrumentationRegistrationListener(IInstrumentationRegistrationListener listener) {
+ setupIOInstrumentation();
+ ioInstrumentation.addRegistrationListener(listener);
+ }
+
+ public void removeInstrumentationRegistrationListener(IInstrumentationRegistrationListener listener) {
+ setupIOInstrumentation();
+ ioInstrumentation.removeRegistrationListener(listener);
+ }
+
+ public Class<?> loadClassFromMessageLoader(String path) throws ClassNotFoundException {
+ return getRuntimeManager().loadFromRuntimeLibraryLoader(path);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSystemTestScript.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSystemTestScript.java
new file mode 100644
index 000000000..8d22982f9
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageSystemTestScript.java
@@ -0,0 +1,127 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message;
+
+import org.eclipse.osee.ote.core.IUserSession;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.enums.ScriptTypeEnum;
+import org.eclipse.osee.ote.core.environment.EnvironmentTask;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.ICancelTimer;
+import org.eclipse.osee.ote.core.environment.interfaces.IExecutionUnitManagement;
+import org.eclipse.osee.ote.core.environment.interfaces.IScriptControl;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestLogger;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestStation;
+import org.eclipse.osee.ote.core.environment.interfaces.ITimeout;
+import org.eclipse.osee.ote.core.environment.interfaces.ITimerControl;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.interfaces.IMessageManager;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+import org.eclipse.osee.ote.message.interfaces.ITestEnvironmentMessageSystemAccessor;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public abstract class MessageSystemTestScript extends TestScript implements ITestAccessor {
+
+ private final ITestEnvironmentMessageSystemAccessor msgSysEnvironment;
+
+ public MessageSystemTestScript(TestEnvironment environment, IUserSession callback, ScriptTypeEnum scriptType, boolean isBatchable) {
+ super(environment, callback, scriptType, isBatchable);
+ msgSysEnvironment = (ITestEnvironmentMessageSystemAccessor) environment;
+ }
+
+ @Override
+ public IMessageManager<?, ?> getMsgManager() {
+ return msgSysEnvironment.getMsgManager();
+ }
+
+ @Override
+ public boolean isPhysicalTypeAvailable(DataType mux) {
+ return msgSysEnvironment.isPhysicalTypeAvailable(mux);
+ }
+
+ @Override
+ public void associateObject(Class<?> c, Object obj) {
+ msgSysEnvironment.associateObject(c, obj);
+ }
+
+ @Override
+ public Object getAssociatedObject(Class<?> c) {
+ return msgSysEnvironment.getAssociatedObject(c);
+ }
+
+ public Object getAssociatedObject() {
+ return msgSysEnvironment.getAssociatedObjects();
+ }
+
+ @Override
+ public IExecutionUnitManagement getExecutionUnitManagement() {
+ return msgSysEnvironment.getExecutionUnitManagement();
+ }
+
+ @Override
+ public ITestStation getTestStation() {
+ return msgSysEnvironment.getTestStation();
+ }
+
+ @Override
+ public ITestLogger getLogger() {
+ return msgSysEnvironment.getLogger();
+ }
+
+ @Override
+ public ITimerControl getTimerCtrl() {
+ return msgSysEnvironment.getTimerCtrl();
+ }
+
+ @Override
+ public IScriptControl getScriptCtrl() {
+ return msgSysEnvironment.getScriptCtrl();
+ }
+
+ @Override
+ public ICancelTimer setTimerFor(ITimeout listener, int time) {
+ return msgSysEnvironment.setTimerFor(listener, time);
+ }
+
+ @Override
+ public final void onScriptSetup() {
+ msgSysEnvironment.onScriptSetup();
+ }
+
+ @Override
+ public final void onScriptComplete() throws InterruptedException {
+ msgSysEnvironment.onScriptComplete();
+ }
+
+ @Override
+ public long getEnvTime() {
+ return msgSysEnvironment.getEnvTime();
+ }
+
+ // public ITestPointTally getAttachedTestPointTally(TestScript script) {
+ // return msgSysEnvironment.getAttachedTestPointTally(script);
+ // }
+
+ // public EnvironmentType getEnvironmentType() {
+ // return msgSysEnvironment.getEnvironmentType();
+ // }
+ @Override
+ public void abortTestScript() {
+ msgSysEnvironment.abortTestScript();
+ }
+
+ @Override
+ public boolean addTask(EnvironmentTask task) {
+ return msgSysEnvironment.addTask(task);
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageTimeTrace.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageTimeTrace.java
new file mode 100644
index 000000000..e7751b9a0
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageTimeTrace.java
@@ -0,0 +1,57 @@
+/*
+ * Created on Oct 16, 2017
+ *
+ * PLACE_YOUR_DISTRIBUTION_STATEMENT_RIGHT_HERE
+ */
+package org.eclipse.osee.ote.message;
+
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+
+public class MessageTimeTrace extends TimeTrace {
+
+ protected int testDurationSec = 10;
+ private ITestEnvironmentAccessor environment;
+ @SuppressWarnings("rawtypes")
+ private Message message;
+ private TimeUnit timeUnit;
+ private double messageRate;
+
+ @SuppressWarnings("rawtypes")
+ public MessageTimeTrace(ITestEnvironmentAccessor environment, Message message, TimeUnit timeUnit) {
+ super(message.getName());
+ this.environment = environment;
+ this.message = message;
+ this.timeUnit= timeUnit;
+ this.messageRate = message.getRate();
+ }
+
+ public void testWait() throws InterruptedException {
+ environment.getTimerCtrl().envWait(testDurationSec*1000);
+ }
+
+ public void runTraceTest() throws InterruptedException {
+ start();
+ testWait();
+ stop();
+ }
+
+ public void setTestDurationTime(int testDurationSec) {
+ this.testDurationSec = testDurationSec;
+ }
+
+ @SuppressWarnings("rawtypes")
+ public Message getMessage() {
+ return message;
+ }
+
+ public TimeUnit getTimeUnit() {
+ return timeUnit;
+ }
+
+ public double getMessageRate() {
+ return messageRate;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageTraceLogger.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageTraceLogger.java
new file mode 100644
index 000000000..ca1d3a5ed
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageTraceLogger.java
@@ -0,0 +1,12 @@
+package org.eclipse.osee.ote.message;
+
+/**
+ * The {@code MessageTraceDbLogger} interface is a logger interface.
+ *
+ * @author Andy Jury
+ *
+ */
+public interface MessageTraceLogger {
+
+ public void logMessageTraceOutput(MessageTraceOutput messageTraceOutput);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageTraceOutput.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageTraceOutput.java
new file mode 100644
index 000000000..f8540ee51
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/MessageTraceOutput.java
@@ -0,0 +1,136 @@
+package org.eclipse.osee.ote.message;
+
+/**
+ * The {@code MessageTraceOutput} class is a container for the different properties that
+ * are being measured and calculated for the different Message Trace classes.
+ *
+ *
+ * @author Andy Jury
+ *
+ */
+public class MessageTraceOutput {
+
+ private String traceType;
+
+ private String message;
+ private double messageRate;
+ private String timeUnit;
+
+ private int count;
+
+ private double average;
+ private double max;
+ private double min;
+
+ private int exceedanceCount;
+ private int exceedanceThreshold;
+
+ private int testDurationSec;
+
+ private Object extraTraceOutput;
+ private int listenerWaitTimeMs;
+
+ public void setTraceType(String traceType) {
+ this.traceType = traceType;
+ }
+
+ public String getTraceType() {
+ return traceType;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessageRate(double messageRate) {
+ this.messageRate = messageRate;
+ }
+
+ public double getMessageRate() {
+ return messageRate;
+ }
+
+ public void setTimeUnit(String timeUnit) {
+ this.timeUnit = timeUnit;
+ }
+
+ public String getTimeUnit() {
+ return timeUnit;
+ }
+
+ public int getCount() {
+ return count;
+ }
+
+ public void setCount(int count) {
+ this.count = count;
+ }
+
+ public int getExceedanceCount() {
+ return exceedanceCount;
+ }
+
+ public void setExceedanceCount(int exceedanceCount) {
+ this.exceedanceCount = exceedanceCount;
+ }
+
+ public double getAverage() {
+ return average;
+ }
+
+ public void setAverage(double average) {
+ this.average = average;
+ }
+
+ public double getMax() {
+ return max;
+ }
+
+ public void setMax(double max) {
+ this.max = max;
+ }
+
+ public double getMin() {
+ return min;
+ }
+
+ public void setMin(double min) {
+ this.min = min;
+ }
+
+ public int getExceedanceThreshold() {
+ return exceedanceThreshold;
+ }
+
+ public void setExceedanceThreshold(int exceedanceThreshold) {
+ this.exceedanceThreshold = exceedanceThreshold;
+ }
+
+ public int getTestDurationSec() {
+ return testDurationSec;
+ }
+
+ public void setTestDurationSec(int testDurationSec) {
+ this.testDurationSec = testDurationSec;
+ }
+
+ public Object getExtraTraceOutput() {
+ return extraTraceOutput;
+ }
+
+ public void setExtraTraceOutput(Object extraTraceOutput) {
+ this.extraTraceOutput = extraTraceOutput;
+ }
+
+ public int getListenerWaitTimeMs() {
+ return listenerWaitTimeMs;
+ }
+
+ public void setListenerWaitTimeMs(int listenerWaitTimeMs) {
+ this.listenerWaitTimeMs = listenerWaitTimeMs;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/TimeEvent.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/TimeEvent.java
new file mode 100644
index 000000000..1a7c12131
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/TimeEvent.java
@@ -0,0 +1,20 @@
+package org.eclipse.osee.ote.message;
+
+public class TimeEvent {
+
+ private long nanoTime;
+ private String lable;
+
+ public TimeEvent(String label) {
+ this.lable = label;
+ nanoTime = System.nanoTime();
+ }
+
+ public long getNanoTime(){
+ return nanoTime;
+ }
+
+ public void print() {
+ System.out.printf("%s %d", lable, nanoTime);
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/TimeTrace.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/TimeTrace.java
new file mode 100644
index 000000000..b2874fe6d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/TimeTrace.java
@@ -0,0 +1,63 @@
+package org.eclipse.osee.ote.message;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+
+/**
+ * This is a class that has the base functionality to keep a list of {@link TimeEvent} objects. This way
+ * we can post process the events to determine timing of a trace of functionality.
+ *
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public class TimeTrace {
+
+ private String name;
+ private List<TimeEvent> events;
+ private volatile boolean isRunning;
+
+ public TimeTrace(String name){
+ this.name = String.format(this.getClass().getName() + "[%s]", name);
+ events = new ArrayList<>();
+ }
+
+ public void stop() {
+ isRunning = false;
+ }
+
+ public void start(){
+ isRunning = true;
+ }
+
+ public synchronized void add(TimeEvent event){
+ if(isRunning){
+ events.add(event);
+ }
+ }
+
+ public List<TimeEvent> get(){
+ return events;
+ }
+
+ public synchronized void printResults(){
+ System.out.println(">>>>>>>>>>>>>>>>>>>>-----------------");
+ System.out.println(name);
+ System.out.println("-----------------");
+ for(int i = 0; i < events.size(); i++){
+ events.get(i).print();
+ System.out.println();
+ }
+ System.out.println("<<<<<<<<<<<<<<<<<<<<-----------------");
+ }
+
+ public synchronized void clear(){
+ events.clear();
+ }
+
+ public String getName(){
+ return name;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/UniversalMessageListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/UniversalMessageListener.java
new file mode 100644
index 000000000..4255980f3
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/UniversalMessageListener.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message;
+
+import org.eclipse.osee.ote.message.interfaces.IMessageScheduleChangeListener;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface UniversalMessageListener extends IMemSourceChangeListener, IMessageDisposeListener, IMessageScheduleChangeListener {
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/ChangeSubscription.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/ChangeSubscription.java
new file mode 100644
index 000000000..af8591b16
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/ChangeSubscription.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.commands;
+
+import java.io.Serializable;
+import java.net.InetSocketAddress;
+import org.eclipse.osee.ote.message.tool.MessageMode;
+
+public final class ChangeSubscription implements Serializable {
+ private static final long serialVersionUID = 2863442398798431500L;
+ private final String msgName;
+ private final MessageMode mode;
+ private final int newMemTypeOrdinal;
+ private final int oldMemTypeOrdinal;
+ private final InetSocketAddress oldAddress;
+ private final InetSocketAddress newAddress;
+
+ public ChangeSubscription(final String msgName, final MessageMode mode, final int oldMemTypeOrdinal, final int newMemTypeOrdinal, final InetSocketAddress oldAddress, final InetSocketAddress newAddress) {
+ this.msgName = msgName;
+ this.mode = mode;
+ this.newMemTypeOrdinal = newMemTypeOrdinal;
+ this.oldMemTypeOrdinal = oldMemTypeOrdinal;
+ this.oldAddress = oldAddress;
+ this.newAddress = newAddress;
+ }
+
+ public String getMsgName() {
+ return msgName;
+ }
+
+ /**
+ * @return Returns the mode.
+ */
+ public MessageMode getMode() {
+ return mode;
+ }
+
+ public int getNewMemTypeOrdinal() {
+ return newMemTypeOrdinal;
+ }
+
+ public int getOldMemTypeOrdinal() {
+ return oldMemTypeOrdinal;
+ }
+
+ public InetSocketAddress getOldAddress() {
+ return oldAddress;
+ }
+
+ public InetSocketAddress getNewAddress() {
+ return newAddress;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/RecordCommand.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/RecordCommand.java
new file mode 100644
index 000000000..d643c9106
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/RecordCommand.java
@@ -0,0 +1,102 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.commands;
+
+import java.io.Serializable;
+import java.net.InetSocketAddress;
+import java.util.Collection;
+import java.util.List;
+import java.util.UUID;
+
+import org.eclipse.osee.ote.message.enums.DataType;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class RecordCommand implements Serializable {
+
+ public static final class MessageRecordDetails implements Serializable {
+
+ private static final long serialVersionUID = 2954398510075588584L;
+ private final String name;
+ private final DataType type;
+ private final List<List<Object>> headerElementNames;
+ private final List<List<Object>> bodyElementNames;
+ private final boolean headerDump;
+ private final boolean bodyDump;
+
+ public MessageRecordDetails(final String name, final DataType type, boolean headerDump, final List<List<Object>> headerElementNames, boolean bodyDump, final List<List<Object>> bodyElementNames) {
+ super();
+ this.name = name;
+ this.type = type;
+ this.headerDump = headerDump;
+ this.bodyDump = bodyDump;
+ this.headerElementNames = headerElementNames;
+ this.bodyElementNames = bodyElementNames;
+ }
+
+ public static long getSerialVersionUID() {
+ return serialVersionUID;
+ }
+
+ public List<List<Object>> getBodyElementNames() {
+ return bodyElementNames;
+ }
+
+ public List<List<Object>> getHeaderElementNames() {
+ return headerElementNames;
+ }
+
+ public boolean getHeaderDump() {
+ return this.headerDump;
+ }
+
+ public boolean getBodyDump() {
+ return this.bodyDump;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public DataType getType() {
+ return type;
+ }
+
+ }
+ private static final long serialVersionUID = -1000973301709084337L;
+
+ private final List<MessageRecordDetails> list;
+ private final InetSocketAddress destAddress;
+ private final UUID key;
+
+ public RecordCommand(UUID key, InetSocketAddress destAddress, List<MessageRecordDetails> list) {
+ this.list = list;
+ this.destAddress = destAddress;
+ this.key = key;
+ }
+
+ /**
+ * @return the destAddress
+ */
+ public InetSocketAddress getDestAddress() {
+ return destAddress;
+ }
+
+ public Collection<MessageRecordDetails> getMsgsToRecord() {
+ return list;
+ }
+
+ public UUID getKey(){
+ return key;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/SetElementValue.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/SetElementValue.java
new file mode 100644
index 000000000..bf9741286
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/SetElementValue.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.commands;
+
+import java.io.Serializable;
+import java.util.List;
+
+import org.eclipse.osee.ote.message.enums.DataType;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ * @author Ken J. Aguilar
+ */
+public final class SetElementValue implements Serializable {
+
+ private static final long serialVersionUID = -6696340729803635664L;
+ private final String message;
+ private final List<Object> element;
+ private final String value;
+ private final DataType type;
+ private final boolean shouldSend;
+
+ public SetElementValue(String message, DataType type, List<Object> elementPath, String value, boolean shouldSend) {
+ super();
+ this.message = message;
+ this.type = type;
+ this.element = elementPath;
+ this.value = value;
+ this.shouldSend = shouldSend;
+ }
+
+ /**
+ * @return Returns the message.
+ */
+ public String getMessage() {
+ return message;
+ }
+
+ /**
+ * @return Returns the data.
+ */
+ public List<Object> getElement() {
+ return element;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public DataType getMemType() {
+ return type;
+ }
+
+ public boolean shouldSend() {
+ return shouldSend;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/SetMessageModeCmd.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/SetMessageModeCmd.java
new file mode 100644
index 000000000..adc8afa73
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/SetMessageModeCmd.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.commands;
+
+import java.io.Serializable;
+import java.net.InetSocketAddress;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.tool.MessageMode;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class SetMessageModeCmd implements Serializable {
+
+ private static final long serialVersionUID = 4294009014724352978L;
+
+ private final String name;
+ private final DataType type;
+ private final MessageMode oldMode;
+ private final MessageMode newMode;
+ private final InetSocketAddress address;
+
+ public SetMessageModeCmd(String name, DataType type, MessageMode oldMode, MessageMode newMode, InetSocketAddress address) {
+ this.name = name;
+ this.type = type;
+ this.oldMode = oldMode;
+ this.newMode = newMode;
+ this.address = address;
+ }
+
+ /**
+ * @return Returns the serialVersionUID.
+ */
+ public static long getSerialVersionUID() {
+ return serialVersionUID;
+ }
+
+ /**
+ * @return Returns the name.
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * @return Returns the newMode.
+ */
+ public MessageMode getNewMode() {
+ return newMode;
+ }
+
+ /**
+ * @return Returns the oldMode.
+ */
+ public MessageMode getOldMode() {
+ return oldMode;
+ }
+
+ /**
+ * @return Returns the client.
+ */
+ public InetSocketAddress getAddress() {
+ return address;
+ }
+
+ /**
+ * @return Returns the type.
+ */
+ public DataType getType() {
+ return type;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/SubscribeToMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/SubscribeToMessage.java
new file mode 100644
index 000000000..43707ac3f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/SubscribeToMessage.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.commands;
+
+import java.io.Serializable;
+import java.net.InetSocketAddress;
+import java.util.UUID;
+
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.tool.MessageMode;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class SubscribeToMessage implements Serializable {
+
+ private static final long serialVersionUID = -8639822314152666969L;
+ private final String message;
+ private final DataType type;
+ private final MessageMode mode;
+ private final InetSocketAddress address;
+ private final UUID key;
+
+ public SubscribeToMessage(String message, DataType type, MessageMode mode, InetSocketAddress address, UUID key) {
+ super();
+ this.message = message;
+ this.type = type;
+ this.mode = mode;
+ this.address = address;
+ this.key = key;
+ }
+
+ /**
+ * @param message The message to set.
+ */
+ public String getMessage() {
+ return message;
+ }
+
+ public DataType getType() {
+ return type;
+ }
+
+ public MessageMode getMode() {
+ return mode;
+ }
+
+ public InetSocketAddress getAddress(){
+ return address;
+ }
+
+ public UUID getKey(){
+ return key;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/UnSubscribeToMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/UnSubscribeToMessage.java
new file mode 100644
index 000000000..595fcf80a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/UnSubscribeToMessage.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.commands;
+
+import java.io.Serializable;
+import java.net.InetSocketAddress;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.tool.MessageMode;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class UnSubscribeToMessage implements Serializable {
+
+ private static final long serialVersionUID = -1140091630056507142L;
+ private final String messageName;
+ private final MessageMode mode;
+ private final InetSocketAddress address;
+ private final DataType memTypeOrdinal;
+
+ /**
+ * Creates a new unsubscribe command.
+ *
+ * @param messageName the name of the message that the message manager service will no longer sent updates to for the
+ * specified client address
+ * @param address the address of the client.
+ */
+ public UnSubscribeToMessage(final String messageName, final MessageMode mode, final DataType memTypeOrdinal, InetSocketAddress address) {
+ this.messageName = messageName;
+ this.mode = mode;
+ this.address = address;
+ this.memTypeOrdinal = memTypeOrdinal;
+ }
+
+ public String getMessage() {
+ return messageName;
+ }
+
+ public InetSocketAddress getAddress() {
+ return address;
+ }
+
+ public DataType getMemTypeOrdinal() {
+ return memTypeOrdinal;
+ }
+
+ /**
+ * @return Returns the mode.
+ */
+ public MessageMode getMode() {
+ return mode;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/ZeroizeElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/ZeroizeElement.java
new file mode 100644
index 000000000..b553e8ac0
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/commands/ZeroizeElement.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.commands;
+
+import java.io.Serializable;
+import java.util.List;
+import org.eclipse.osee.ote.message.enums.DataType;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ * @author Ken J. Aguilar
+ */
+public class ZeroizeElement implements Serializable {
+
+ private static final long serialVersionUID = 2245725475520729629L;
+ private final String message;
+ private final List<Object> element;
+ private final DataType type;
+
+ public ZeroizeElement(String message, DataType type, List<Object> elementPath) {
+ super();
+ this.message = message;
+ this.type = type;
+ this.element = elementPath;
+ }
+
+ /**
+ * @return Returns the message.
+ */
+ public String getMessage() {
+ return message;
+ }
+
+ /**
+ * @return Returns the data.
+ */
+ public List<Object> getElement() {
+ return element;
+ }
+
+ public DataType getMemType() {
+ return type;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/AbstractCondition.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/AbstractCondition.java
new file mode 100644
index 000000000..7558292b4
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/AbstractCondition.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.condition;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public abstract class AbstractCondition implements ICondition {
+
+ @Override
+ public boolean checkAndIncrement() {
+ incrementCheckCount();
+ return check();
+ }
+
+ private int checkCount = 0;
+
+ protected void incrementCheckCount() {
+ checkCount++;
+ }
+
+ @Override
+ public int getCheckCount() {
+ return checkCount;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/AndCondition.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/AndCondition.java
new file mode 100644
index 000000000..4382a67c1
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/AndCondition.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.condition;
+
+import java.util.Collection;
+
+/**
+ * Checks that atleast one condition of a series of conditions is true
+ *
+ * @author Ken J. Aguilar
+ */
+public class AndCondition extends AbstractCondition {
+
+ private final ICondition[] conditions;
+
+ public AndCondition(ICondition... conditions) {
+ this.conditions = conditions;
+ }
+
+ public AndCondition(Collection<ICondition> conditions) {
+ this.conditions = conditions.toArray(new ICondition[conditions.size()]);
+ }
+
+ @Override
+ public boolean check() {
+ for (ICondition condition : conditions) {
+ if (condition.check()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/ChangesCondition.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/ChangesCondition.java
new file mode 100644
index 000000000..9fafabd28
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/ChangesCondition.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.condition;
+
+import org.eclipse.osee.ote.message.elements.DiscreteElement;
+
+/**
+ * @author Ken J. Aguilar
+ */
+
+public class ChangesCondition<T extends Comparable<T>> extends AbstractCondition implements IDiscreteElementCondition<T> {
+
+ private final DiscreteElement<T> element;
+ private T lastValue = null;
+
+ public ChangesCondition(DiscreteElement<T> element) {
+ this.element = element;
+ }
+
+ @Override
+ public T getLastCheckValue() {
+ return lastValue;
+ }
+
+ @Override
+ public boolean check() {
+ T currentValue = element.getValue();
+ if (lastValue == null) {
+ lastValue = currentValue;
+ return false;
+ }
+ boolean result = !currentValue.equals(lastValue);
+ lastValue = currentValue;
+ return result;
+ }
+
+ public DiscreteElement<T> getElement() {
+ return element;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/ComparisonCondition.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/ComparisonCondition.java
new file mode 100644
index 000000000..89b7b0cd5
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/ComparisonCondition.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.condition;
+
+import org.eclipse.osee.ote.message.elements.DiscreteElement;
+
+/**
+ * @author Ken J. Aguilar
+ */
+
+public class ComparisonCondition<T extends Comparable<T>> extends AbstractCondition implements IDiscreteElementCondition<T> {
+
+ private final DiscreteElement<T> element;
+ private final T value;
+ private final EqualityOperation operation;
+ private T lastValue = null;
+
+ public ComparisonCondition(DiscreteElement<T> element, EqualityOperation operation, T value) {
+ this.element = element;
+ this.operation = operation;
+ this.value = value;
+ }
+
+ @Override
+ public T getLastCheckValue() {
+ return lastValue;
+ }
+
+ @Override
+ public boolean check() {
+ lastValue = element.getValue();
+ return operation.evaluate(lastValue, value);
+ }
+
+ public DiscreteElement<T> getElement() {
+ return element;
+ }
+
+ public T getValue() {
+ return value;
+ }
+
+ public EqualityOperation getOperation() {
+ return operation;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/DifferenceCondition.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/DifferenceCondition.java
new file mode 100644
index 000000000..0077844f2
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/DifferenceCondition.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.condition;
+
+import org.eclipse.osee.ote.message.elements.NumericElement;
+
+/**
+ * @author Ken J. Aguilar
+ */
+
+public class DifferenceCondition<T extends Number & Comparable<T>> extends AbstractCondition implements IDiscreteElementCondition<T> {
+
+ private final NumericElement<T> element;
+ private final T differenceThreshold;
+ private T lastValue;
+ private final NumericEvaluator<T> evaluator;
+
+ public DifferenceCondition(NumericElement<T> element, T differenceThreshold) {
+ this.element = element;
+ this.differenceThreshold = differenceThreshold;
+ Class<?> targetClass = differenceThreshold.getClass();
+ if (targetClass.equals(Integer.class)) {
+ evaluator = (NumericEvaluator<T>) NumericEvaluator.IntegerEvaluator;
+ } else if (targetClass.equals(Double.class)) {
+ evaluator = (NumericEvaluator<T>) NumericEvaluator.DoubleEvaluator;
+ } else if (targetClass.equals(Long.class)) {
+ evaluator = (NumericEvaluator<T>) NumericEvaluator.LongEvaluator;
+ } else if (targetClass.equals(Float.class)) {
+ evaluator = (NumericEvaluator<T>) NumericEvaluator.FloatEvaluator;
+ } else {
+ throw new IllegalArgumentException("");
+ }
+ }
+
+ public NumericElement<T> getElement() {
+ return element;
+ }
+
+ public T getDifferenceThreshold() {
+ return differenceThreshold;
+ }
+
+ @Override
+ public T getLastCheckValue() {
+ return lastValue;
+ }
+
+ @Override
+ public boolean check() {
+ T value = element.getValue();
+ if (lastValue == null) {
+ lastValue = value;
+ return false;
+ }
+
+ boolean result = evaluator.subtractAndCheckGreater(value, lastValue, differenceThreshold);
+ lastValue = value;
+ return result;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/EmptyStringCondition.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/EmptyStringCondition.java
new file mode 100644
index 000000000..02b8c2e40
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/EmptyStringCondition.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.condition;
+
+import org.eclipse.osee.ote.message.elements.StringElement;
+
+/**
+ * this condition checks to see if a {@link StringElement} is empty. Empty is defined as having the first byte/character
+ * of the element equal to zero.
+ *
+ * @author Ken J. Aguilar
+ */
+public class EmptyStringCondition extends AbstractCondition implements IDiscreteElementCondition<Character> {
+
+ public final StringElement element;
+ private char lastValue;
+ private final int offset;
+
+ public EmptyStringCondition(StringElement element) {
+ this.element = element;
+ offset = element.getMsgData().getMem().getOffset() + element.getByteOffset();
+ }
+
+ @Override
+ public Character getLastCheckValue() {
+ return lastValue;
+ }
+
+ @Override
+ public boolean check() {
+ lastValue = (char) element.getMsgData().getMem().getData()[offset];
+ return lastValue == (char) 0;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/EqualityOperation.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/EqualityOperation.java
new file mode 100644
index 000000000..202eea858
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/EqualityOperation.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.condition;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public enum EqualityOperation {
+ LESS_THAN("<") {
+
+ @Override
+ public <T extends Comparable<T>> boolean evaluate(T currentValue, T targetValue) {
+ return currentValue.compareTo(targetValue) < 0;
+ }
+ },
+ LESS_THAN_OR_EQUAL("<=") {
+
+ @Override
+ public <T extends Comparable<T>> boolean evaluate(T currentValue, T targetValue) {
+ return currentValue.compareTo(targetValue) <= 0;
+ }
+ },
+ EQUAL("==") {
+
+ @Override
+ public <T extends Comparable<T>> boolean evaluate(T currentValue, T targetValue) {
+ return currentValue.compareTo(targetValue) == 0;
+ }
+ },
+ NOT_EQUAL("!=") {
+
+ @Override
+ public <T extends Comparable<T>> boolean evaluate(T currentValue, T targetValue) {
+ return currentValue.compareTo(targetValue) != 0;
+ }
+ },
+ GREATER_THAN_OR_EQUAL(">=") {
+
+ @Override
+ public <T extends Comparable<T>> boolean evaluate(T currentValue, T targetValue) {
+ return currentValue.compareTo(targetValue) >= 0;
+ }
+ },
+ GREATER_THAN(">") {
+
+ @Override
+ public <T extends Comparable<T>> boolean evaluate(T currentValue, T targetValue) {
+ return currentValue.compareTo(targetValue) > 0;
+ }
+ };
+
+ private final String toString;
+
+ EqualityOperation(String toString) {
+ this.toString = toString;
+ }
+
+ @Override
+ public String toString() {
+ return toString;
+ }
+
+ public abstract <T extends Comparable<T>> boolean evaluate(T currentValue, T targetValue);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/EqualsCondition.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/EqualsCondition.java
new file mode 100644
index 000000000..8e11f60c8
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/EqualsCondition.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.condition;
+
+import org.eclipse.osee.ote.message.elements.DiscreteElement;
+
+public class EqualsCondition<T extends Comparable<T>> extends AbstractCondition implements IDiscreteElementCondition<T> {
+
+ private final DiscreteElement<T> element;
+ private final T value;
+ private final boolean notEquals;
+ private T actualValue;
+
+ public EqualsCondition(DiscreteElement<T> element, T value) {
+ this(element, false, value);
+ }
+
+ /**
+ * sets up a condition that only passes when the notEquals flag is set to false and actual value equals the expected
+ * value or when the notEquals flag is true and the actual value does not equal the expected.
+ */
+ public EqualsCondition(DiscreteElement<T> element, boolean notEquals, T value) {
+ this.element = element;
+ this.value = element.elementMask(value);
+ this.notEquals = notEquals;
+ }
+
+ @Override
+ public boolean check() {
+ actualValue = element.getValue();
+ return actualValue.equals(value) ^ notEquals;
+ }
+
+ @Override
+ public T getLastCheckValue() {
+ return actualValue;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/ICondition.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/ICondition.java
new file mode 100644
index 000000000..33c55c16f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/ICondition.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.condition;
+
+public interface ICondition {
+ boolean check();
+
+ boolean checkAndIncrement();
+
+ int getCheckCount();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/IDiscreteElementCondition.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/IDiscreteElementCondition.java
new file mode 100644
index 000000000..3439308dd
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/IDiscreteElementCondition.java
@@ -0,0 +1,16 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.condition;
+
+public interface IDiscreteElementCondition<T extends Comparable<T>> extends ICondition {
+
+ T getLastCheckValue();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/InRangeCondition.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/InRangeCondition.java
new file mode 100644
index 000000000..dfca34a21
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/InRangeCondition.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.condition;
+
+import org.eclipse.osee.ote.message.elements.DiscreteElement;
+
+public class InRangeCondition<T extends Comparable<T>> extends AbstractCondition implements IDiscreteElementCondition<T> {
+
+ private final DiscreteElement<T> element;
+ private final T minValue;
+ private final T maxValue;
+ private final boolean minInclusive;
+ private final boolean maxInclusive;
+ private T actualValue;
+
+ public InRangeCondition(DiscreteElement<T> element, T minValue, boolean minInclusive, T maxValue, boolean maxInclusive) {
+ this.element = element;
+ this.minValue = element.elementMask(minValue);
+ this.maxValue = element.elementMask(maxValue);
+ this.maxInclusive = maxInclusive;
+ this.minInclusive = minInclusive;
+ }
+
+ @Override
+ public boolean check() {
+ actualValue = element.getValue();
+ boolean result = minInclusive ? actualValue.compareTo(minValue) >= 0 : actualValue.compareTo(minValue) > 0;
+ return result && (maxInclusive ? actualValue.compareTo(maxValue) <= 0 : actualValue.compareTo(maxValue) < 0);
+ }
+
+ @Override
+ public T getLastCheckValue() {
+ return actualValue;
+ }
+
+ public DiscreteElement<T> getElement() {
+ return element;
+ }
+
+ public T getMinValue() {
+ return minValue;
+ }
+
+ public T getMaxValue() {
+ return maxValue;
+ }
+
+ public boolean isMinInclusive() {
+ return minInclusive;
+ }
+
+ public boolean isMaxInclusive() {
+ return maxInclusive;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/ListCondition.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/ListCondition.java
new file mode 100644
index 000000000..9d9788946
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/ListCondition.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.condition;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import org.eclipse.osee.ote.message.elements.DiscreteElement;
+
+public class ListCondition<T extends Comparable<T>> extends AbstractCondition implements IDiscreteElementCondition<T> {
+ private final DiscreteElement<T> element;
+ private final HashSet<T> set;
+ private final boolean inList;
+ private T lastValue;
+
+ public ListCondition(DiscreteElement<T> element, boolean inList, T... list) {
+ this.element = element;
+ this.inList = inList;
+ for (int i = 0; i < list.length; i++) {
+ list[i] = element.elementMask(list[i]);
+ }
+ this.set = new HashSet<>(Arrays.asList(list));
+
+ }
+
+ public ListCondition(DiscreteElement<T> element, boolean inList, Collection<T> list) {
+ this.element = element;
+ this.inList = inList;
+ this.set = new HashSet<>();
+ for (T item : list) {
+ set.add(element.elementMask(item));
+ }
+
+ }
+
+ @Override
+ public T getLastCheckValue() {
+ return lastValue;
+ }
+
+ @Override
+ public boolean check() {
+ lastValue = element.getValue();
+ return !(inList ^ set.contains(lastValue));
+ }
+
+ public DiscreteElement<T> getElement() {
+ return element;
+ }
+
+ public Collection<T> getSet() {
+ return set;
+ }
+
+ public boolean isInList() {
+ return inList;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/MultiMessageCondition.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/MultiMessageCondition.java
new file mode 100644
index 000000000..6e9f1a2f3
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/MultiMessageCondition.java
@@ -0,0 +1,271 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.condition;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
+import org.eclipse.osee.ote.core.MethodFormatter;
+import org.eclipse.osee.ote.core.environment.interfaces.ICancelTimer;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.environment.interfaces.ITimeout;
+import org.eclipse.osee.ote.core.testPoint.CheckGroup;
+import org.eclipse.osee.ote.core.testPoint.CheckPoint;
+import org.eclipse.osee.ote.core.testPoint.Operation;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.MessageSystemException;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.MsgWaitResult;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+import org.eclipse.osee.ote.message.listener.IOSEEMessageListener;
+
+public class MultiMessageCondition {
+
+ private static final class MessageCounter {
+ private final Message message;
+ private int count;
+
+ public MessageCounter(Message message, int initialCount) {
+ this.count = initialCount;
+ this.message = message;
+ }
+
+ public void incrementCount() {
+ count++;
+ }
+
+ public int getCount() {
+ return count;
+ }
+
+ }
+ private static final class Listener implements IOSEEMessageListener, ITimeout {
+ private volatile boolean isTimedOut = false;
+ private final Message[] messages;
+ private final HashSet<MessageData> messagesNotSeen = new HashSet<>();
+ private final HashMap<MessageData, MessageCounter> hitCount = new HashMap<>();
+
+ private Listener(Message... messages) {
+ this.messages = messages;
+ for (Message message : messages) {
+ MessageData data = message.getActiveDataSource();
+ messagesNotSeen.add(data);
+ hitCount.put(data, new MessageCounter(message, 0));
+ }
+
+ }
+
+ synchronized void begin() {
+ for (Message message : messages) {
+ message.addListener(this);
+ }
+ }
+
+ void end() {
+ for (Message message : messages) {
+ message.removeListener(this);
+ }
+ }
+
+ @Override
+ public synchronized void onDataAvailable(MessageData data, DataType type) throws MessageSystemException {
+ MessageCounter count = hitCount.get(data);
+ if (count != null) {
+ if (count.getCount() == 0) {
+ // remove this message from the list of messages not seen
+ messagesNotSeen.remove(data);
+ }
+ count.incrementCount();
+ }
+ notify();
+ }
+
+ @Override
+ public void onInitListener() throws MessageSystemException {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public boolean isTimedOut() {
+ return isTimedOut;
+ }
+
+ @Override
+ public void setTimeout(boolean timeout) {
+ isTimedOut = timeout;
+ }
+
+ public synchronized boolean waitForTransmission() throws InterruptedException {
+ wait();
+ return !isTimedOut;
+
+ }
+
+ public void fillInMessagesReceived(Collection<MessageCounter> list) {
+ for (Message msg : messages) {
+ // items are removed from the hit list when they are found so if they are not
+ // in the hit list then that means we received it
+
+ MessageCounter counter = hitCount.get(msg.getActiveDataSource());
+ if (counter != null) {
+ list.add(counter);
+ }
+ }
+ }
+
+ public int getHitCount(Message msg) {
+ MessageCounter count = hitCount.get(msg.getActiveDataSource());
+ return count != null ? count.getCount() : 0;
+ }
+
+ public void fillInMessagesNotReceived(Collection<Message> list) {
+
+ for (Message msg : messages) {
+ // if we found it in the hit list then that means we didn't see it
+ if (messagesNotSeen.contains(msg.getActiveDataSource())) {
+ list.add(msg);
+ }
+ }
+ }
+ }
+
+ public MultiMessageCondition() {
+ }
+
+ public MsgWaitResult waitForAllTransmissions(ITestEnvironmentAccessor accessor, int timeout, Collection<MessageCounter> msgsNotSeen, Message... messages) throws InterruptedException {
+ long time = accessor.getEnvTime();
+ boolean seenAllMessages = false;
+ int count = 0;
+ if (timeout > 0) {
+ boolean done = false;
+ Listener listener = new Listener(messages);
+ listener.begin();
+ try {
+ final ICancelTimer cancelTimer = accessor.setTimerFor(listener, timeout);
+ while (!done) {
+ if (listener.waitForTransmission()) {
+ seenAllMessages = listener.messagesNotSeen.isEmpty();
+ count++;
+ }
+ done = seenAllMessages | listener.isTimedOut();
+ }
+ cancelTimer.cancelTimer();
+ } finally {
+ listener.end();
+ if (msgsNotSeen != null) {
+ listener.fillInMessagesReceived(msgsNotSeen);
+ }
+ }
+ }
+ time = accessor.getEnvTime() - time;
+ return new MsgWaitResult(time, count, seenAllMessages);
+ }
+
+ public MsgWaitResult waitForAnyTransmission(ITestEnvironmentAccessor accessor, int timeout, Collection<MessageCounter> msgsSeen, Message... messages) throws InterruptedException {
+ long time = accessor.getEnvTime();
+ boolean anyTransmissions = false;
+ int count = 0;
+ if (timeout > 0) {
+ boolean done = false;
+ Listener listener = new Listener(messages);
+ listener.begin();
+ try {
+ final ICancelTimer cancelTimer = accessor.setTimerFor(listener, timeout);
+ while (!done) {
+ if (listener.waitForTransmission()) {
+ count++;
+ anyTransmissions = true;
+ }
+ done = anyTransmissions | listener.isTimedOut();
+ }
+ cancelTimer.cancelTimer();
+ } finally {
+ listener.end();
+ if (msgsSeen != null) {
+ listener.fillInMessagesReceived(msgsSeen);
+ }
+ }
+ }
+ time = accessor.getEnvTime() - time;
+ return new MsgWaitResult(time, count, anyTransmissions);
+ }
+
+ public void checkNoTransmissions(ITestAccessor accessor, int timeout, Message... messages) throws InterruptedException {
+ MethodFormatter mf = new MethodFormatter();
+ mf.add(timeout);
+ for (Message msg : messages) {
+ mf.add(msg.getName());
+ }
+ accessor.getLogger().methodCalledOnObject(accessor, "MultMessage", mf);
+ LinkedList<MessageCounter> msgsReceived = new LinkedList<>();
+ MsgWaitResult result = waitForAnyTransmission(accessor, timeout, msgsReceived, messages);
+ if (!result.isPassed()) {
+ CheckPoint cp =
+ new CheckPoint("MESSAGE_TRANSMISSION.NONE", "NONE", result.isPassed() ? "AT LEAST ONE" : "NONE",
+ !result.isPassed(), result.getXmitCount(), result.getElapsedTime());
+ accessor.getLogger().testpoint(accessor, accessor.getTestScript(), accessor.getTestCase(), cp);
+ } else {
+ CheckGroup group = new CheckGroup(Operation.AND, "MESSAGE_TRANSMISSION.NONE");
+ for (MessageCounter counter : msgsReceived) {
+ group.add(new CheckPoint("TRANSMISSIONS OF " + counter.message.getName(), "0",
+ Integer.toString(counter.count), counter.count == 0, counter.count, result.getElapsedTime()));
+ }
+ accessor.getLogger().testpoint(accessor, accessor.getTestScript(), accessor.getTestCase(), group);
+ }
+ accessor.getLogger().methodEnded(accessor);
+ }
+
+ public void checkAnyTransmissions(ITestAccessor accessor, int timeout, Message... messages) throws InterruptedException {
+ MethodFormatter mf = new MethodFormatter();
+ mf.add(timeout);
+ for (Message msg : messages) {
+ mf.add(msg.getName());
+ }
+ accessor.getLogger().methodCalledOnObject(accessor, "MultMessage", mf);
+ LinkedList<MessageCounter> msgsReceived = new LinkedList<>();
+ MsgWaitResult result = waitForAnyTransmission(accessor, timeout, msgsReceived, messages);
+ CheckPoint cp =
+ new CheckPoint("MESSAGE_TRANSMISSION.ANY", "AT LEAST ONE", result.isPassed() ? "AT LEAST ONE" : "NONE",
+ result.isPassed(), result.getXmitCount(), result.getElapsedTime());
+ accessor.getLogger().testpoint(accessor, accessor.getTestScript(), accessor.getTestCase(), cp);
+ accessor.getLogger().methodEnded(accessor);
+ }
+
+ public void checkAllTransmissions(ITestAccessor accessor, int timeout, Message... messages) throws InterruptedException {
+ MethodFormatter mf = new MethodFormatter();
+ mf.add(timeout);
+ for (Message msg : messages) {
+ mf.add(msg.getName());
+ }
+ accessor.getLogger().methodCalledOnObject(accessor, "MultMessage", mf);
+ LinkedList<MessageCounter> msgsReceived = new LinkedList<>();
+ MsgWaitResult result = waitForAllTransmissions(accessor, timeout, msgsReceived, messages);
+ if (result.isPassed()) {
+ CheckPoint cp =
+ new CheckPoint("MESSAGE_TRANSMISSION.ALL", "ALL", result.isPassed() ? "ALL" : "NOT ALL", result.isPassed(),
+ result.getXmitCount(), result.getElapsedTime());
+ accessor.getLogger().testpoint(accessor, accessor.getTestScript(), accessor.getTestCase(), cp);
+ } else {
+ CheckGroup group = new CheckGroup(Operation.AND, "MESSAGE_TRANSMISSION.ALL");
+ for (MessageCounter counter : msgsReceived) {
+ group.add(new CheckPoint("TRANSMISSIONS OF " + counter.message.getName(), "GREATER THAN 0",
+ Integer.toString(counter.count), counter.count > 0, counter.count, result.getElapsedTime()));
+ }
+ accessor.getLogger().testpoint(accessor, accessor.getTestScript(), accessor.getTestCase(), group);
+ }
+
+ accessor.getLogger().methodEnded(accessor);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/NotInRangeCondition.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/NotInRangeCondition.java
new file mode 100644
index 000000000..c27c422bb
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/NotInRangeCondition.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.condition;
+
+import org.eclipse.osee.ote.message.elements.DiscreteElement;
+
+public class NotInRangeCondition<T extends Comparable<T>> extends AbstractCondition implements IDiscreteElementCondition<T> {
+
+ private final DiscreteElement<T> element;
+ private final T minValue;
+ private final T maxValue;
+ private final boolean minInclusive;
+ private final boolean maxInclusive;
+ private T actualValue;
+
+ public NotInRangeCondition(DiscreteElement<T> element, T minValue, boolean minInclusive, T maxValue, boolean maxInclusive) {
+ this.element = element;
+ this.minValue = element.elementMask(minValue);
+ this.maxValue = element.elementMask(maxValue);
+ this.maxInclusive = maxInclusive;
+ this.minInclusive = minInclusive;
+ }
+
+ @Override
+ public boolean check() {
+ actualValue = element.getValue();
+ boolean result = minInclusive ? actualValue.compareTo(minValue) < 0 : actualValue.compareTo(minValue) <= 0;
+ return result | (maxInclusive ? actualValue.compareTo(maxValue) > 0 : actualValue.compareTo(maxValue) >= 0);
+ }
+
+ @Override
+ public T getLastCheckValue() {
+ return actualValue;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/NumericEvaluator.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/NumericEvaluator.java
new file mode 100644
index 000000000..6394d4a21
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/NumericEvaluator.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.condition;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface NumericEvaluator<T extends Number & Comparable<T>> {
+
+ public static final NumericEvaluator<Integer> IntegerEvaluator = new NumericEvaluator<Integer>() {
+ @Override
+ public boolean subtractAndCheckGreater(Integer left, Integer right, Integer expected) {
+ return left - right > expected;
+ }
+ };
+
+ public static final NumericEvaluator<Double> DoubleEvaluator = new NumericEvaluator<Double>() {
+ @Override
+ public boolean subtractAndCheckGreater(Double left, Double right, Double expected) {
+ return left - right > expected;
+ }
+ };
+
+ public static final NumericEvaluator<Long> LongEvaluator = new NumericEvaluator<Long>() {
+ @Override
+ public boolean subtractAndCheckGreater(Long left, Long right, Long expected) {
+ return left - right > expected;
+ }
+ };
+
+ public static final NumericEvaluator<Float> FloatEvaluator = new NumericEvaluator<Float>() {
+ @Override
+ public boolean subtractAndCheckGreater(Float left, Float right, Float expected) {
+ return left - right > expected;
+ }
+ };
+
+ boolean subtractAndCheckGreater(T left, T right, T expected);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/OrCondition.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/OrCondition.java
new file mode 100644
index 000000000..b40426e29
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/OrCondition.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.condition;
+
+import java.util.Collection;
+
+/**
+ * Checks that a series of conditions are all true
+ *
+ * @author Ken J. Aguilar
+ */
+public class OrCondition extends AbstractCondition {
+
+ private final ICondition[] conditions;
+
+ public OrCondition(ICondition... conditions) {
+ this.conditions = conditions;
+ }
+
+ public OrCondition(Collection<ICondition> conditions) {
+ this.conditions = conditions.toArray(new ICondition[conditions.size()]);
+ }
+
+ @Override
+ public boolean check() {
+ for (ICondition condition : conditions) {
+ if (!condition.check()) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/PulseCondition.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/PulseCondition.java
new file mode 100644
index 000000000..b9a0b6aa2
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/PulseCondition.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.condition;
+
+import org.eclipse.osee.ote.message.elements.DiscreteElement;
+
+public class PulseCondition<T extends Comparable<T>> extends AbstractCondition implements IDiscreteElementCondition<T> {
+
+ private final int maxPulses;
+ private final DiscreteElement<T> element;
+ private final T pulsedValue;
+ private final T nonPulsedValue;
+ private int pulses = 0;
+ private T lastValue;
+
+ public PulseCondition(DiscreteElement<T> element, T pulsedValue, T nonPulsedValue, int numPulses) {
+ this.element = element;
+ this.pulsedValue = element.elementMask(pulsedValue);
+ this.nonPulsedValue = element.elementMask(nonPulsedValue);
+ this.maxPulses = numPulses;
+ }
+
+ public PulseCondition(DiscreteElement<T> element, T pulsedValue, T nonPulsedValue) {
+ this(element, pulsedValue, nonPulsedValue, 2);
+ }
+
+ @Override
+ public T getLastCheckValue() {
+ return lastValue;
+ }
+
+ @Override
+ public boolean check() {
+ lastValue = element.getValue();
+ if (lastValue.equals(pulsedValue)) {
+ pulses++;
+ } else if (lastValue.equals(nonPulsedValue)) {
+ if( pulses >= maxPulses ) {
+ return true;
+ } else {
+ pulses = 0;
+ }
+ }
+ return false;
+ }
+
+ public int getPulses() {
+ return pulses;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/StringComparisonCondition.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/StringComparisonCondition.java
new file mode 100644
index 000000000..229959f6d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/StringComparisonCondition.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.condition;
+
+import org.eclipse.osee.ote.message.elements.StringElement;
+
+/**
+ * @author Ken J. Aguilar
+ */
+
+public class StringComparisonCondition extends AbstractCondition implements IDiscreteElementCondition<String> {
+
+ private final StringElement element;
+ private final String value;
+ private final StringOperation operation;
+ private String lastValue = null;
+
+ public StringComparisonCondition(StringElement element, StringOperation operation, String value) {
+ this.element = element;
+ this.operation = operation;
+ this.value = value;
+ }
+
+ @Override
+ public String getLastCheckValue() {
+ return lastValue;
+ }
+
+ @Override
+ public boolean check() {
+ lastValue = element.getValue();
+ return operation.evaluate(lastValue, value);
+ }
+
+ public StringElement getElement() {
+ return element;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public StringOperation getOperation() {
+ return operation;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/StringOperation.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/StringOperation.java
new file mode 100644
index 000000000..c4d6da227
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/StringOperation.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.condition;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public enum StringOperation {
+ LESS_THAN("<") {
+
+ @Override
+ public boolean evaluate(String currentValue, String targetValue) {
+ return currentValue.compareTo(targetValue) < 0;
+ }
+ },
+ LESS_THAN_OR_EQUAL("<=") {
+
+ @Override
+ public boolean evaluate(String currentValue, String targetValue) {
+ return currentValue.compareTo(targetValue) <= 0;
+ }
+ },
+ EQUAL("==") {
+
+ @Override
+ public boolean evaluate(String currentValue, String targetValue) {
+ return currentValue.compareTo(targetValue) == 0;
+ }
+ },
+ NOT_EQUAL("!=") {
+
+ @Override
+ public boolean evaluate(String currentValue, String targetValue) {
+ return currentValue.compareTo(targetValue) != 0;
+ }
+ },
+ GREATER_THAN_OR_EQUAL(">=") {
+
+ @Override
+ public boolean evaluate(String currentValue, String targetValue) {
+ return currentValue.compareTo(targetValue) >= 0;
+ }
+ },
+ GREATER_THAN(">") {
+
+ @Override
+ public boolean evaluate(String currentValue, String targetValue) {
+ return currentValue.compareTo(targetValue) > 0;
+ }
+ },
+
+ SUBSTRING("SUB-STRING OF") {
+
+ @Override
+ public boolean evaluate(String currentValue, String targetValue) {
+ return targetValue.contains(currentValue);
+ }
+ },
+
+ CONTAINS("CONTAINS") {
+
+ @Override
+ public boolean evaluate(String currentValue, String targetValue) {
+ return currentValue.contains(targetValue);
+ }
+ };
+
+ private final String toString;
+
+ StringOperation(String toString) {
+ this.toString = toString;
+ }
+
+ @Override
+ public String toString() {
+ return toString;
+ }
+
+ public abstract boolean evaluate(String currentValue, String targetValue);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/StringTrimCondition.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/StringTrimCondition.java
new file mode 100644
index 000000000..6816365a3
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/StringTrimCondition.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.condition;
+
+import org.eclipse.osee.ote.message.elements.DiscreteElement;
+
+public class StringTrimCondition extends AbstractCondition implements IDiscreteElementCondition<String> {
+
+ private final DiscreteElement<String> element;
+ private final String value;
+ private String actualValue;
+
+ public StringTrimCondition(DiscreteElement<String> element, String value) {
+ this.element = element;
+ this.value = value;
+ }
+
+ @Override
+ public boolean check() {
+ actualValue = element.getValue().trim();
+ return actualValue.equals(value);
+ }
+
+ @Override
+ public String getLastCheckValue() {
+ return actualValue;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/TransitionCondition.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/TransitionCondition.java
new file mode 100644
index 000000000..2c66b46ef
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/TransitionCondition.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.condition;
+
+import org.eclipse.osee.ote.message.elements.DiscreteElement;
+
+/**
+ * @author Ken J. Aguilar
+ */
+
+public class TransitionCondition<T extends Comparable<T>> extends AbstractCondition implements IDiscreteElementCondition<T> {
+
+ private final DiscreteElement<T> element;
+ private final T transitionFromValue;
+ private final T transitionToValue;
+ private T lastValue = null;
+
+ public TransitionCondition(DiscreteElement<T> element, T transitionFromValue, T transitionToValue) {
+ this.element = element;
+ this.transitionToValue = transitionToValue;
+ this.transitionFromValue = transitionFromValue;
+ }
+
+ @Override
+ public T getLastCheckValue() {
+ return lastValue;
+ }
+
+ @Override
+ public boolean check() {
+ T currentValue = element.getValue();
+ if (lastValue == null) {
+ lastValue = currentValue;
+ return false;
+ }
+ boolean result = transitionFromValue.equals(lastValue) && transitionToValue.equals(currentValue);
+ lastValue = currentValue;
+ return result;
+ }
+
+ public DiscreteElement<T> getElement() {
+ return element;
+ }
+
+ public T getTransitionFromValue() {
+ return transitionFromValue;
+ }
+
+ public T getTransitionToValue() {
+ return transitionToValue;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/TransmissionCountCondition.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/TransmissionCountCondition.java
new file mode 100644
index 000000000..9860239a1
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/condition/TransmissionCountCondition.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.condition;
+
+public class TransmissionCountCondition extends AbstractCondition {
+
+ private final int max;
+
+ public TransmissionCountCondition(int max) {
+ this.max = max;
+ }
+
+ @Override
+ public boolean check() {
+ return getCheckCount() >= max;
+ }
+
+ public int getMaxTransmitCount() {
+ return max;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/ByteArrayHolder.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/ByteArrayHolder.java
new file mode 100644
index 000000000..a497cd965
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/ByteArrayHolder.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.data;
+
+import java.nio.ByteBuffer;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class ByteArrayHolder {
+ private byte[] buffer;
+ private ByteBuffer byteBuffer;
+
+ public ByteArrayHolder() {
+
+ }
+
+ public ByteArrayHolder(byte[] buffer) {
+ this.buffer = buffer;
+ byteBuffer = ByteBuffer.wrap(buffer);
+ }
+
+ public void set(byte[] buffer) {
+ this.buffer = buffer;
+ byteBuffer = ByteBuffer.wrap(buffer);
+ }
+
+ public byte[] get() {
+ return this.buffer;
+ }
+
+ public ByteBuffer getByteBuffer() {
+ return byteBuffer;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/DDSTypeSupport.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/DDSTypeSupport.java
new file mode 100644
index 000000000..61a427c04
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/DDSTypeSupport.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.data;
+
+import org.eclipse.osee.ote.messaging.dds.service.Key;
+import org.eclipse.osee.ote.messaging.dds.service.TypeSupport;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class DDSTypeSupport extends TypeSupport {
+
+ private final Key key;
+ private final String readerName;
+ private final String writerName;
+ private final int size;
+
+ public DDSTypeSupport(Key key, String readerName, String writerName, int size) {
+ this.key = key;
+ this.readerName = readerName;
+ this.writerName = writerName;
+ this.size = size;
+ }
+
+ @Override
+ protected Key getKey() {
+ return key;
+ }
+
+ @Override
+ protected String getReaderName() {
+ return this.readerName;
+ }
+
+ @Override
+ protected int getTypeDataSize() {
+ return this.size;
+ }
+
+ @Override
+ protected String getWriterName() {
+ return this.writerName;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/HeaderData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/HeaderData.java
new file mode 100644
index 000000000..588c7d527
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/HeaderData.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.data;
+
+import org.eclipse.osee.ote.message.IMessageHeader;
+
+public class HeaderData extends MessageData {
+
+ public HeaderData(String name, MemoryResource memoryResource) {
+ super(name, memoryResource);
+ }
+
+ public HeaderData(MemoryResource memoryResource) {
+ this("", memoryResource);
+ }
+
+ @Override
+ public IMessageHeader getMsgHeader() {
+ return null;
+ }
+
+ @Override
+ public void initializeDefaultHeaderValues() {
+ }
+
+ @Override
+ public void visit(IMessageDataVisitor visitor) {
+ }
+
+ @Override
+ public void zeroize() {
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/IMessageDataVisitor.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/IMessageDataVisitor.java
new file mode 100644
index 000000000..195bc7add
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/IMessageDataVisitor.java
@@ -0,0 +1,18 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.data;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IMessageDataVisitor {
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/MemoryResource.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/MemoryResource.java
new file mode 100644
index 000000000..3c5809656
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/MemoryResource.java
@@ -0,0 +1,511 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.data;
+
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+import java.util.Arrays;
+import java.util.logging.Level;
+
+import org.eclipse.osee.ote.message.MessageSystemException;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class MemoryResource {
+ private static final Charset US_ASCII_CHARSET = Charset.forName("US-ASCII");
+
+ private final ByteArrayHolder byteArray;
+ // private byte _data[];
+ private int _offset;
+ private final int _length;
+ private volatile boolean _dataHasChanged;
+
+ // private final ByteBuffer buffer;
+
+ public MemoryResource(byte data[], int offset, int length) {
+ byteArray = new ByteArrayHolder(data);
+ _length = length;
+ _offset = offset;
+ _dataHasChanged = false;
+ }
+
+ protected MemoryResource(ByteArrayHolder byteArray, int offset, int length) {
+ this.byteArray = byteArray;
+ _length = length;
+ _offset = offset;
+ _dataHasChanged = false;
+ }
+
+ public final String getUnfilteredASCIIString(int offset, int msb, int lsb) {
+ offset += _offset;
+ int size = (lsb - msb + 1) / 8;
+
+ StringBuilder str = new StringBuilder(size);
+ int limit = Math.min(size, byteArray.get().length-offset);
+ for (int i = 0; i < limit; i++) {
+ str.append(getASCIICharFromOffset(offset + i));
+ }
+ return str.toString();
+ }
+ public void setData(byte data[]) {
+ byteArray.set(data);
+ _dataHasChanged = true;
+ }
+
+ public byte[] getData() {
+ return byteArray.get();
+ }
+
+ public byte getByte(int offset, int msb, int lsb) {
+ offset += _offset;
+ if (msb == 0 && lsb == 7) {
+ return byteArray.get()[offset];
+ } else {
+ int b = byteArray.get()[offset];
+ int mask = (1 << 8 - msb) - 1;
+ mask = mask & 0xFFFFFF80 >>> lsb;
+ return (byte) ((b & mask) >> 7 - lsb);
+ }
+ }
+
+ private byte getByteFromOffset(int offset) {
+ return byteArray.get()[offset];
+ }
+
+ private final char getASCIICharFromOffset(int offset) {
+ return (char) byteArray.get()[offset];
+ }
+
+ public final int getInt(int offset, int msb, int lsb) {
+ offset += _offset;
+ final byte[] data = byteArray.get();
+ final int length = data.length;
+ final int beginByte = offset + msb / 8;
+ int endByte = offset + lsb / 8;
+ endByte = endByte < length ? endByte : length;
+ int v = data[beginByte] & 0xFF >>> msb % 8 & 0xFF;
+ if (endByte != beginByte) {
+ for (int i = beginByte + 1; i <= endByte - 1; i++) {
+ v <<= 8;
+ v |= data[i] & 0xFF;
+ }
+ v <<= 8;
+ v |= data[endByte] & 0xFF;
+ }
+ return v >>> 7 - lsb % 8;
+ }
+
+ public final short getSignedInt16(int offset, int msb, int lsb) {
+ if (lsb - msb != 15) {
+ throw new IllegalArgumentException("element must be 16 bits wide");
+ }
+ offset += _offset;
+ final byte[] data = byteArray.get();
+ final int length = data.length;
+ final int beginByte = offset + msb / 8;
+ int endByte = offset + lsb / 8;
+ endByte = endByte < length ? endByte : length;
+ int v = data[beginByte] & 0xFF >>> msb % 8 & 0xFF;
+ if (endByte != beginByte) {
+ for (int i = beginByte + 1; i <= endByte - 1; i++) {
+ v <<= 8;
+ v |= data[i] & 0xFF;
+ }
+ v <<= 8;
+ v |= data[endByte] & 0xFF;
+ }
+ return (short) (v >>> 7 - lsb % 8);
+ }
+
+ public final int getSignedInt32(int offset, int msb, int lsb) {
+ if (lsb - msb != 31) {
+ throw new IllegalArgumentException("element must be 32 bits wide");
+ }
+ offset += _offset;
+ final byte[] data = byteArray.get();
+ final int length = data.length;
+ final int beginByte = offset + msb / 8;
+ int endByte = offset + lsb / 8;
+ endByte = endByte < length ? endByte : length;
+ int v = data[beginByte] & 0xFF >>> msb % 8 & 0xFF;
+ if (endByte != beginByte) {
+ for (int i = beginByte + 1; i <= endByte - 1; i++) {
+ v <<= 8;
+ v |= data[i] & 0xFF;
+ }
+ v <<= 8;
+ v |= data[endByte] & 0xFF;
+ }
+ return v >>> 7 - lsb % 8;
+ }
+
+ public final long getLong(int offset, int msb, int lsb) {
+ offset += _offset;
+ if (lsb - msb <= 63) {
+ final byte[] data = byteArray.get();
+ final int length = data.length;
+ final int beginByte = offset + msb / 8;
+ int endByte = offset + lsb / 8;
+ endByte = endByte < length ? endByte : length;
+ long v = data[beginByte] & 0xFF >>> msb % 8 & 0xFF;
+ if (endByte != beginByte) {
+ for (int i = beginByte + 1; i <= endByte - 1; i++) {
+ v <<= 8;
+ v |= data[i] & 0xFF;
+ }
+ v <<= 8;
+ v |= data[endByte] & 0xFF;
+ }
+ return v >>> 7 - lsb % 8;
+ } else {
+ throw new IllegalArgumentException("gettting long with bits not supported");
+ }
+ }
+
+ public final String getASCIIString(int offset, int length) {
+ offset += _offset;
+ // int size = ((lsb - msb) + 1) / 8;
+
+ StringBuilder str = new StringBuilder(length);
+ for (int i = 0; i < length; i++) {
+ char ch = getASCIICharFromOffset(offset + i);
+ if (ch != 0) {// NOTE this was done to be compatible with java
+ // Strings that don't null char termination
+ str.append(getASCIICharFromOffset(offset + i));
+ }
+ }
+ return str.toString();
+ }
+
+ public final String getASCIIString(int offset, int msb, int lsb) {
+ offset += _offset;
+ int size = (lsb - msb + 1) / 8;
+
+ StringBuilder str = new StringBuilder(size);
+ for (int i = 0; i < size; i++) {
+ if (offset + i >= byteArray.get().length) {
+ break;
+ }
+ char ch = getASCIICharFromOffset(offset + i);
+ if (ch == 0) {
+ break; //Terminate on null characters.
+ }
+ str.append(getASCIICharFromOffset(offset + i));
+ }
+ return str.toString();
+ }
+
+ public final int getASCIIChars(int offset, int msb, int lsb, char[] destination) {
+ offset += _offset;
+ int size = (lsb - msb + 1) / 8;
+ int destIndex = 0;
+
+ for (int i = 0; i < size; i++) {
+ if (offset + i >= byteArray.get().length) {
+ break;
+ }
+ char ch = getASCIICharFromOffset(offset + i);
+ destination[destIndex] = ch;
+ destIndex++;
+ }
+ return destIndex;
+ }
+
+ public boolean asciiEquals(int offset, int msb, int lsb, String other) {
+ offset += _offset;
+ int size = (lsb - msb + 1) / 8;
+ if (other.length() > size) {
+ return false;
+ }
+ boolean isEqual = true;
+ for (int i = 0; i < size && isEqual; i++) {
+ char ch = getASCIICharFromOffset(offset + i);
+ if (ch != 0) {// NOTE this was done to be compatible with java
+ // Strings that don't null char termination
+ isEqual = ch == other.charAt(i);
+ }
+ }
+ return isEqual;
+ }
+
+ public void setBoolean(boolean v, int offset, int msb, int lsb) {
+ int i = v ? 1 : 0;
+ if (lsb < 32) {
+ setInt(i, offset, msb, lsb);
+ } else {
+ throw new RuntimeException("Not supported lsb = " + lsb);
+ }
+ }
+
+ public final void setByte(int v, int offset, int msb, int lsb) {
+ offset += _offset;
+ if (msb == 0 && lsb == 7) {
+ setByteFromOffset(v, offset);
+ } else {
+ if ((v & 1 >>> 7 - (lsb - msb)) != 0) {
+ throw new IllegalArgumentException("Tried to set signal to value that is too large");
+ }
+ int mask = createMask(msb, lsb, 7);
+ v = v << 7 - lsb;
+ v &= ~mask;
+ setByteFromOffset(v | getByteFromOffset(offset) & mask, offset);
+ }
+ }
+
+ public final void setBytesInHeader(int v, int offset, int msb, int lsb) {
+ if (offset > _offset) {
+ throw new IllegalArgumentException("Data beyond header attempting to be set!!!");
+ }
+ if (msb == 0 && lsb == 7) {
+ setByteFromOffset(v, offset);
+ } else {
+ if ((v & 1 >>> 7 - (lsb - msb)) != 0) {
+ throw new IllegalArgumentException("Tried to set signal to value that is too large");
+ }
+ int mask = (1 << 7 - lsb) - 1;
+ mask = mask | 0xFFFFFF00 >>> msb;
+ v = v << 7 - lsb;
+ setByteFromOffset(v | getByteFromOffset(offset) & mask, offset);
+ }
+ }
+
+ private final void setByteFromOffset(int v, int offset) {
+ byteArray.get()[offset] = (byte) v;
+ _dataHasChanged = true;
+ }
+
+ public void setOffset(int offset) {
+ this._offset = offset;
+ }
+
+ public final void setInt(int v, int offset, int msb, int lsb) {
+ offset += _offset;
+ final byte[] data = byteArray.get();
+ final int length = data.length;
+ final int beginByte = offset + msb / 8;
+ int endByte = offset + lsb / 8;
+ endByte = endByte < length ? endByte : length - 1;
+ final int lsbMod = lsb % 8;
+ if (endByte != beginByte) {
+ byte mask = (byte) (0xFF >>> lsbMod + 1); // mask used to mask off bits we shouldn't touch
+ data[endByte] &= mask; // zero out bits that will be set by v
+ v <<= 7 - lsbMod; // shift v so that it lines up
+ data[endByte] |= v;
+ v >>>= 8; // shift to the next byte
+ for (int i = endByte - 1; i >= beginByte + 1; i--) {
+ data[i] = (byte) v;
+ v >>>= 8; // shift to the next byte
+ }
+ mask = (byte) (0xFF >>> msb % 8);
+ v &= mask;
+ data[beginByte] &= ~mask;
+ data[beginByte] |= v;
+ } else {
+ byte mask = (byte) (-1 << lsb - msb + 1); // create mask for everything left of msb
+ v &= ~mask; // mask off everything to the left of the msb in the value
+ int shift = 7 - lsbMod;
+ mask <<= shift; // shift mask to align with the lsb
+ v <<= shift; // shift value so that it aligns with the lsb
+ mask |= (byte) (0xFF >>> lsbMod + 1); // union the mask so that it mask everything to the right of the lsb
+ data[beginByte] &= mask; // zero out the bits about to be written to
+ data[beginByte] |= v; // logical 'OR' in the value
+ }
+ _dataHasChanged = true;
+ }
+
+ private int createMask(int msb, int lsb, int maxBitPosition) {
+ int maximumElementValue = (int) Math.pow(2, lsb - msb + 1) - 1;
+ int maxValueInPosition = maximumElementValue << maxBitPosition - lsb;
+ //the mask is all ones except at the bit positions we are setting
+ int mask = ~maxValueInPosition;
+ return mask;
+ }
+
+ public final void setLong(long v, int offset, int msb, int lsb) {
+ if (lsb - msb < 64) {
+ offset += _offset;
+ final byte[] data = byteArray.get();
+ final int length = data.length;
+ final int beginByte = offset + msb / 8;
+ int endByte = offset + lsb / 8;
+ endByte = endByte < length ? endByte : length - 1;
+ final int lsbMod = lsb % 8;
+ if (endByte != beginByte) {
+ byte mask = (byte) (0xFF >>> lsbMod + 1); // mask used to mask off bits we shouldn't touch
+ data[endByte] &= mask; // zero out bits that will be set by v
+ v <<= 7 - lsbMod; // shift v so that it lines ups
+ data[endByte] |= v;
+ v >>>= 8;
+ for (int i = endByte - 1; i >= beginByte + 1; i--) {
+ data[i] = (byte) v;
+ v >>>= 8;
+ }
+ mask = (byte) (0xFF >>> msb % 8);
+ v &= mask;
+ data[beginByte] &= ~mask;
+ data[beginByte] |= v;
+ } else {
+ byte mask = (byte) (-1 << lsb - msb + 1);
+ v &= ~mask;
+ int shift = 7 - lsbMod;
+ mask <<= shift;
+ v <<= shift;
+ mask |= (byte) (0xFF >>> lsbMod + 1);
+ data[beginByte] &= mask;
+ data[beginByte] |= v;
+ }
+ _dataHasChanged = true;
+ } else {
+ throw new IllegalArgumentException("not supported bit width of " + (lsb - msb + 1));
+ }
+ }
+
+ public final void setASCIIString(String s, int offset, int msb, int lsb) {
+ int size = (lsb - msb + 1) / 8;
+ int limit = Math.min(s.length(), size);
+ System.arraycopy(s.getBytes(US_ASCII_CHARSET), 0, byteArray.get(), _offset + offset, limit);
+ zeroizeFromOffset(limit + offset, size - limit);
+ _dataHasChanged = true;
+ }
+
+ public final void setASCIIString(String s, int offset) {
+ System.arraycopy(s.getBytes(US_ASCII_CHARSET), 0, byteArray.get(), _offset + offset, s.length());
+ _dataHasChanged = true;
+ }
+
+ public void zeroizeFromOffset(int offset, int size) {
+ offset += _offset;
+ Arrays.fill(byteArray.get(), offset, offset + size, (byte) 0);
+ _dataHasChanged = true;
+ }
+
+ public boolean getBoolean(int offset, int msb, int lsb) {
+ return getInt(offset, msb, lsb) != 0;
+ }
+
+ public void copyData(int offset, byte[] src, int srcOffset, int length) {
+ // assert(byteArray.get().length >= length );
+ if (length + offset > byteArray.get().length) {
+ throw new MessageSystemException("backing byte[] is too small for copy operation", Level.SEVERE);
+ }
+ System.arraycopy(src, srcOffset, byteArray.get(), offset, length);
+ Arrays.fill(byteArray.get(), offset + length, byteArray.get().length, (byte) 0);
+ _dataHasChanged = true;
+ }
+
+ public void copyData(ByteBuffer src) {
+ copyData(0, src, src.remaining());
+ }
+
+ /**
+ * @param destOffset offset in this memory resource in which the copy will begin
+ */
+ public void copyData(int destOffset, ByteBuffer src, int length) throws MessageSystemException {
+ if (length + destOffset > byteArray.get().length) {
+ throw new MessageSystemException("backing byte[] is too small for copy operation", Level.INFO);
+ }
+ if (src.hasArray()) {
+ System.arraycopy(src.array(), src.arrayOffset() + src.position(), byteArray.get(), destOffset, length);
+ } else {
+ synchronized (src) {
+ src.mark();
+ src.get(byteArray.get(), destOffset, length);
+ src.reset();
+ }
+ }
+ Arrays.fill(byteArray.get(), destOffset + length, byteArray.get().length, (byte) 0);
+ _dataHasChanged = true;
+ }
+
+ public ByteBuffer getAsBuffer() {
+ return ByteBuffer.wrap(byteArray.get());
+ }
+
+ public ByteBuffer getBuffer() {
+ return byteArray.getByteBuffer();
+ }
+
+ // public void set(ByteBuffer other) {
+ // buffer.put(other);
+ // }
+ public ByteBuffer getAsBuffer(int offset, int length) {
+ if (offset > byteArray.get().length) {
+ throw new IllegalArgumentException(
+ "offset of " + offset + " cannot be bigger than data length of " + byteArray.get().length);
+ }
+ if (offset + length > byteArray.get().length) {
+ throw new IllegalArgumentException(
+ "offset (" + offset + ") plus length (" + length + ") is greater than data length of " + byteArray.get().length);
+ }
+ return ByteBuffer.wrap(byteArray.get(), offset, length);
+ }
+
+ public int getOffset() {
+ return _offset;
+ }
+
+ public int getLength() {
+ return _length;
+ }
+
+ public MemoryResource slice(int offset, int length) {
+ return new MemoryResource(byteArray, offset, length);
+ }
+
+ /**
+ * @return the _dataHasChanged
+ */
+ public boolean isDataChanged() {
+ return _dataHasChanged;
+ }
+
+ /**
+ * @param hasChanged the _dataHasChanged to set
+ */
+ public void setDataHasChanged(boolean hasChanged) {
+ _dataHasChanged = hasChanged;
+ }
+
+ public static void main(String[] args) {
+
+ MemoryResource mem = new MemoryResource(new byte[24], 4, 24);
+ mem.setLong(0x1234567890abcdefL, 12, 0, 63);
+ for (int i = 0; i < 24; i++) {
+ System.out.printf("%02x ", mem.getData()[i]);
+ }
+ System.out.printf("\nget=%016x\n", mem.getLong(12, 0, 63));
+
+ mem.setLong(0xff22cc00aa11L, 12, 0, 43);
+ for (int i = 0; i < 24; i++) {
+ System.out.printf("%02x ", mem.getData()[i]);
+ }
+ System.out.printf("\nget=%016x\n", mem.getLong(12, 0, 43));
+
+ mem.setLong(0xffdd555522L, 12, 2, 41);
+ for (int i = 0; i < 24; i++) {
+ System.out.printf("%02x ", mem.getData()[i]);
+ }
+ System.out.printf("\nget=%016x\n", mem.getLong(12, 2, 41));
+
+ mem.setLong(0x00L, 12, 2, 41);
+ for (int i = 0; i < 24; i++) {
+ System.out.printf("%02x ", mem.getData()[i]);
+ }
+ System.out.printf("\nget=%016x\n", mem.getLong(12, 2, 41));
+
+ mem.setLong(0x035544332211L, 12, 2, 43);
+ for (int i = 0; i < 24; i++) {
+ System.out.printf("%02x ", mem.getData()[i]);
+ }
+ System.out.printf("\nget=%016x\n", mem.getLong(12, 2, 43));
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/MemoryResourceByteBuffer.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/MemoryResourceByteBuffer.java
new file mode 100644
index 000000000..e99fcec22
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/MemoryResourceByteBuffer.java
@@ -0,0 +1,515 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.data;
+
+import java.nio.ByteBuffer;
+import java.util.logging.Level;
+import org.eclipse.osee.ote.message.MessageSystemException;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class MemoryResourceByteBuffer {
+ private byte _data[];
+ private final int _offset;
+ public boolean _dataHasChanged;
+
+ private final ByteBuffer buffer;
+
+ public MemoryResourceByteBuffer(byte data[], int offset, int length) {
+ _data = data;
+ _offset = offset;
+ _dataHasChanged = false;
+ buffer = ByteBuffer.wrap(_data);
+ }
+
+ public void setData(byte data[]) {
+ _data = data;
+ _dataHasChanged = true;
+ }
+
+ public byte[] getData() {
+ return _data;
+ }
+
+ public long getRawDataLong(int offset, int msb, int lsb) {
+
+ if (lsb < 8) {
+ return getByte(offset, msb, lsb);
+ } else if (lsb < 16) {
+ return getShort(offset, msb, lsb);
+ } else if (lsb < 32) {
+ offset += _offset;
+ if (msb == 0 && lsb == 31) {
+ return getIntFromOffset(offset);
+ } else {
+ int i = getIntFromOffset(offset);
+ int mask = (1 << 32 - msb) - 1;
+ mask = mask & 0x80000000 >>> lsb;
+ return (i & mask) >> 31 - lsb;
+ }
+ } else if (lsb == 63) {
+ return getLong(offset, msb, lsb);
+ } else {
+ throw new IllegalArgumentException("lsb greater than 63");
+ }
+ }
+
+ public int getRawDataInt(int offset, int msb, int lsb) {
+
+ if (lsb < 8) {
+ return getByte(offset, msb, lsb);
+ } else if (lsb < 16) {
+ return getShort(offset, msb, lsb);
+ } else if (lsb < 32) {
+ offset += _offset;
+ if (msb == 0 && lsb == 31) {
+ return getIntFromOffset(offset);
+ } else {
+ int i = getIntFromOffset(offset);
+ int mask = (1 << 32 - msb) - 1;
+ mask = mask & 0x80000000 >>> lsb;
+ return (i & mask) >> 31 - lsb;
+ }
+ } else {
+ throw new IllegalArgumentException("lsb greater than 31");
+ }
+ }
+
+ public void setRawData(long v, int offset, int msb, int lsb) {
+ if (lsb < 8) {
+ setByte((int) v, offset, msb, lsb);
+ } else if (lsb < 16) {
+ setShort((int) v, offset, msb, lsb);
+ } else if (lsb < 32) {
+ setInt((int) v, offset, msb, lsb);
+ } else {
+ setLong(v, offset, msb, lsb);
+ }
+ }
+
+ public byte getByte(int offset, int msb, int lsb) {
+ offset += _offset;
+ if (msb == 0 && lsb == 7) {
+ return getByteFromOffset(offset);
+ } else {
+ int b = getByteFromOffset(offset);
+ int mask = (1 << 8 - msb) - 1;
+ mask = mask & 0xFFFFFF80 >>> lsb;
+ return (byte) ((b & mask) >> 7 - lsb);
+ }
+ }
+
+ private byte getByteFromOffset(int offset) {
+ return _data[offset];
+ }
+
+ public short getShort(int offset, int msb, int lsb) {
+ offset += _offset;
+ if (msb == 0 && lsb == 15) {
+ return getShortFromOffset(offset);
+ } else {
+ int s = getShortFromOffset(offset);
+ int mask = (1 << 16 - msb) - 1;
+ mask = mask & 0xFFFF8000 >>> lsb;
+ return (short) ((s & mask) >> 15 - lsb);
+ }
+ }
+
+ private short getShortFromOffset(int offset) {
+ int ch1 = _data[offset] & 0xFF;
+ int ch2 = _data[offset + 1] & 0xFF;
+ return (short) ((ch1 << 8) + (ch2 << 0));
+ }
+
+ public char getASCIIChar(int offset, int msb, int lsb) {
+ offset += _offset;
+ if (msb == 0 && lsb == 7) {
+ return getASCIICharFromOffset(offset);
+ } else if (msb == 8 && lsb == 15) {
+ return getASCIICharFromOffset(offset + 1);
+ } else if (msb == 16 && lsb == 23) {
+ return getASCIICharFromOffset(offset + 2);
+ } else if (msb == 24 && lsb == 31) {
+ return getASCIICharFromOffset(offset + 3);
+ } else {
+ throw new IllegalArgumentException("not supported");
+ }
+ }
+
+ private final char getASCIICharFromOffset(int offset) {
+ return (char) _data[offset];
+ }
+
+ public int getInt(int offset, int msb, int lsb) {
+
+ int nextFourBytes = getIntFromOffset(offset + _offset);
+
+ int bitsToShift = 32 - msb;
+ int maskLeft = msb == 0 ? -1 : (1 << bitsToShift) - 1;//(int)Math.pow(2, 32 - msb ) -1;
+
+ int retVal = (nextFourBytes & maskLeft) >>> 31 - lsb;
+ return retVal;
+
+ // if (lsb < 8) {
+ // return getByte(offset, msb, lsb);
+ // }
+ // else if (lsb < 16) {
+ // return getShort(offset, msb, lsb);
+ // }
+ // else if (lsb < 32) {
+ // offset += _offset;
+ // if (msb == 0 && lsb == 31) {
+ // return getIntFromOffset(offset);
+ // }
+ // else {
+ // int i = getIntFromOffset(offset);
+ // int mask = (1 << (32 - msb)) - 1;
+ // mask = mask & (0x80000000 >>> lsb);
+ // return (i & mask) >> (31 - lsb);
+ // }
+ // }
+ // else {
+ // throw new IllegalArgumentException("lsb greater than 31");
+ // }
+ }
+
+ private int getIntFromOffset(int offset) {
+ int ch1 = 0, ch2 = 0, ch3 = 0, ch4 = 0;
+
+ if (_data.length > offset) {
+ ch1 = _data[offset] & 0xFF;
+ }
+ if (_data.length > offset + 1) {
+ ch2 = _data[offset + 1] & 0xFF;
+ }
+ if (_data.length > offset + 2) {
+ ch3 = _data[offset + 2] & 0xFF;
+ }
+ if (_data.length > offset + 3) {
+ ch4 = _data[offset + 3] & 0xFF;
+ }
+ return (ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0);
+ }
+
+ public final long getLong(int offset, int msb, int lsb) {
+ offset += _offset;
+ if (msb == 0 && lsb == 63) {
+ return getLongFromOffset(offset);
+ } else {
+ throw new IllegalArgumentException("gettting long with bits not supported");
+ }
+ }
+
+ private final long getLongFromOffset(int offset) {
+ long byte1 = 0, byte2 = 0, byte3 = 0, byte4 = 0, byte5 = 0, byte6 = 0, byte7 = 0, byte8 = 0;
+
+ if (_data.length > offset) {
+ byte1 = _data[offset];
+ }
+ if (_data.length > offset + 1) {
+ byte2 = _data[offset + 1];
+ }
+ if (_data.length > offset + 2) {
+ byte3 = _data[offset + 2];
+ }
+ if (_data.length > offset + 3) {
+ byte4 = _data[offset + 3];
+ }
+ if (_data.length > offset + 4) {
+ byte5 = _data[offset + 4];
+ }
+ if (_data.length > offset + 5) {
+ byte6 = _data[offset + 5];
+ }
+ if (_data.length > offset + 6) {
+ byte7 = _data[offset + 6];
+ }
+ if (_data.length > offset + 7) {
+ byte8 = _data[offset + 7];
+ }
+
+ long retVal =
+ (byte1 << 56) + ((byte2 & 0xFF) << 48) + ((byte3 & 0xFF) << 40) + ((byte4 & 0xFF) << 32) + ((byte5 & 0xFF) << 24) + ((byte6 & 0xFF) << 16) + ((byte7 & 0xFF) << 8) + (byte8 & 0xFF);
+
+ return retVal;
+ // return (((long) _data[offset] << 56) + ((long) (_data[offset + 1] & 255) << 48)
+ // + ((long) (_data[offset + 2] & 255) << 40) + ((long) (_data[offset + 3] & 255) << 32)
+ // + ((long) (_data[offset + 4] & 255) << 24) + ((_data[offset + 5] & 255) << 16)
+ // + ((_data[offset + 6] & 255) << 8) + ((_data[offset + 7] & 255) << 0));
+ }
+
+ public final String getASCIIString(int offset, int length) {
+ offset += _offset;
+ // int size = ((lsb - msb) + 1) / 8;
+
+ StringBuffer str = new StringBuffer(length);
+ for (int i = 0; i < length; i++) {
+ char ch = getASCIICharFromOffset(offset + i);
+ if (ch != 0) {// NOTE this was done to be compatible with java
+ // Strings that don't null char termination
+ str.append(getASCIICharFromOffset(offset + i));
+ }
+ }
+ return str.toString();
+ }
+
+ public final String getASCIIString(int offset, int msb, int lsb) {
+ offset += _offset;
+ int size = (lsb - msb + 1) / 8;
+
+ StringBuffer str = new StringBuffer(size);
+ for (int i = 0; i < size; i++) {
+ char ch = getASCIICharFromOffset(offset + i);
+ if (ch != 0) {// NOTE this was done to be compatible with java
+ // Strings that don't null char termination
+ str.append(getASCIICharFromOffset(offset + i));
+ }
+ }
+ return str.toString();
+ }
+
+ public void setBoolean(boolean v, int offset, int msb, int lsb) {
+ int i = v ? 1 : 0;
+ if (lsb < 8) {
+ setByte(i, offset, msb, lsb);
+ } else if (lsb < 16) {
+ setShort(i, offset, msb, lsb);
+ } else if (lsb < 32) {
+ setInt(i, offset, msb, lsb);
+ } else {
+ throw new RuntimeException("Not supported lsb = " + lsb);
+ }
+ }
+
+ public final void setByte(int v, int offset, int msb, int lsb) {
+ offset += _offset;
+ if (msb == 0 && lsb == 7) {
+ setByteFromOffset(v, offset);
+ } else {
+ if ((v & 1 >>> 7 - (lsb - msb)) != 0) {
+ throw new IllegalArgumentException("Tried to set signal to value that is too large");
+ }
+ int mask = createMask(msb, lsb, 7);
+ v = v << 7 - lsb;
+ setByteFromOffset(v | getByteFromOffset(offset) & mask, offset);
+ }
+ }
+
+ public final void setBytesInHeader(int v, int offset, int msb, int lsb) {
+ if (offset > _offset) {
+ throw new IllegalArgumentException("Data beyond header attempting to be set!!!");
+ }
+ if (msb == 0 && lsb == 7) {
+ setByteFromOffset(v, offset);
+ } else {
+ if ((v & 1 >>> 7 - (lsb - msb)) != 0) {
+ throw new IllegalArgumentException("Tried to set signal to value that is too large");
+ }
+ int mask = (1 << 7 - lsb) - 1;
+ mask = mask | 0xFFFFFF00 >>> msb;
+ v = v << 7 - lsb;
+ setByteFromOffset(v | getByteFromOffset(offset) & mask, offset);
+ }
+ }
+
+ private final void setByteFromOffset(int v, int offset) {
+ _data[offset] = (byte) v;
+ _dataHasChanged = true;
+ }
+
+ private final void setShort(int v, int offset, int msb, int lsb) {
+ offset += _offset;
+ if (msb == 0 && lsb == 15) {
+ setShortFromOffset(v, offset);
+ } else {
+ if ((v & 1 >>> 15 - (lsb - msb)) != 0) {
+ throw new IllegalArgumentException("Tried to set signal to value that is too large");
+ }
+ int mask = createMask(msb, lsb, 15);
+
+ // shift the value into the correct position within the whole int
+ v = v << 15 - lsb;
+ // zero out the element we are setting before oring in the new value
+ setShortFromOffset(v | getShortFromOffset(offset) & mask, offset);
+ }
+ }
+
+ private final void setShortFromOffset(int v, int offset) {
+ _data[offset] = (byte) (v >>> 8 & 0xFF);
+ _data[offset + 1] = (byte) (v >>> 0 & 0xFF);
+ _dataHasChanged = true;
+ }
+
+ public final void setASCIIChar(char v, int offset, int msb, int lsb) {
+ offset += _offset;
+ if (msb == 0 && lsb == 7) {
+ setASCIICharFromOffset(v, offset);
+ } else if (msb == 8 && lsb == 15) {
+ setASCIICharFromOffset(v, offset + 1);
+ } else if (msb == 16 && lsb == 23) {
+ setASCIICharFromOffset(v, offset + 2);
+ } else if (msb == 24 && lsb == 31) {
+ setASCIICharFromOffset(v, offset + 3);
+ } else {
+ throw new IllegalArgumentException("only 8 bit char supported");
+ }
+ }
+
+ private final void setASCIICharFromOffset(char v, int offset) {
+ _data[offset] = (byte) (v & 0xFF);
+ _dataHasChanged = true;
+ }
+
+ public final void setInt(int v, int offset, int msb, int lsb) {
+ if (lsb < 8) {
+ setByte(v, offset, msb, lsb);
+ } else if (lsb < 16) {
+ setShort(v, offset, msb, lsb);
+ } else {
+ offset += _offset;
+ if (msb == 0 && lsb == 31) {
+ setIntFromOffset(v, offset);
+ } else {
+ if ((v & 1 >>> 31 - (lsb - msb)) != 0) {
+ throw new IllegalArgumentException("Tried to set signal to value that is too large");
+ }
+ int mask = createMask(msb, lsb, 31);
+ // shift the value into the correct position within the whole int
+ v = v << 31 - lsb;
+ // zero out the element we are setting before oring in the new value
+ setIntFromOffset(v | getIntFromOffset(offset) & mask, offset);
+ }
+ }
+ }
+
+ private int createMask(int msb, int lsb, int maxBitPosition) {
+ int maximumElementValue = (int) Math.pow(2, lsb - msb + 1) - 1;
+ int maxValueInPosition = maximumElementValue << maxBitPosition - lsb;
+ //the mask is all ones except at the bit positions we are setting
+ int mask = ~maxValueInPosition;
+ return mask;
+ }
+
+ private final void setIntFromOffset(int v, int offset) {
+ if (_data.length > offset) {
+ _data[offset] = (byte) (v >>> 24 & 0xFF);
+ }
+ if (_data.length > offset + 1) {
+ _data[offset + 1] = (byte) (v >>> 16 & 0xFF);
+ }
+ if (_data.length > offset + 2) {
+ _data[offset + 2] = (byte) (v >>> 8 & 0xFF);
+ }
+ if (_data.length > offset + 3) {
+ _data[offset + 3] = (byte) (v >>> 0 & 0xFF);
+ }
+ _dataHasChanged = true;
+ }
+
+ public final void setLong(long v, int offset, int msb, int lsb) {
+ offset += _offset;
+ if (msb == 0 && lsb == 63) {
+ setLongFromOffset(v, offset);
+ } else {
+ throw new IllegalArgumentException("not supported");
+ }
+ }
+
+ private final void setLongFromOffset(long v, int offset) {
+ if (_data.length > offset) {
+ _data[offset] = (byte) (v >>> 56);
+ }
+ if (_data.length > offset + 1) {
+ _data[offset + 1] = (byte) (v >>> 48);
+ }
+ if (_data.length > offset + 2) {
+ _data[offset + 2] = (byte) (v >>> 40);
+ }
+ if (_data.length > offset + 3) {
+ _data[offset + 3] = (byte) (v >>> 32);
+ }
+ if (_data.length > offset + 4) {
+ _data[offset + 4] = (byte) (v >>> 24);
+ }
+ if (_data.length > offset + 5) {
+ _data[offset + 5] = (byte) (v >>> 16);
+ }
+ if (_data.length > offset + 6) {
+ _data[offset + 6] = (byte) (v >>> 8);
+ }
+ if (_data.length > offset + 7) {
+ _data[offset + 7] = (byte) (v >>> 0);
+ }
+ _dataHasChanged = true;
+ }
+
+ public final void setASCIIString(String s, int offset, int msb, int lsb) {
+ offset += _offset;
+ int size = (lsb - msb + 1) / 8;
+
+ int len = s.length();
+ for (int i = 0; i < len && i < size; i++) {
+ setASCIICharFromOffset(s.charAt(i), offset + i);
+ }
+ }
+
+ public final void setASCIIString(String s, int offset) {
+ offset += _offset;
+ int len = s.length();
+ for (int i = 0; i < len; i++) {
+ setASCIICharFromOffset(s.charAt(i), offset + i);
+ }
+ }
+
+ public boolean getBoolean(int offset, int msb, int lsb) {
+ int i;
+ if (lsb < 8) {
+ i = getByte(offset, msb, lsb);
+ } else if (lsb < 16) {
+ i = getShort(offset, msb, lsb);
+ } else {
+ i = getInt(offset, msb, lsb);
+ }
+ return i != 0;
+ }
+
+ public void copyData(int offset, byte[] src, int srcOffset, int length) {
+ // assert(_data.length >= length );
+ if (_data.length < src.length) {
+ throw new MessageSystemException("backing byte[] is too small for copy operation", Level.SEVERE);
+ }
+ System.arraycopy(src, srcOffset, _data, offset, length);
+ _dataHasChanged = true;
+ }
+
+ public void copyData(ByteBuffer src) {
+ src.get(_data);
+ _dataHasChanged = true;
+ }
+
+ public void copyData(int offset, ByteBuffer src, int length) {
+ src.get(_data, offset, length);
+ _dataHasChanged = true;
+ }
+
+ public ByteBuffer getAsBuffer() {
+ return ByteBuffer.wrap(_data);
+ }
+
+ public void set(ByteBuffer other) {
+ buffer.put(other);
+ }
+
+ public ByteBuffer getAsBuffer(int offset, int length) {
+ return ByteBuffer.wrap(_data, offset, length);
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/MessageData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/MessageData.java
new file mode 100644
index 000000000..fc4afbde7
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/data/MessageData.java
@@ -0,0 +1,690 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.data;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Locale;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.CopyOnWriteNoIteratorList;
+import org.eclipse.osee.ote.core.GCHelper;
+import org.eclipse.osee.ote.core.log.Env;
+import org.eclipse.osee.ote.message.IMessageDisposeListener;
+import org.eclipse.osee.ote.message.IMessageHeader;
+import org.eclipse.osee.ote.message.IMessageSendListener;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.MessageSystemException;
+import org.eclipse.osee.ote.message.MessageSystemTestEnvironment;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.interfaces.Namespace;
+import org.eclipse.osee.ote.messaging.dds.Data;
+import org.eclipse.osee.ote.messaging.dds.DataSample;
+import org.eclipse.osee.ote.messaging.dds.IDestination;
+import org.eclipse.osee.ote.messaging.dds.ISource;
+import org.eclipse.osee.ote.messaging.dds.ReturnCode;
+import org.eclipse.osee.ote.messaging.dds.entity.DataReader;
+import org.eclipse.osee.ote.messaging.dds.entity.DataWriter;
+import org.eclipse.osee.ote.messaging.dds.listener.DataReaderListener;
+import org.eclipse.osee.ote.messaging.dds.listener.DataWriterListener;
+import org.eclipse.osee.ote.messaging.dds.service.Key;
+import org.eclipse.osee.ote.messaging.dds.service.TypeSupport;
+import org.eclipse.osee.ote.messaging.dds.status.LivelinessChangedStatus;
+import org.eclipse.osee.ote.messaging.dds.status.LivelinessLostStatus;
+import org.eclipse.osee.ote.messaging.dds.status.OfferedDeadlineMissedStatus;
+import org.eclipse.osee.ote.messaging.dds.status.OfferedIncompatibleQosStatus;
+import org.eclipse.osee.ote.messaging.dds.status.PublicationMatchStatus;
+import org.eclipse.osee.ote.messaging.dds.status.RequestedDeadlineMissedStatus;
+import org.eclipse.osee.ote.messaging.dds.status.RequestedIncompatibleQosStatus;
+import org.eclipse.osee.ote.messaging.dds.status.SampleLostStatus;
+import org.eclipse.osee.ote.messaging.dds.status.SampleRejectedStatus;
+import org.eclipse.osee.ote.messaging.dds.status.SubscriptionMatchStatus;
+import org.eclipse.osee.ote.properties.OtePropertiesCore;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public abstract class MessageData implements DataReaderListener, DataWriterListener, Data, Key {
+
+ private static long debugTimeout = OtePropertiesCore.timeDebugTimeout.getLongValue();
+ private static boolean debugTime = OtePropertiesCore.timeDebug.getBooleanValue();
+
+ private DataWriter writer;
+ private DataReader reader;
+ private DataSample myDataSample;
+
+ private final MemoryResource mem;
+ private final String typeName;
+ private final String name;
+ private final CopyOnWriteNoIteratorList<Message> messages = new CopyOnWriteNoIteratorList<>(Message.class);
+ private final CopyOnWriteNoIteratorList<IMessageSendListener> messageSendListeners = new CopyOnWriteNoIteratorList<>(IMessageSendListener.class);
+ private final int defaultDataByteSize;
+ private final DataType memType;
+ private final boolean isEnabled = true;
+ private long activityCount = 0;
+ private long sentCount;
+ private int currentLength;
+ private boolean isScheduled = false;
+ private long time = -1;
+
+ public MessageData(String typeName, String name, int dataByteSize, int offset, DataType memType) {
+ mem = new MemoryResource(new byte[dataByteSize], offset, dataByteSize - offset);
+ myDataSample = new DataSample(this);
+ this.typeName = typeName;
+ this.name = name;
+ this.defaultDataByteSize = dataByteSize;
+ this.currentLength = dataByteSize;
+ this.memType = memType;
+ }
+
+ public MessageData(String typeName, String name, MemoryResource mem, DataType memType) {
+ this.mem = mem;
+ myDataSample = new DataSample(this);
+ this.typeName = typeName;
+ this.name = name;
+ this.defaultDataByteSize = mem.getLength();
+ this.currentLength = mem.getLength();
+ this.memType = memType;
+ GCHelper.getGCHelper().addRefWatch(this);
+ }
+
+ public MessageData(String name, int dataByteSize, int offset, DataType memType) {
+ this(name, name, dataByteSize, offset, memType);
+ }
+
+ public MessageData(byte[] data, int dataByteSize, int offset) {
+ this.mem = new MemoryResource(data, offset, dataByteSize - offset);
+ this.typeName = "";
+ this.name = "";
+ this.defaultDataByteSize = dataByteSize;
+ this.currentLength = dataByteSize;
+ this.memType = null;
+ GCHelper.getGCHelper().addRefWatch(this);
+ }
+
+ public MessageData(MemoryResource memoryResource) {
+ this("", memoryResource);
+ }
+
+ public MessageData(String name, MemoryResource memoryResource) {
+ this.mem = memoryResource;
+ this.typeName = "";
+ this.name = name;
+ this.defaultDataByteSize = memoryResource.getLength();
+ this.currentLength = memoryResource.getLength();
+ this.memType = null;
+ GCHelper.getGCHelper().addRefWatch(this);
+ }
+
+ public abstract IMessageHeader getMsgHeader();
+
+ public DataType getType() {
+ return memType;
+ }
+
+ /**
+ * Returns the number of byte words in the payload of this message.
+ *
+ * @return the number of bytes in the message payload
+ */
+ public int getPayloadSize() {
+ return currentLength;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * adds a {@link Message} who are mapped to this data object
+ */
+ public void addMessage(Message message) {
+ if (!messages.contains(message)) {
+ messages.add(message);
+ message.addPreMessageDisposeListener(disposeListener);
+ }
+ }
+
+ /**
+ * returns a list of the message that this data is a source for. <BR>
+ *
+ * @return a collection of messages
+ */
+ public Collection<Message> getMessages() {
+ return messages.fillCollection(new ArrayList<Message>());
+ // return new ArrayList<Message>(messages);
+ }
+
+ /**
+ * @return Returns the activityCount.
+ */
+ public long getActivityCount() {
+ return activityCount;
+ }
+
+ /**
+ * @param activityCount The activityCount to set.
+ */
+ public void setActivityCount(long activityCount) {
+ this.activityCount = activityCount;
+ }
+
+ public void incrementActivityCount() {
+ activityCount++;
+ }
+
+ public void incrementSentCount() {
+ sentCount++;
+ }
+
+ public long getSentCount() {
+ return sentCount;
+ }
+
+ public boolean isEnabled() {
+ return isEnabled;
+ }
+
+ public abstract void visit(IMessageDataVisitor visitor);
+
+ public void dispose() {
+
+ try{
+ Message[] msgs = messages.get();
+ for (int i = 0; i < msgs.length; i++){
+ Message local = msgs[i];
+ if(local != null){
+ local.removePreMessageDisposeListener(disposeListener);
+ }
+ }
+ } catch (Throwable th){
+ OseeLog.log(getClass(), Level.SEVERE, "failed to remove message dispose listener.", th);
+ }
+ messages.clear();
+ if (writer != null) {
+ writer.getPublisher().deleteDataWriter(writer);
+ writer.dispose(this, null);
+ writer = null;
+ } else if (reader != null && reader.getSubscriber() != null) {
+ reader.getSubscriber().deleteDataReader(reader);
+ reader.dispose();
+ reader = null;
+ }
+ disposeListener = null;
+ }
+
+ public void copyData(int destOffset, byte[] data, int srcOffset, int length) {
+ setCurrentLength(length + destOffset);
+ mem.copyData(destOffset, data, srcOffset, length);
+ }
+
+ public void copyData(int destOffset, ByteBuffer data, int length) throws MessageSystemException {
+ try {
+ setCurrentLength(destOffset + length);
+ mem.copyData(destOffset, data, length);
+ } catch (MessageSystemException ex) {
+ OseeLog.logf(MessageSystemTestEnvironment.class, Level.INFO, ex,
+ "increasing backing store for %s to %d. prev length: %d, recv cnt: %d", getName(), destOffset + length,
+ mem.getData().length, this.activityCount);
+ setNewBackingBuffer(data, destOffset, length);
+ }
+ }
+
+ public void copyData(ByteBuffer data) {
+ copyData(0, data, data.remaining());
+ }
+
+ /**
+ * Notifies all {@link Message}s that have this registered as a data source of the update
+ */
+ public void notifyListeners() throws MessageSystemException {
+ final DataType memType = getType();
+ Message[] ref = messages.get();
+ for (int i = 0; i < ref.length; i++) {
+ Message message = ref[i];
+ try {
+ if (!message.isDestroyed()) {
+ message.notifyListeners(this, memType);
+ }
+ } catch (Throwable t) {
+ final String msg =
+ String.format("Problem during listener notification for message %s. Data=%s, MemType=%s",
+ message.getName(), this.getName(), this.getType());
+ OseeLog.log(MessageSystemTestEnvironment.class, Level.SEVERE, msg, t);
+ }
+ }
+ }
+
+ /**
+ * @return the currentLength
+ */
+ public int getCurrentLength() {
+ return currentLength;
+ }
+
+ /**
+ * @param currentLength the currentLength to set
+ */
+ public void setCurrentLength(int currentLength) {
+ this.currentLength = currentLength;
+ }
+
+ /**
+ * Override this method if you need to set some default data in the backing buffer.
+ */
+ public void setNewBackingBuffer(byte[] data) {
+ setCurrentLength(data.length);
+ this.mem.setData(data);
+ if (this.getMsgHeader() != null) {
+ initializeDefaultHeaderValues();
+ } else {
+ // System.out.println("what??-- bad HeaderData");
+ }
+
+ }
+
+ public void setNewBackingBuffer(ByteBuffer buffer) {
+ byte[] data = new byte[buffer.remaining()];
+ buffer.get(data);
+ this.mem.setData(data);
+ setCurrentLength(data.length);
+ if (this.getMsgHeader() != null) {
+ initializeDefaultHeaderValues();
+ } else {
+ // System.out.println("what??-- bad HeaderData");
+ }
+ }
+
+ public void setNewBackingBuffer(ByteBuffer buffer, int offset, int length) {
+ byte[] data = new byte[offset + length];
+ buffer.get(data, offset, length);
+ this.mem.setData(data);
+ setCurrentLength(data.length);
+ if (this.getMsgHeader() != null) {
+ initializeDefaultHeaderValues();
+ } else {
+ // System.out.println("what??-- bad HeaderData");
+ }
+
+ }
+
+ public abstract void initializeDefaultHeaderValues();
+
+ /**
+ * @return the mem
+ */
+ public MemoryResource getMem() {
+ return mem;
+ }
+
+ public int getDefaultDataByteSize() {
+ return defaultDataByteSize;
+ }
+
+ @Override
+ public synchronized void onDataAvailable(DataReader theReader) {
+ // System.out.println(String.format("data available %s %s", this.getName(),
+ // this.getNamespace()));
+ if (isEnabled()) {
+ ReturnCode val = theReader.takeNextSample(myDataSample);
+ if (val == ReturnCode.OK) {
+ incrementActivityCount();
+ notifyListeners();
+ } else {
+ Env.getInstance().severe(val.getDescription());
+ }
+ }
+ }
+
+ @Override
+ public void onLivelinessChanged(DataReader theReader, LivelinessChangedStatus status) {
+ }
+
+ @Override
+ public void onRequestedDeadlineMissed(DataReader theReader, RequestedDeadlineMissedStatus status) {
+ }
+
+ @Override
+ public void onRequestedIncompatibleQos(DataReader theReader, RequestedIncompatibleQosStatus status) {
+ }
+
+ @Override
+ public void onSampleLost(DataReader theReader, SampleLostStatus status) {
+ }
+
+ @Override
+ public void onSampleRejected(DataReader theReader, SampleRejectedStatus status) {
+ }
+
+ @Override
+ public void onSubscriptionMatch(DataReader theReader, SubscriptionMatchStatus status) {
+ }
+
+ @Override
+ public synchronized void onDataSentToMiddleware(DataWriter theWriter) {
+ // header.setSequenceNumber(header.getSequenceNumber() + 1);
+ notifyListeners();
+ }
+
+ @Override
+ public void onLivelinessLost(DataWriter theWriter, LivelinessLostStatus status) {
+ }
+
+ @Override
+ public void onOfferedDeadlineMissed(DataWriter theWriter, OfferedDeadlineMissedStatus status) {
+ }
+
+ @Override
+ public void onOfferedIncompatibleQos(DataWriter theWriter, OfferedIncompatibleQosStatus status) {
+ }
+
+ @Override
+ public void onPublicationMatch(DataWriter theWriter, PublicationMatchStatus status) {
+ }
+
+ @Override
+ public Object getKeyValue() {
+ return null;
+ }
+
+ @Override
+ public void setFromByteArray(byte[] input) {
+ try {
+ copyData(0, input, 0, input.length);
+ } catch (MessageSystemException ex) {
+ OseeLog.logf(MessageSystemTestEnvironment.class, Level.WARNING,
+
+ "Copy Failed: setting new backing buffer. msg[%s], oldSize[%d] newSize[%d]", this.getName(),
+ this.mem.getData().length, input.length);
+ setNewBackingBuffer(input);
+ }
+ }
+
+ @Override
+ public void setFromByteBuffer(ByteBuffer buffer) {
+ try {
+ copyData(buffer);
+ } catch (Exception e) {
+ OseeLog.logf(MessageSystemTestEnvironment.class, Level.SEVERE,
+ "Copy Failed: setting new backing buffer. msg[%s], oldSize[%d] newSize[%d]", this.getName(),
+ this.mem.getData().length, buffer.limit());
+ setNewBackingBuffer(buffer);
+ }
+ }
+
+ @Override
+ public ByteBuffer toByteBuffer() {
+ return mem.getAsBuffer();
+ }
+
+ public void setFromByteArray(byte[] input, int length) {
+ try {
+ copyData(0, input, 0, length);
+ } catch (MessageSystemException ex) {
+ OseeLog.logf(MessageSystemTestEnvironment.class, Level.SEVERE,
+ "Copy Failed: setting new backing buffer. msg[%s], oldSize[%d] newSize[%d]", this.getName(),
+ this.mem.getData().length, length);
+ setNewBackingBuffer(input);
+ }
+ }
+
+ public void setFromByteArray(int destOffset, byte[] input, int srcOffset, int length) {
+ try {
+ copyData(destOffset, input, srcOffset, length);
+ } catch (MessageSystemException ex) {
+ OseeLog.logf(MessageSystemTestEnvironment.class, Level.SEVERE,
+ "Copy Failed: setting new backing buffer. msg[%s], oldSize[%d] newSize[%d]", this.getName(),
+ this.mem.getData().length, length);
+ setNewBackingBuffer(input);
+ }
+ }
+
+ public void setFromByteArray(ByteBuffer input, int length) {
+ try {
+ copyData(0, input, length);
+ } catch (MessageSystemException ex) {
+ OseeLog.logf(MessageSystemTestEnvironment.class, Level.SEVERE,
+ "Copy Failed: setting new backing buffer. msg[%s], oldSize[%d] newSize[%d]", this.getName(),
+ this.mem.getData().length, length);
+ setNewBackingBuffer(input);
+ }
+ }
+
+ @Override
+ public byte[] toByteArray() {
+ return mem.getData();
+ }
+
+ public void setReader(DataReader reader) {
+ this.reader = reader;
+ }
+
+ public void setWriter(DataWriter writer) {
+ this.writer = writer;
+ }
+
+ public void send() throws MessageSystemException {
+ if (writer == null) {
+ OseeLog.log(MessageSystemTestEnvironment.class, Level.SEVERE, getName() + " - the writer is null");
+ } else if (shouldSendData()) {
+ try {
+ notifyPreSendListeners();
+ long start = 0, elapsed;
+ if(debugTime){
+ start = System.nanoTime();
+ }
+ getMem().setDataHasChanged(false);
+ writer.write(null, null, this, null);
+ incrementSentCount();
+ if(debugTime){
+ elapsed = System.nanoTime() - start;
+ if(elapsed > debugTimeout){
+ Locale.setDefault(Locale.US);
+ System.out.printf("%s SLOW IOSEND %,d\n", getName(), elapsed);
+ }
+ }
+ notifyPostSendListeners();
+ } catch (Throwable ex) {
+ throw new MessageSystemException("Could not send message data " + getName(), Level.SEVERE, ex);
+ }
+ }
+ }
+
+ protected void sendTo(IDestination destination, ISource source) throws MessageSystemException {
+ if (writer == null) {
+ OseeLog.log(MessageSystemTestEnvironment.class, Level.WARNING, getName() + " - the writer is null");
+ } else if (shouldSendData()) {
+ try {
+ notifyPreSendListeners();
+ // this.initializeDefaultHeaderValues();
+ getMem().setDataHasChanged(false);
+ writer.write(destination, source, this, null);
+ incrementSentCount();
+ notifyPostSendListeners();
+ } catch (Throwable ex) {
+ throw new MessageSystemException("Could not send message data " + getName(), Level.SEVERE, ex);
+ }
+ }
+ }
+
+ /**
+ * Override this method if you want to specialize the send criteria in a data source. For example, if you only want
+ * to send data to the MUX driver if the data has changed.
+ */
+ protected boolean shouldSendData() {
+ return true;
+ }
+
+ public TypeSupport getTypeSupport() {
+ return new DDSTypeSupport(this, getName(), getName(), getPayloadSize());
+ }
+
+ public String getTopicName() {
+ return getName();
+ }
+
+ public String getTypeName() {
+ return typeName;
+ }
+
+ @Override
+ public boolean isSameInstance(byte[] data1, byte[] data2) {
+ return true;
+ }
+
+ public Namespace getNamespace() {
+ if (isWriter()) {
+ return new Namespace(writer.getTopic().getNamespace());
+ } else {
+ return new Namespace(reader.getTopicDescription().getNamespace());
+ }
+ }
+
+ /*
+ * each type that extends DDSData needs to have it's own namespace.... we need to go through each DDSData child and
+ * determine all of it's possible namespaces
+ */
+ public boolean isWriter() {
+ if (writer != null && reader == null) {
+ return true;
+ } else if (writer == null && reader != null) {
+ return false;
+ } else {
+ throw new MessageSystemException(
+ "This is an illegal message it has neither a reader or a writer [" + this.getName() + "].", Level.SEVERE);
+ }
+ }
+
+ private IMessageDisposeListener disposeListener = new IMessageDisposeListener() {
+
+ @Override
+ public void onPreDispose(Message message) {
+ messages.remove(message);
+ }
+
+ @Override
+ public void onPostDispose(Message message) {
+ }
+
+ };
+
+ @Override
+ public void copyFrom(Data data) {
+ ByteBuffer buffer = data.toByteBuffer();
+ copyData(data.getOffset(), buffer, buffer.remaining());
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getName() + ": name=" + getName();
+ }
+
+ @Override
+ public int getOffset() {
+ return 0;
+ }
+
+ /**
+ * @return the isScheduled
+ */
+ public boolean isScheduled() {
+ return isScheduled;
+ }
+
+ /**
+ * @param isScheduled the isScheduled to set
+ */
+ public void setScheduled(boolean isScheduled) {
+ this.isScheduled = isScheduled;
+ }
+
+ private void notifyPostSendListeners() {
+ try {
+ long start = 0, elapsed;
+ IMessageSendListener[] listeners = messageSendListeners.get();
+ for (int i = 0; i < listeners.length; i++) {
+ IMessageSendListener listener = listeners[i];
+ if(debugTime){
+ start = System.nanoTime();
+ }
+ listener.onPostSend(this);
+ if(debugTime){
+ elapsed = System.nanoTime() - start;
+ if(elapsed > debugTimeout){
+ Locale.setDefault(Locale.US);
+ System.out.printf("%s %s SLOW POST SEND %,d\n", getName(), listener.getClass().getName(), elapsed);
+ }
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(Message.class, Level.SEVERE, ex);
+ }
+ }
+
+ private void notifyPreSendListeners() {
+ try {
+ long start = 0, elapsed;
+ IMessageSendListener[] listeners = messageSendListeners.get();
+ for (int i = 0; i < listeners.length; i++) {
+ IMessageSendListener listener = listeners[i];
+ if(debugTime){
+ start = System.nanoTime();
+ }
+ listener.onPreSend(this);
+ if(debugTime){
+ elapsed = System.nanoTime() - start;
+ if(elapsed > debugTimeout){
+ Locale.setDefault(Locale.US);
+ System.out.printf("%s %s SLOW PRE SEND %,d\n", getName(), listener.getClass().getName(), elapsed);
+ }
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(Message.class, Level.SEVERE, ex);
+ }
+ }
+
+ public void addSendListener(IMessageSendListener listener) {
+ messageSendListeners.add(listener);
+ }
+
+ public void removeSendListener(IMessageSendListener listener) {
+ messageSendListeners.remove(listener);
+ }
+
+ public boolean containsSendListener(IMessageSendListener listener) {
+ return messageSendListeners.contains(listener);
+ }
+
+ public boolean isMessageCollectionNotEmpty() {
+ return messages.get().length > 0;
+ }
+
+ public void zeroize() {
+ final byte[] data = toByteArray();
+ Arrays.fill(data, getMsgHeader().getHeaderSize(), data.length, (byte) 0);
+ }
+
+ /**
+ * A time value associated with this message.
+ * The time value will have different meanings or may not be used depending on the context and usage.
+ */
+ public long getTime() {
+ return time;
+ }
+
+ public void setTime(long time) {
+ this.time = time;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/ArrayElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/ArrayElement.java
new file mode 100644
index 000000000..04d055202
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/ArrayElement.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.elements;
+
+import java.nio.ByteBuffer;
+import java.util.Collection;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.data.MessageData;
+
+public class ArrayElement extends Element {
+
+ public ArrayElement(Message msg, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalMsb, int originalLsb) {
+ super(msg, elementName, messageData, byteOffset, msb, lsb, originalMsb, originalLsb);
+ }
+
+ public ArrayElement(Message msg, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+ super(msg, elementName, messageData, bitOffset, bitLength);
+ }
+
+ public ArrayElement(Message msg, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+ super(msg, elementName, messageData, byteOffset, msb, lsb);
+ }
+
+ @Override
+ protected Element getNonMappingElement() {
+ return null;
+ }
+
+ public void setValue(int index, byte value) {
+ getMsgData().getMem().getData()[index + getMsgData().getMem().getOffset() + getArrayStartOffset()] = value;
+ }
+
+ public ByteBuffer asByteBuffer() {
+ return ByteBuffer.wrap(getMsgData().getMem().getData(),
+ getMsgData().getMem().getOffset() + getArrayStartOffset(), getLength());
+ }
+
+ public byte getValue(int index) {
+ return getValue(getMsgData().getMem(), index);
+ }
+
+ public byte getValue(MemoryResource mem, int index) {
+ return mem.getData()[index + mem.getOffset() + getArrayStartOffset()];
+
+ }
+
+ @Override
+ public void zeroize() {
+ MemoryResource mem = getMsgData().getMem();
+ mem.zeroizeFromOffset(getArrayStartOffset(), getLength());
+ }
+
+ public int getLength() {
+ int currentMsgLength = getMsgData().getCurrentLength() - getMsgData().getOffset() - getArrayStartOffset();
+ int length = getArrayEndOffset() - getArrayStartOffset();
+ length = currentMsgLength < length ? currentMsgLength : length;
+ return length;
+ }
+
+ public int getArrayStartOffset() {
+ return byteOffset + msb / 8;
+ }
+
+ public int getArrayEndOffset() {
+ return (lsb - msb + 1) / 8 + byteOffset;
+ }
+
+ @Override
+ public void visit(IElementVisitor visitor) {
+ visitor.asArrayElement(this);
+ }
+
+ @Override
+ public ArrayElement findElementInMessages(Collection<? extends Message> messages) {
+ return (ArrayElement) super.findElementInMessages(messages);
+ }
+
+ @Override
+ public ArrayElement switchMessages(Collection<? extends Message<?,?,?>> messages) {
+ return (ArrayElement) super.switchMessages(messages);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/BiSci16Element.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/BiSci16Element.java
new file mode 100644
index 000000000..cc40d7487
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/BiSci16Element.java
@@ -0,0 +1,224 @@
+/*
+ * Created on Apr 30, 2015
+ *
+ * PLACE_YOUR_DISTRIBUTION_STATEMENT_RIGHT_HERE
+ */
+package org.eclipse.osee.ote.message.elements;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.testPoint.CheckGroup;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.nonmapping.NonMappingLongIntegerElement;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+
+/**
+ * MIL-STD-1760E standard 16 bit Binary Scientific Notation Integer format.
+ * <dl>
+ * <dt>Base<dd>2's compliment integer located in the first 12 most significant bits
+ * <dt>Exponent<dd>unsigned int located in the last 4 (least significant) bits
+ * <dt>Conversion<dd>LogicalValue = (Base) * 16<sup>Exponent</sup>
+ * </dl>
+ *
+ * @author Michael P. Masterson
+ */
+public class BiSci16Element extends LongIntegerElement {
+
+ public BiSci16Element(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+ this(message, elementName, messageData, byteOffset, msb, lsb, msb, lsb);
+ }
+
+ public BiSci16Element(Message message, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+ super(message, elementName, messageData, bitOffset, bitLength);
+ }
+
+ public BiSci16Element(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+ super(message, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
+ }
+
+ @Override
+ public void setValue(Long value) {
+ super.setValue(convertLogicalValueToBiSci(value));
+ }
+
+ @Override
+ public Long getValue() {
+ return convertBiSciToLogicalValue(super.getValue());
+ }
+
+ @Override
+ public Long valueOf(MemoryResource mem) {
+ return convertBiSciToLogicalValue(super.valueOf(mem));
+ }
+
+ /**
+ * Verifies that the element is set to "value" within the number of "milliseconds" passed.
+ *
+ * @param value Expected value.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ */
+ @Override
+ public boolean check(ITestAccessor accessor, long value, int milliseconds) throws InterruptedException {
+ return super.check(accessor, (CheckGroup) null, value, milliseconds);
+ }
+
+ /**
+ * This function will verify that this signal is pulsed for 2 cycles.
+ *
+ * @param value The value to be checked
+ */
+ @Override
+ public void checkPulse(ITestAccessor accessor, long value) throws InterruptedException {
+ long nonPulsedValue = 0;
+ if (value == 0) {
+ nonPulsedValue = 1;
+ }
+
+ checkPulse(accessor, value, nonPulsedValue);
+ }
+
+ /**
+ * Sets the element to the "value" passed.
+ *
+ * @param value The value to set.
+ */
+ @Override
+ public void set(ITestEnvironmentAccessor accessor, long value) {
+ super.set(accessor, value);
+ }
+
+ /**
+ * Sets the element to the "value" passed and immediately sends the message that contains it..
+ *
+ * @param value The value to set.
+ */
+ @Override
+ public void setAndSend(ITestEnvironmentAccessor accessor, long value) {
+ this.set(accessor, value);
+ super.sendMessage();
+ }
+
+ @Override
+ public void parseAndSet(ITestEnvironmentAccessor accessor, String value) throws IllegalArgumentException {
+ this.set(accessor, Long.parseLong(value));
+ }
+
+ @Override
+ protected NonMappingLongIntegerElement getNonMappingElement() {
+ return new NonMappingLongIntegerElement(this);
+ }
+
+ @Override
+ public Long elementMask(Long value) {
+ return value;
+ }
+
+ @Override
+ public long getNumericBitValue() {
+ return getRaw();
+ }
+
+ /**
+ * @return the raw bits of this element without conversion from the binary scientific notation format.
+ */
+ public long getRaw() {
+ return getRaw(getMsgData().getMem());
+ }
+
+ /**
+ * @param mem
+ * @return the raw bits of this element without conversion from the binary scientific notation format.
+ */
+ public long getRaw(MemoryResource mem) {
+ return mem.getLong(byteOffset, msb, lsb);
+ }
+
+
+ /**
+ * Sets the raw long straight into memory without conversion
+ * @param hex
+ */
+ public void setHex(long hex) {
+ getMsgData().getMem().setLong(hex, byteOffset, msb, lsb);
+ }
+
+ /**
+ * Checks that this element correctly forwards a message sent from cause with the value passed.
+ *
+ * @param cause The originator of the signal
+ * @param value The value sent by cause and being forwarded by this element
+ */
+ @Override
+ public void checkForwarding(ITestAccessor accessor, LongIntegerElement cause, long value) throws InterruptedException {
+ /* check for 0 to begine */
+ check(accessor, 0, 0);
+
+ /* Set the DP1 Mux Signal */
+ cause.set(accessor, value);
+
+ /* Chk Value on DP2 */
+ check(accessor, value, 1000);
+
+ /* Set DP1 to 0 */
+ cause.set(accessor, 0);
+
+ /* Init DP2 Mux to 0 */
+ set(accessor, 0);
+
+ /* Chk Value on DP2 is still set */
+ check(accessor, value, 500);
+
+ /* Chk DP2 is 0 for two-pulse signals and high for four-pulse signal */
+ check(accessor, 0, 500);
+
+ }
+
+
+ /*package*/ Long convertLogicalValueToBiSci(long logical) {
+ long biSci = 0;
+ boolean isNeg = false;
+ if( logical < 0 ) {
+ isNeg = true;
+ logical = -logical;
+ }
+
+ long base = Math.abs(logical);
+ int powersOf16 = 0;
+ boolean round = false;
+ while( base > 0x0800) {
+ powersOf16++;
+ if( round )
+ base--;
+
+ round = base % 16 > 7;
+ base = base >>> 4;
+
+ if( round)
+ base++;
+ }
+
+ if( isNeg ) {
+ base = 0x1000 - base;
+ }
+
+ final long shiftedBase = base << 4;
+ biSci = shiftedBase + powersOf16;
+
+ return biSci & 0xFFFF;
+ }
+
+ /*package*/ Long convertBiSciToLogicalValue(long biSci) {
+ long logical = 0;
+ long base = ((short)biSci) >> 4; // cast to short to ensure sign extension to long
+ long powersOf16 = biSci & 0xF;
+
+ long shift = powersOf16 * 4;
+ logical = base << shift;
+
+ return logical;
+ }
+
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/BooleanElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/BooleanElement.java
new file mode 100644
index 000000000..3b75e9acf
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/BooleanElement.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.elements;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.data.MessageData;
+
+public class BooleanElement extends DiscreteElement<Boolean> {
+
+ public BooleanElement(Message msg, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalMsb, int originalLsb) {
+ super(msg, elementName, messageData, byteOffset, msb, lsb, originalMsb, originalLsb);
+
+ }
+
+ public BooleanElement(Message msg, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+ super(msg, elementName, messageData, bitOffset, bitLength);
+
+ }
+
+ public BooleanElement(Message msg, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+ super(msg, elementName, messageData, byteOffset, msb, lsb);
+
+ }
+
+ @Override
+ protected Element getNonMappingElement() {
+ return null;
+ }
+
+ @Override
+ public Boolean getValue() {
+ return Boolean.valueOf(getMsgData().getMem().getBoolean(byteOffset, msb, lsb));
+ }
+
+ @Override
+ public void setValue(Boolean obj) {
+ getMsgData().getMem().setBoolean(obj, byteOffset, msb, lsb);
+ }
+
+ @Override
+ public String toString(Boolean obj) {
+ return obj.toString();
+ }
+
+ @Override
+ public Boolean valueOf(MemoryResource mem) {
+ return Boolean.valueOf(mem.getBoolean(byteOffset, msb, lsb));
+ }
+
+ @Override
+ public void parseAndSet(ITestEnvironmentAccessor accessor, String value) throws IllegalArgumentException {
+ set(accessor, Boolean.parseBoolean(value));
+ }
+
+ @Override
+ public void visit(IElementVisitor visitor) {
+ visitor.asBooleanElement(this);
+ }
+
+ @Override
+ public Boolean elementMask(Boolean value) {
+ return value;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/CharElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/CharElement.java
new file mode 100644
index 000000000..8f411bda8
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/CharElement.java
@@ -0,0 +1,611 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.elements;
+
+import java.util.Arrays;
+import java.util.BitSet;
+import java.util.Collection;
+import java.util.ListIterator;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.MethodFormatter;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.testPoint.CheckGroup;
+import org.eclipse.osee.ote.core.testPoint.CheckPoint;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.nonmapping.NonMappingCharElement;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+import org.eclipse.osee.ote.message.listener.MessageSystemListener;
+
+/**
+ * @author John Butler
+ * @author Robert A. Fisher
+ */
+public class CharElement extends DiscreteElement<Character> {
+
+ public CharElement(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+ this(message, elementName, messageData, byteOffset, msb, lsb, msb, lsb);
+ }
+
+ public CharElement(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+ super(message, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
+ }
+
+ public CharElement(Message message, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+ super(message, elementName, messageData, bitOffset, bitLength);
+ }
+
+ @SuppressWarnings("rawtypes")
+ @Override
+ public CharElement findElementInMessages(Collection<? extends Message> messages) {
+ return (CharElement) super.findElementInMessages(messages);
+ }
+
+ @Override
+ public CharElement switchMessages(Collection<? extends Message<?,?,?>> messages) {
+ return (CharElement) super.switchMessages(messages);
+ }
+
+ /**
+ * Checks that this element correctly forwards a message sent from cause with the value passed.
+ *
+ * @param cause The originator of the signal
+ * @param value The value sent by cause and being forwarded by this element
+ */
+ public void checkForwarding(ITestAccessor accessor, CharElement cause, Character value) throws InterruptedException {
+ /* check for 0 to begine */
+ check(accessor, (char) 0, 0);
+
+ /* Set the DP1 Mux Signal */
+ cause.set(accessor, value);
+
+ /* Chk Value on DP2 */
+ check(accessor, value, 1000);
+
+ /* Set DP1 to 0 */
+ cause.set(accessor, (char) 0);
+
+ /* Init DP2 Mux to 0 */
+ set(accessor, (char) 0);
+
+ /* Chk Value on DP2 is still set */
+ check(accessor, value, 500);
+
+ /* Chk DP2 is 0 for two-pulse signals and high for four-oulse signal */
+ check(accessor, (char) 0, 500);
+
+ }
+
+ /**
+ * Verifies that the element is Not set to "value" within the number of "milliseconds" passed.
+ *
+ * @param value Expected value.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ */
+ public boolean checkNot(ITestAccessor accessor, String value, int milliseconds) throws InterruptedException {
+ return this.checkNot(accessor, (CheckGroup) null, value, milliseconds);
+ }
+
+ /**
+ * Verifies that the element is Not set to "value" within the number of "milliseconds" passed.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param value Expected value.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ */
+ public boolean checkNot(ITestAccessor accessor, CheckGroup checkGroup, String value, int milliseconds) throws InterruptedException {
+ if (accessor == null) {
+ throw new IllegalArgumentException("accessor cannot be null");
+ }
+ accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(),
+ new MethodFormatter().add(value).add(milliseconds), getMessage());
+
+ long time = accessor.getEnvTime();
+ String currentValue;
+ boolean result;
+ if (milliseconds > 0) {
+ final MessageSystemListener listener = getMessage().getListener();
+ org.eclipse.osee.ote.core.environment.interfaces.ICancelTimer cancelTimer =
+ accessor.setTimerFor(listener, milliseconds);
+
+ accessor.getLogger().debug(accessor, "waiting............", true);
+
+ while (result = !(currentValue = getString(accessor, value.length())).equals(value)) {
+ listener.waitForData(); // will also return if the timer (set above)
+ // expires
+ /*
+ * NOTE: had to add isTimedOut() because we were getting data at the same time we're timing out, so the
+ * notifyAll() isn't guaranteed to work since we would not be in a waiting state at that time - so we're
+ * forced to save the fact that we timed out.
+ */
+ if (listener.isTimedOut()) {
+ break;
+ }
+ }
+ cancelTimer.cancelTimer();
+ accessor.getLogger().debug(accessor, "done waiting", true);
+ } else {
+ result = !(currentValue = getString(accessor, value.length())).equals(value);
+ }
+ time = accessor.getEnvTime() - time;
+ CheckPoint passFail = new CheckPoint(this.getFullName(), "Not " + value, currentValue, result, time);
+
+ if (checkGroup == null) {
+ accessor.getLogger().testpoint(accessor, accessor.getTestScript(), accessor.getTestCase(), passFail);
+ } else {
+ checkGroup.add(passFail);
+ }
+
+ if (accessor != null) {
+ accessor.getLogger().methodEnded(accessor);
+ }
+ return passFail.isPass();
+ }
+
+ /**
+ * Verifies that the element is set to "value" within the number of "milliseconds" passed.
+ *
+ * @param value Expected value.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ */
+ public boolean check(ITestAccessor accessor, String value, int milliseconds) throws InterruptedException {
+ return this.check(accessor, (CheckGroup) null, value, milliseconds);
+ }
+
+ /**
+ * Verifies that the element is set to "value" within the number of "milliseconds" passed.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param value Expected value.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ */
+ public boolean check(ITestAccessor accessor, CheckGroup checkGroup, String value, int milliseconds) throws InterruptedException {
+ if (accessor == null) {
+ throw new IllegalArgumentException("accessor cannot be null");
+ }
+ accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(),
+ new MethodFormatter().add(value).add(milliseconds), this.getMessage());
+ long time = accessor.getEnvTime();
+ String currentValue;
+ if (milliseconds > 0) {
+ MessageSystemListener listener = getMessage().getListener();
+ org.eclipse.osee.ote.core.environment.interfaces.ICancelTimer cancelTimer =
+ accessor.setTimerFor(listener, milliseconds);
+
+ accessor.getLogger().debug(accessor, "waiting............", true);
+
+ while (!compareString(currentValue = getString(accessor, value.length()), value)) {
+ listener.waitForData(); // will also return if the timer (set above)
+ // expires
+ /*
+ * NOTE: had to add isTimedOut() because we were getting data at the same time we're timing out, so the
+ * notifyAll() isn't guaranteed to work since we would not be in a waiting state at that time - so we're
+ * forced to save the fact that we timed out.
+ */
+ if (listener.isTimedOut()) {
+ break;
+ }
+ }
+
+ cancelTimer.cancelTimer();
+ accessor.getLogger().debug(accessor, "done waiting", true);
+ } else {
+ currentValue = getString(accessor, value.length());
+ }
+ time = accessor.getEnvTime() - time;
+ CheckPoint passFail =
+ new CheckPoint(this.getFullName(), value, currentValue, compareString(currentValue, value), time);
+
+ if (checkGroup == null) {
+ accessor.getLogger().testpoint(accessor, accessor.getTestScript(), accessor.getTestCase(), passFail);
+ } else {
+ checkGroup.add(passFail);
+ }
+
+ if (accessor != null) {
+ accessor.getLogger().methodEnded(accessor);
+ }
+ return passFail.isPass();
+ }
+
+ private boolean compareString(String string, String value) {
+ return string.equals(value);
+ }
+
+ /**
+ * Verifies that the string starting at the element is not set to "value".
+ *
+ * @param value Expected value
+ * @return if the check passed
+ */
+ public boolean checkNot(ITestAccessor accessor, String value) {
+ return this.checkNot(accessor, (CheckGroup) null, value);
+ }
+
+ /**
+ * Verifies that the string starting at the element is not set to "value".
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param value Expected value
+ * @return if the check passed
+ */
+ public boolean checkNot(ITestAccessor accessor, CheckGroup checkGroup, String value) {
+ if (accessor != null) {
+ accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(), new MethodFormatter().add(value),
+ this.getMessage());
+ }
+
+ String actualValue = getString(accessor, value.length());
+
+ CheckPoint passFail =
+ new CheckPoint(this.getFullName(), "Not " + value, actualValue, value.compareTo(actualValue) != 0, 0);
+
+ if (checkGroup == null) {
+ accessor.getLogger().testpoint(accessor, accessor.getTestScript(), accessor.getTestCase(), passFail);
+ } else {
+ checkGroup.add(passFail);
+ }
+
+ if (accessor != null) {
+ accessor.getLogger().methodEnded(accessor);
+ }
+ return passFail.isPass();
+
+ }
+
+ /**
+ * Verifies that the string starting at the element is set to "value".
+ *
+ * @param value Expected value
+ * @return if the check passed
+ */
+ public boolean check(ITestAccessor accessor, String value) {
+ return this.check(accessor, (CheckGroup) null, value);
+ }
+
+ /**
+ * Verifies that the string starting at the element is set to "value".
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param value Expected value
+ * @return if the check passed
+ */
+ public boolean check(ITestAccessor accessor, CheckGroup checkGroup, String value) {
+ if (accessor != null) {
+ accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(), new MethodFormatter().add(value),
+ this.getMessage());
+ }
+ String actualValue = getString(accessor, value.length());
+
+ CheckPoint passFail =
+ new CheckPoint(this.getFullName(), value, actualValue, value.compareTo(actualValue) == 0, 0);
+
+ if (checkGroup == null) {
+ if (accessor != null) {
+ accessor.getLogger().testpoint(accessor, accessor.getTestScript(), accessor.getTestCase(), passFail);
+ }
+ } else {
+ checkGroup.add(passFail);
+ }
+
+ if (accessor != null) {
+ accessor.getLogger().methodEnded(accessor);
+ }
+ return passFail.isPass();
+ }
+
+ /**
+ * Returns the string of length "stringLength" starting as the position of the element.
+ *
+ * @param stringLength the length of the string to return
+ * @return the string starting with this element
+ */
+ public String getString(ITestEnvironmentAccessor accessor, int stringLength) {
+ if (getBitLength() == 8) {
+ return getASCIIString(stringLength);
+ } else {
+ ListIterator<Element> iter = getMessage().getElementIterator(this);
+ char[] chars = new char[stringLength];
+ for (int i = 0; i < stringLength; i++) {
+ Element element = iter.next();
+ if (element instanceof CharElement) {
+ chars[i] = ((CharElement) element).getValue();
+ } else {
+ // we ran into a non char element we should abort string extraction
+ break;
+ }
+ }
+ return new String(chars);
+ }
+ }
+
+ /**
+ * <p>
+ * Sets the element's value. Can be [ab]used to set subsequent, contiguous bytes but, while widespread, this use is
+ * discouraged and may be removed in a future release. The behavior of this method differs depending on the length of
+ * string passed in and whether the underlying element is eight bits.
+ * </p>
+ * <p>
+ * For an empty string it sets the element to the null character, '\0', using {@link #setValue(Character)}, which
+ * properly accounts for cases where the element is not eight bits.
+ * </p>
+ * <p>
+ * If the string has a length of one it calls {@link #setValue(Character)} with value.charAt(0).
+ * </p>
+ * <p>
+ * If the string length is greater than one it will assume this and all subsequent elements are eight bits and set
+ * them. <b>Note</b> that it does nothing to ensure the subsequent bytes are character elements or eight bits. It
+ * will throw IllegalArgumentException if setting subsequent elements would overflow. If the element is not eight
+ * bits in size it will set as above and log a warning and stack trace but not throw an exception.
+ * </p>
+ *
+ * @param accessor
+ * @param value the string to set the bytes to
+ */
+ @Override
+ public void parseAndSet(ITestEnvironmentAccessor accessor, String value) {
+ if (value.length() + this.getByteOffset() > this.getMessage().getData().length) {
+ throw new IllegalArgumentException("Setting a String whose length exceeds the Message bounds!");
+ }
+
+ if (accessor != null) {
+ accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(), new MethodFormatter().add(value),
+ this.getMessage());
+ }
+
+ switch (value.length()) {
+ case 0:
+ setValue('\0');
+ break;
+ case 1:
+ setValue(value.charAt(0));
+ break;
+ default:
+ setASCIIString(value);
+ break;
+ }
+
+ if (accessor != null) {
+ accessor.getLogger().methodEnded(accessor);
+ }
+ }
+
+ /**
+ * This method uses {@link #parseAndSet(ITestEnvironmentAccessor, String)} and has all the associate risks and
+ * limitations.
+ *
+ * @param accessor
+ * @param value
+ */
+ public void set(ITestEnvironmentAccessor accessor, String value) {
+ parseAndSet(accessor, value);
+ }
+
+ /**
+ * This method uses {@link #parseAndSet(ITestEnvironmentAccessor, String)} and has all the associate risks and
+ * limitations.
+ *
+ * @param value
+ */
+ public void setValue(String value) {
+ parseAndSet(null, value);
+ }
+
+ /**
+ * This method uses {@link #parseAndSet(ITestEnvironmentAccessor, String)} and has all the associate risks and
+ * limitations. After setting it sends the message.
+ *
+ * @param accessor
+ * @param value
+ */
+ public void setAndSend(ITestEnvironmentAccessor accessor, String value) {
+ this.parseAndSet(accessor, value);
+ super.sendMessage();
+ }
+
+ /**
+ * This method uses {@link #parseAndSet(ITestEnvironmentAccessor, String)} and has all the associate risks and
+ * limitations.
+ *
+ * @param accessor
+ * @param value
+ */
+ public void setNoLog(ITestEnvironmentAccessor accessor, String value) {
+ this.parseAndSet(accessor, value);
+ }
+
+ /**
+ * Sets the element to the "value" passed and immediately sends the meessage that contains it..
+ *
+ * @param value The value to set.
+ */
+ public void setAndSend(ITestEnvironmentAccessor accessor, Character value) {
+ this.set(accessor, value);
+ super.sendMessage();
+ }
+
+ /**
+ * Waits until the element equals the "value" passed. Returns last value observed upon a timout.
+ *
+ * @param value The expected value to wait for.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value found. Either value expected or value found at timeout.
+ */
+ protected String waitForValue(ITestEnvironmentAccessor accessor, String value, int milliseconds) throws InterruptedException {
+ if (accessor != null) {
+ accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(),
+ new MethodFormatter().add(value).add(milliseconds), this.getMessage());
+ }
+ String currentValue;
+ if (milliseconds > 0) {
+ MessageSystemListener listener = getMessage().getListener();
+ org.eclipse.osee.ote.core.environment.interfaces.ICancelTimer cancelTimer =
+ accessor.setTimerFor(listener, milliseconds);
+
+ accessor.getLogger().debug(accessor, "waiting............", true);
+
+ while ((currentValue = getString(accessor, value.length())).equals(value)) {
+ listener.waitForData(); // will also return if the timer (set above)
+ // expires
+ /*
+ * NOTE: had to add isTimedOut() because we were getting data at the same time we're timing out, so the
+ * notifyAll() isn't guaranteed to work since we would not be in a waiting state at that time - so we're
+ * forced to save the fact that we timed out.
+ */
+ if (listener.isTimedOut()) {
+ break;
+ }
+ }
+ cancelTimer.cancelTimer();
+ accessor.getLogger().debug(accessor, "done waiting", true);
+ } else {
+ currentValue = getString(accessor, value.length());
+ }
+ if (accessor != null) {
+ accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(), new MethodFormatter().add(value),
+ this.getMessage());
+ }
+ return currentValue;
+ }
+
+ /**
+ * Waits until the element does not equal the "value" passed. Returns last value observed upon a timout.
+ *
+ * @param value The expected value to wait for.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value found. Either value expected or value found at timeout.
+ */
+ protected String waitForNotValue(ITestEnvironmentAccessor accessor, String value, int milliseconds) throws InterruptedException {
+ if (accessor != null) {
+ accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(),
+ new MethodFormatter().add(value).add(milliseconds), this.getMessage());
+ }
+ String currentValue;
+ if (milliseconds > 0) {
+
+ MessageSystemListener listener = getMessage().getListener();
+ org.eclipse.osee.ote.core.environment.interfaces.ICancelTimer cancelTimer =
+ accessor.setTimerFor(listener, milliseconds);
+
+ accessor.getLogger().debug(accessor, "waiting............", true);
+
+ while (!(currentValue = getString(accessor, value.length())).equals(value)) {
+ listener.waitForData(); // will also return if the timer (set above)
+ // expires
+ /*
+ * NOTE: had to add isTimedOut() because we were getting data at the same time we're timing out, so the
+ * notifyAll() isn't guaranteed to work since we would not be in a waiting state at that time - so we're
+ * forced to save the fact that we timed out.
+ */
+ if (listener.isTimedOut()) {
+ break;
+ }
+ }
+ cancelTimer.cancelTimer();
+ accessor.getLogger().debug(accessor, "done waiting", true);
+ } else {
+ currentValue = getString(accessor, value.length());
+ }
+ if (accessor != null) {
+ accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(), new MethodFormatter().add(value),
+ this.getMessage());
+ }
+ return currentValue;
+ }
+
+ /**
+ * Sets the element value, properly accounting for the bit-size of the element.
+ *
+ * @param value
+ */
+ @Override
+ public void setValue(Character value) {
+ getMsgData().getMem().setInt(value, byteOffset, msb, lsb);
+ }
+
+ @Override
+ public Character getValue() {
+ return (char) getMsgData().getMem().getInt(byteOffset, msb, lsb);
+ }
+
+ @Override
+ public Character valueOf(MemoryResource otherMem) {
+ return Character.valueOf((char) otherMem.getInt(byteOffset, msb, lsb));
+ }
+
+ @Override
+ public String toString(Character obj) {
+ return obj.toString();
+ }
+
+ private String getASCIIString(int length) {
+ return getMsgData().getMem().getASCIIString(byteOffset, length);
+ }
+
+ private void setASCIIString(String value) {
+ if (getBitLength() == 8) {
+ getMsgData().getMem().setASCIIString(value, byteOffset);
+ } else {
+ ListIterator<Element> iter = getMessage().getElementIterator(this);
+ for (int i = 0; i < value.length(); i++) {
+ Element element = iter.next();
+ if (element instanceof CharElement) {
+ ((CharElement) element).setValue(value.charAt(i));
+ } else {
+ // we ran into a non char element we should abort string extraction
+ return;
+ }
+ }
+ }
+ }
+
+ @Override
+ public void visit(IElementVisitor visitor) {
+ visitor.asCharElement(this);
+ }
+
+ @Override
+ protected NonMappingCharElement getNonMappingElement() {
+ return new NonMappingCharElement(this);
+ }
+
+ @Override
+ public Character elementMask(Character value) {
+ return value;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/Dec32Element.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/Dec32Element.java
new file mode 100644
index 000000000..81f53da3d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/Dec32Element.java
@@ -0,0 +1,81 @@
+/*
+ * Created on Nov 6, 2013
+ *
+ * PLACE_YOUR_DISTRIBUTION_STATEMENT_RIGHT_HERE
+ */
+package org.eclipse.osee.ote.message.elements;
+
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.data.MessageData;
+
+/**
+ * @author Michael P. Masterson
+ */
+public class Dec32Element extends Float32Element {
+
+ /**
+ * @param message
+ * @param elementName
+ * @param messageData
+ * @param byteOffset
+ * @param msb
+ * @param lsb
+ */
+ public Dec32Element(Message message, String elementName, MessageData messageData,
+ int byteOffset, int msb, int lsb) {
+ super(message, elementName, messageData, byteOffset, msb, lsb);
+ }
+
+ /**
+ * @param message
+ * @param elementName
+ * @param messageData
+ * @param byteOffset
+ * @param msb
+ * @param lsb
+ * @param originalLsb
+ * @param originalMsb
+ */
+ public Dec32Element(Message message, String elementName, MessageData messageData,
+ int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+ super(message, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
+ }
+
+ /**
+ * @param message
+ * @param elementName
+ * @param messageData
+ * @param bitOffset
+ * @param bitLength
+ */
+ public Dec32Element(Message message, String elementName, MessageData messageData,
+ int bitOffset, int bitLength) {
+ super(message, elementName, messageData, bitOffset, bitLength);
+ }
+
+ @Override
+ protected double toDouble(long value) {
+ return super.toDouble(value * 4);
+ }
+
+ @Override
+ protected long toLong(double value) {
+ return super.toLong(value * 4);
+ }
+
+ @Override
+ public void setValue(Double value) {
+ super.setValue(value * 4);
+ }
+
+ @Override
+ public Double getValue() {
+ return super.getValue() / 4;
+ }
+
+ @Override
+ public Double valueOf(MemoryResource mem) {
+ return super.valueOf(mem) / 4;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/DiscreteElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/DiscreteElement.java
new file mode 100644
index 000000000..42025940d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/DiscreteElement.java
@@ -0,0 +1,1473 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.elements;
+
+import org.eclipse.osee.ote.core.MethodFormatter;
+import org.eclipse.osee.ote.core.ReturnFormatter;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.testPoint.CheckGroup;
+import org.eclipse.osee.ote.core.testPoint.CheckPoint;
+import org.eclipse.osee.ote.core.testPoint.Operation;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.condition.EqualsCondition;
+import org.eclipse.osee.ote.message.condition.IDiscreteElementCondition;
+import org.eclipse.osee.ote.message.condition.InRangeCondition;
+import org.eclipse.osee.ote.message.condition.ListCondition;
+import org.eclipse.osee.ote.message.condition.NotInRangeCondition;
+import org.eclipse.osee.ote.message.condition.PulseCondition;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+
+public abstract class DiscreteElement<T extends Comparable<T>> extends Element implements Comparable<DiscreteElement<T>> {
+
+ private static final String FOR_2_PULSES = " FOR 2 PULSES";
+
+ public DiscreteElement(Message msg, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalMsb, int originalLsb) {
+ super(msg, elementName, messageData, byteOffset, msb, lsb, originalMsb, originalLsb);
+ }
+
+ public DiscreteElement(Message msg, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+ super(msg, elementName, messageData, byteOffset, msb, lsb);
+ }
+
+ public DiscreteElement(Message msg, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+ super(msg, elementName, messageData, bitOffset, bitLength);
+ }
+
+ public abstract void setValue(T obj);
+
+ public abstract T getValue();
+
+ public abstract String toString(T obj);
+
+ public String valueOf() {
+ return getValue().toString();
+ }
+
+ public abstract void parseAndSet(ITestEnvironmentAccessor accessor, String value) throws IllegalArgumentException;
+
+ /**
+ * Sets the element to the "value" passed.
+ *
+ * @param accessor Reference to the accessor.
+ * @param value The value to set.
+ */
+ public void set(ITestEnvironmentAccessor accessor, T value) {
+ if (accessor != null) {
+ accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(), new MethodFormatter().add(value),
+ getMessage());
+ }
+
+ setValue(value);
+
+ if (accessor != null) {
+ accessor.getLogger().methodEnded(accessor);
+ }
+ }
+
+ /**
+ * Verifies that the element is set to "value".
+ *
+ * @param accessor Reference to the accessor.
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param value Expected value
+ * @return if the check passed
+ */
+ public boolean check(ITestAccessor accessor, CheckGroup checkGroup, T value) {
+
+ if (accessor != null) {
+ accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(), new MethodFormatter().add(value),
+ getMessage());
+ }
+
+ T actualValue = getValue();
+ CheckPoint passFail =
+ new CheckPoint(this.getFullName(), toString(value), toString(actualValue),
+ actualValue.equals(elementMask(value)), 0);
+
+ if (checkGroup == null) {
+ accessor.getLogger().testpoint(accessor, accessor.getTestScript(), accessor.getTestCase(), passFail);
+ } else {
+ checkGroup.add(passFail);
+ }
+
+ if (accessor != null) {
+ accessor.getLogger().methodEnded(accessor);
+ }
+ return passFail.isPass();
+ }
+
+ public boolean checkNT(ITestAccessor accessor, CheckGroup checkGroup, T value) {
+ accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(), new MethodFormatter().add(value),
+ getMessage());
+ boolean v = getValue().equals(elementMask(value));
+ accessor.getLogger().methodEnded(accessor);
+ return v;
+ }
+
+ public boolean checkNotNT(ITestAccessor accessor, CheckGroup checkGroup, T value) {
+ accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(), new MethodFormatter().add(value),
+ getMessage());
+ boolean v = !getValue().equals(elementMask(value));
+ accessor.getLogger().methodEnded(accessor);
+ return v;
+ }
+
+ public final boolean check(ITestAccessor accessor, T value) {
+ return this.check(accessor, (CheckGroup) null, value);
+ }
+
+ /**
+ * Verifies that the element is set to "value" within the number of "milliseconds" passed.
+ *
+ * @param value Expected value.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ */
+ public final boolean check(ITestAccessor accessor, T value, int milliseconds) throws InterruptedException {
+ return check(accessor, (CheckGroup) null, value, milliseconds);
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified. Either end of the range can be set to be
+ * inclusive or not.
+ *
+ * @param accessor Reference to the accessor.
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive.
+ * @return if the check passed
+ */
+ public boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, T minValue, boolean minInclusive, T maxValue, boolean maxInclusive) {
+ checkAccessor(accessor);
+ accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(),
+ new MethodFormatter().add(minValue).add(minInclusive).add(maxValue).add(maxInclusive), getMessage());
+
+ InRangeCondition<T> c = new InRangeCondition<>(this, minValue, minInclusive, maxValue, maxInclusive);
+
+ boolean pass = c.check();
+ CheckPoint passFail =
+ new CheckPoint(this.getFullName(), "In " + expectedRangeString(toString(minValue).toString(), minInclusive,
+ toString(maxValue), maxInclusive), toString(c.getLastCheckValue()), pass, 0);
+
+ if (checkGroup == null) {
+ accessor.getLogger().testpoint(accessor, accessor.getTestScript(), accessor.getTestCase(), passFail);
+ } else {
+ checkGroup.add(passFail);
+ }
+ accessor.getLogger().methodEnded(accessor);
+ return passFail.isPass();
+ }
+
+ public boolean checkRangeNT(ITestAccessor accessor, T minValue, boolean minInclusive, T maxValue, boolean maxInclusive) {
+ checkAccessor(accessor);
+ accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(),
+ new MethodFormatter().add(minValue).add(minInclusive).add(maxValue).add(maxInclusive), getMessage());
+ InRangeCondition<T> c = new InRangeCondition<>(this, minValue, minInclusive, maxValue, maxInclusive);
+ boolean pass = c.check();
+ accessor.getLogger().methodEnded(accessor);
+ return pass;
+ }
+
+ public boolean checkRangeNT(ITestAccessor accessor, T minValue, boolean minInclusive, T maxValue, boolean maxInclusive, int millis) throws InterruptedException {
+ checkAccessor(accessor);
+ accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(),
+ new MethodFormatter().add(minValue).add(minInclusive).add(maxValue).add(maxInclusive), getMessage());
+ InRangeCondition<T> c = new InRangeCondition<>(this, minValue, minInclusive, maxValue, maxInclusive);
+ MsgWaitResult result = getMessage().waitForCondition(accessor, c, false, millis);
+ accessor.getLogger().methodEnded(accessor);
+ return result.isPassed();
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified. Assumes that both ends of the range are
+ * inclusive.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @return if the check passed
+ */
+ public final boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, T minValue, T maxValue) {
+ return checkRange(accessor, checkGroup, minValue, true, maxValue, true);
+ }
+
+ /**
+ * Verifies that the element is NOT set to "value".
+ *
+ * @param accessor Reference to the accessor.
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param value value to test against
+ * @return if the check passed
+ */
+ public boolean checkNot(ITestAccessor accessor, CheckGroup checkGroup, T value) {
+ if (accessor != null) {
+ accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(), new MethodFormatter().add(value),
+ getMessage());
+ }
+
+ T actualValue = getValue();
+
+ CheckPoint passFail =
+ new CheckPoint(this.getFullName(), "Not " + toString(value), toString(actualValue),
+ !actualValue.equals(value), 0);
+
+ if (checkGroup == null) {
+ accessor.getLogger().testpoint(accessor, accessor.getTestScript(), accessor.getTestCase(), passFail);
+ } else {
+ checkGroup.add(passFail);
+ }
+
+ if (accessor != null) {
+ accessor.getLogger().methodEnded(accessor);
+ }
+ return passFail.isPass();
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified for the entire time specified. Assumes
+ * range is inclusive.
+ *
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public final T checkMaintainRange(ITestAccessor accessor, T minValue, T maxValue, int milliseconds) throws InterruptedException {
+ return checkMaintainRange(accessor, null, minValue, true, maxValue, true, milliseconds);
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified for the entire time specified.
+ *
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public final T checkMaintainRange(ITestAccessor accessor, T minValue, boolean minInclusive, T maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ return checkMaintainRange(accessor, (CheckGroup) null, minValue, minInclusive, maxValue, maxInclusive,
+ milliseconds);
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified for the entire time specified. Assumes
+ * range is inclusive.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public final T checkMaintainNotRange(ITestAccessor accessor, T minValue, T maxValue, int milliseconds) throws InterruptedException {
+ return checkMaintainNotRange(accessor, null, minValue, true, maxValue, true, milliseconds);
+ }
+
+ /**
+ * Verifies that the element is not set to a value within the range specified for the entire time specified.
+ *
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public final T checkMaintainNotRange(ITestAccessor accessor, T minValue, boolean minInclusive, T maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ return checkMaintainNotRange(accessor, (CheckGroup) null, minValue, minInclusive, maxValue, maxInclusive,
+ milliseconds);
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified for the entire time specified. Assumes
+ * range is inclusive.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public final T checkMaintainRange(ITestAccessor accessor, CheckGroup checkGroup, T minValue, T maxValue, int milliseconds) throws InterruptedException {
+ return checkMaintainRange(accessor, checkGroup, minValue, true, maxValue, true, milliseconds);
+ }
+
+ /**
+ * Verifies that the element is set to a value outside the range specified. Either end of the range can be set to be
+ * inclusive or not.
+ *
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+ * to the range value.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+ * to the range value.
+ * @param milliseconds Number of milliseconds to wait for the element to be outside the range.
+ * @return if the check passed
+ */
+ public final boolean checkNotRange(ITestAccessor accessor, T minValue, boolean minInclusive, T maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ return checkNotRange(accessor, (CheckGroup) null, minValue, minInclusive, maxValue, maxInclusive, milliseconds);
+ }
+
+ /**
+ * Verifies that the element is set to a value outside the range specified. Either end of the range can be set to be
+ * inclusive or not.
+ *
+ * @param accessor Reference to the accessor.
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+ * to the range value.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+ * to the range value.
+ * @return if the check passed
+ */
+ public final boolean checkNotRange(ITestAccessor accessor, CheckGroup checkGroup, T minValue, boolean minInclusive, T maxValue, boolean maxInclusive) throws InterruptedException {
+ return checkNotRange(accessor, (CheckGroup) null, minValue, minInclusive, maxValue, maxInclusive, 0);
+ }
+
+ /**
+ * Waits until the element equals the "value" passed. Returns last value observed upon a time out.
+ *
+ * @param accessor Reference to the accessor.
+ * @param value The expected value to wait for.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value found. Either value expected or value found at timeout.
+ */
+ public T waitForValue(ITestEnvironmentAccessor accessor, T value, int milliseconds) throws InterruptedException {
+ if (accessor != null) {
+ accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(),
+ new MethodFormatter().add(value).add(milliseconds), getMessage());
+ }
+ EqualsCondition<T> c = new EqualsCondition<>(this, value);
+ getMessage().waitForCondition(accessor, c, false, milliseconds);
+ if (accessor != null) {
+ accessor.getLogger().methodEnded(accessor);
+ }
+ return c.getLastCheckValue();
+ }
+
+ /**
+ * Waits until the element has a value other than the "value" passed. Returns last value observed upon a time out.
+ *
+ * @param accessor Reference to the accessor.
+ * @param value The expected value to wait for.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public T waitForNotValue(ITestEnvironmentAccessor accessor, T value, int milliseconds) throws InterruptedException {
+ if (accessor != null) {
+ accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(),
+ new MethodFormatter().add(value).add(milliseconds), getMessage());
+ }
+ EqualsCondition<T> c = new EqualsCondition<>(this, true, value);
+ getMessage().waitForCondition(accessor, c, false, milliseconds);
+ if (accessor != null) {
+ accessor.getLogger().methodEnded(accessor);
+ }
+ return c.getLastCheckValue();
+ }
+
+ /**
+ * Waits until the element has a value within the range specified. Either end of the range can be inclusive or not.
+ *
+ * @param accessor Reference to the accessor.
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public T waitForRange(ITestEnvironmentAccessor accessor, T minValue, boolean minInclusive, T maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ if (accessor != null) {
+ accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(),
+ new MethodFormatter().add(minValue).add(minInclusive).add(maxValue).add(maxInclusive).add(milliseconds),
+ getMessage());
+ }
+ InRangeCondition<T> c = new InRangeCondition<>(this, minValue, minInclusive, maxValue, maxInclusive);
+ getMessage().waitForCondition(accessor, c, false, milliseconds);
+ if (accessor != null) {
+ accessor.getLogger().methodEnded(accessor);
+ }
+ return c.getLastCheckValue();
+ }
+
+ /**
+ * Waits until the element has a value within the range specified. Assumes the range is inclusive.
+ *
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public final T waitForRange(ITestEnvironmentAccessor accessor, T minValue, T maxValue, int milliseconds) throws InterruptedException {
+ return waitForRange(accessor, minValue, true, maxValue, true, milliseconds);
+ }
+
+ /**
+ * Waits until the element has a value within the range specified. Either end of the range can be inclusive or not.
+ *
+ * @param accessor Reference to the accessor.
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+ * to the range value.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+ * to the range value.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public T waitForNotRange(ITestEnvironmentAccessor accessor, T minValue, boolean minInclusive, T maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ if (accessor != null) {
+ accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(),
+ new MethodFormatter().add(minValue).add(minInclusive).add(maxValue).add(maxInclusive).add(milliseconds),
+ getMessage());
+ }
+
+ NotInRangeCondition<T> c = new NotInRangeCondition<>(this, minValue, minInclusive, maxValue, maxInclusive);
+ getMessage().waitForCondition(accessor, c, false, milliseconds);
+
+ if (accessor != null) {
+ accessor.getLogger().methodEnded(accessor);
+ }
+ return c.getLastCheckValue();
+ }
+
+ /**
+ * Waits until the element has a value within the range specified. Assumes range is inclusive.
+ *
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public final T waitForNotRange(ITestEnvironmentAccessor accessor, T minValue, T maxValue, int milliseconds) throws InterruptedException {
+ return waitForRange(accessor, minValue, true, maxValue, true, milliseconds);
+ }
+
+ /**
+ * Waits until the element has a value other than the "value" passed. Returns last value observed upon a timout.
+ *
+ * @param value The expected value to wait for.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public final T waitNotValue(ITestEnvironmentAccessor accessor, T value, int milliseconds) throws InterruptedException {
+ return waitForNotValue(accessor, value, milliseconds);
+ }
+
+ /**
+ * Verifies that the element is set to "value" within the number of "milliseconds" passed.
+ *
+ * @param accessor Reference to the accessor.
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param value Expected value.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ */
+ public boolean check(ITestAccessor accessor, CheckGroup checkGroup, T value, int milliseconds) throws InterruptedException {
+ checkAccessor(accessor);
+
+ accessor.getLogger().methodCalledOnObject(accessor, getFullName(),
+ new MethodFormatter().add(value).add(milliseconds), getMessage());
+
+ EqualsCondition<T> c = new EqualsCondition<>(this, value);
+
+ CheckPoint cp = waitWithCheckPoint(accessor, checkGroup, toString(value), c, false, milliseconds);
+ accessor.getLogger().methodEnded(accessor);
+ return cp.isPass();
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified. Either end of the range can be set to be
+ * inclusive or not.
+ *
+ * @param accessor Reference to the accessor.
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive.
+ * @param milliseconds Number of milliseconds to wait for the element to be in the range.
+ * @return if the check passed
+ */
+ public boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, T minValue, boolean minInclusive, T maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ checkAccessor(accessor);
+ accessor.getLogger().methodCalledOnObject(accessor, getFullName(),
+ new MethodFormatter().add(minValue).add(minInclusive).add(maxValue).add(maxInclusive).add(milliseconds),
+ getMessage());
+
+ InRangeCondition<T> c = new InRangeCondition<>(this, minValue, minInclusive, maxValue, maxInclusive);
+ CheckPoint cp =
+ waitWithCheckPoint(accessor, checkGroup,
+ "In " + expectedRangeString(toString(minValue), minInclusive, toString(maxValue), maxInclusive), c, false,
+ milliseconds);
+ accessor.getLogger().methodEnded(accessor);
+ return cp.isPass();
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified. Either end of the range can be set to be
+ * inclusive or not.
+ *
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minimum value of the range is inclusive.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive.
+ * @param milliseconds Number of milliseconds to wait for the element to be within the range.
+ * @return if the check passed
+ */
+ public final boolean checkRange(ITestAccessor accessor, T minValue, boolean minInclusive, T maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ return checkRange(accessor, (CheckGroup) null, minValue, minInclusive, maxValue, maxInclusive, milliseconds);
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified. Either end of the range can be set to be
+ * inclusive or not.
+ *
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive.
+ * @return if the check passed
+ */
+ public final boolean checkRange(ITestAccessor accessor, T minValue, boolean minInclusive, T maxValue, boolean maxInclusive) {
+ return checkRange(accessor, (CheckGroup) null, minValue, minInclusive, maxValue, maxInclusive);
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified. Assumes that both ends of the range are
+ * inclusive.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait for the element to be within the range.
+ * @return if the check passed
+ */
+ public final boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, T minValue, T maxValue, int milliseconds) throws InterruptedException {
+ return checkRange(accessor, checkGroup, minValue, true, maxValue, true, milliseconds);
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified. Assumes that both ends of the range are
+ * inclusive.
+ *
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait for the element to be within the range.
+ * @return if the check passed
+ */
+ public final boolean checkRange(ITestAccessor accessor, T minValue, T maxValue, int milliseconds) throws InterruptedException {
+ return this.checkRange(accessor, (CheckGroup) null, minValue, true, maxValue, true, milliseconds);
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified. Assumes that both ends of the range are
+ * inclusive.
+ *
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @return if the check passed
+ */
+ public final boolean checkRange(ITestAccessor accessor, T minValue, T maxValue) {
+ return checkRange(accessor, (CheckGroup) null, minValue, true, maxValue, true);
+ }
+
+ /**
+ * Verifies that the element is set to some value other than "value" within the number of "milliseconds" passed.
+ * Passes if at any point with in the time allowed, the elment is set to a value other than "value".
+ *
+ * @param accessor Reference to the accessor.
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param value value to test against.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ */
+ public boolean checkNot(ITestAccessor accessor, CheckGroup checkGroup, T value, int milliseconds) throws InterruptedException {
+ checkAccessor(accessor);
+ accessor.getLogger().methodCalledOnObject(accessor, getFullName(),
+ new MethodFormatter().add(value).add(milliseconds), getMessage());
+ CheckPoint cp =
+ waitWithCheckPoint(accessor, checkGroup, "Not " + toString(value), new EqualsCondition<T>(this, true, value),
+ false, milliseconds);
+ accessor.getLogger().methodEnded(accessor);
+ return cp.isPass();
+ }
+
+ /**
+ * Verifies that the element is NOT set to "value".
+ *
+ * @param value value to test against
+ * @return if the check passed
+ */
+ public final boolean checkNot(ITestAccessor accessor, T value) {
+ return checkNot(accessor, (CheckGroup) null, value);
+ }
+
+ /**
+ * Verifies that the element is set to some value other than "value" within the number of "milliseconds" passed.
+ * Passes if at any point with in the time allowed, the element is set to a value other than "value".
+ *
+ * @param value value to test against.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ */
+ public final boolean checkNot(ITestAccessor accessor, T value, int milliseconds) throws InterruptedException {
+ return checkNot(accessor, (CheckGroup) null, value, milliseconds);
+ }
+
+ protected CheckPoint waitWithCheckPoint(ITestAccessor accessor, CheckGroup checkGroup, String expected, IDiscreteElementCondition<T> condition, boolean maintain, int milliseconds) throws InterruptedException {
+ MsgWaitResult result = getMessage().waitForCondition(accessor, condition, maintain, milliseconds);
+ CheckPoint passFail =
+ new CheckPoint(getFullName(), expected, toString(condition.getLastCheckValue()), result.isPassed(),
+ result.getXmitCount(), result.getElapsedTime());
+
+ if (checkGroup == null) {
+ accessor.getLogger().testpoint(accessor, accessor.getTestScript(), accessor.getTestCase(), passFail);
+ } else {
+ checkGroup.add(passFail);
+ }
+ return passFail;
+ }
+
+ /**
+ * Verifies that the element is set to a value outside the range specified. Either end of the range can be set to be
+ * inclusive or not.
+ *
+ * @param accessor Reference to the accessor.
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+ * to the range value.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+ * to the range value.
+ * @return if the check passed
+ */
+ public boolean checkNotRange(ITestAccessor accessor, CheckGroup checkGroup, T minValue, boolean minInclusive, T maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ checkAccessor(accessor);
+ accessor.getLogger().methodCalledOnObject(accessor, getFullName(),
+ new MethodFormatter().add(minValue).add(minInclusive).add(maxValue).add(maxInclusive).add(milliseconds),
+ getMessage());
+ CheckPoint cp =
+ waitWithCheckPoint(accessor, checkGroup,
+ "Not In " + expectedRangeString(toString(minValue), minInclusive, toString(maxValue), maxInclusive),
+ new NotInRangeCondition<T>(this, minValue, minInclusive, maxValue, maxInclusive), false, milliseconds);
+ accessor.getLogger().methodEnded(accessor);
+ return cp.isPass();
+ }
+
+ public boolean checkNotRangeNT(ITestAccessor accessor, T minValue, boolean minInclusive, T maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ checkAccessor(accessor);
+ accessor.getLogger().methodCalledOnObject(accessor, getFullName(),
+ new MethodFormatter().add(minValue).add(minInclusive).add(maxValue).add(maxInclusive).add(milliseconds),
+ getMessage());
+ MsgWaitResult cp =
+ getMessage().waitForCondition(accessor,
+ new NotInRangeCondition<T>(this, minValue, minInclusive, maxValue, maxInclusive), false, milliseconds);
+ accessor.getLogger().methodEnded(accessor);
+ return cp.isPassed();
+ }
+
+ /**
+ * Verifies that the element is set to a value outside the range specified. Assumes that both ends of the range are
+ * inclusive. Therefore observed value may not equal either of the range values.
+ *
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @return if the check passed
+ */
+ public final boolean checkNotRange(ITestAccessor accessor, T minValue, T maxValue) throws InterruptedException {
+ return checkNotRange(accessor, (CheckGroup) null, minValue, true, maxValue, true);
+ }
+
+ /**
+ * Verifies that the element is set to a value outside the range specified. Assumes that both ends of the range are
+ * inclusive.
+ *
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait for the element to be outside the range.
+ * @return if the check passed
+ */
+ public final boolean checkNotRange(ITestAccessor accessor, T minValue, T maxValue, int milliseconds) throws InterruptedException {
+ return checkNotRange(accessor, (CheckGroup) null, minValue, true, maxValue, true, milliseconds);
+ }
+
+ /**
+ * Verifies that the element is set to a value outside the range specified. Assumes that both ends of the range are
+ * inclusive.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait for the element to be outside the range.
+ * @return if the check passed
+ */
+ public final boolean checkNotRange(ITestAccessor accessor, CheckGroup checkGroup, T minValue, T maxValue, int milliseconds) throws InterruptedException {
+ return checkNotRange(accessor, checkGroup, minValue, true, maxValue, true, milliseconds);
+ }
+
+ /**
+ * Verifies that the element is set to a value outside the range specified. Assumes that both ends of the range are
+ * inclusive. Therefore observed value may not equal either of the range values.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @return if the check passed
+ */
+ public final boolean checkNotRange(ITestAccessor accessor, CheckGroup checkGroup, T minValue, T maxValue) throws InterruptedException {
+ return checkNotRange(accessor, checkGroup, minValue, true, maxValue, true);
+ }
+
+ /**
+ * Verifies that the element is set to a value outside the range specified. Either end of the range can be set to be
+ * inclusive or not.
+ *
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+ * to the range value.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+ * to the range value.
+ * @return if the check passed
+ */
+ public final boolean checkNotRange(ITestAccessor accessor, T minValue, boolean minInclusive, T maxValue, boolean maxInclusive) throws InterruptedException {
+ return checkNotRange(accessor, (CheckGroup) null, minValue, minInclusive, maxValue, maxInclusive);
+ }
+
+ /**
+ * Verifies that the element is set to the "value" passed for the entire time passed into "milliseconds". Returns
+ * value found that caused failure or last value observed if time expires.
+ *
+ * @param accessor Reference to the accessor.
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @return last value observed. Either value expected or value found at timeout.
+ */
+ public T checkMaintain(ITestAccessor accessor, CheckGroup checkGroup, T value, int milliseconds) throws InterruptedException {
+ checkAccessor(accessor);
+ accessor.getLogger().methodCalledOnObject(accessor, getFullName(),
+ new MethodFormatter().add(value).add(milliseconds), getMessage());
+ EqualsCondition<T> c = new EqualsCondition<>(this, value);
+ waitWithCheckPoint(accessor, checkGroup, toString(value), c, true, milliseconds);
+ accessor.getLogger().methodEnded(accessor);
+ return c.getLastCheckValue();
+ }
+
+ public T checkMaintainNT(ITestAccessor accessor, T value, int milliseconds) throws InterruptedException {
+ checkAccessor(accessor);
+ accessor.getLogger().methodCalledOnObject(accessor, getFullName(),
+ new MethodFormatter().add(value).add(milliseconds), getMessage());
+ EqualsCondition<T> c = new EqualsCondition<>(this, value);
+ getMessage().waitForCondition(accessor, c, true, milliseconds);
+ accessor.getLogger().methodEnded(accessor);
+ return c.getLastCheckValue();
+ }
+
+ public T checkMaintainNotNT(ITestAccessor accessor, T value, int milliseconds) throws InterruptedException {
+ checkAccessor(accessor);
+ accessor.getLogger().methodCalledOnObject(accessor, getFullName(),
+ new MethodFormatter().add(value).add(milliseconds), getMessage());
+ EqualsCondition<T> c = new EqualsCondition<>(this, true, value);
+ getMessage().waitForCondition(accessor, c, true, milliseconds);
+ accessor.getLogger().methodEnded(accessor);
+ return c.getLastCheckValue();
+ }
+
+ /**
+ * Verifies that the element is set to the "value" passed for the entire time passed into "milliseconds". Returns
+ * value found that caused failure or last value observed if time expires.
+ *
+ * @return last value observed. Either value expected or value found at timeout.
+ */
+ public final T checkMaintain(ITestAccessor accessor, T value, int milliseconds) throws InterruptedException {
+ return checkMaintain(accessor, (CheckGroup) null, value, milliseconds);
+ }
+
+ /**
+ * Verifies that the element is set to a value other than the "value" passed for the entire time passed into
+ * "milliseconds". Returns value found that caused failure or last value observed if time expires.
+ *
+ * @param accessor Reference to the accessor.
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @return last value observed
+ */
+ public T checkMaintainNot(ITestAccessor accessor, CheckGroup checkGroup, T value, int milliseconds) throws InterruptedException {
+ checkAccessor(accessor);
+ accessor.getLogger().methodCalledOnObject(accessor, getFullName(),
+ new MethodFormatter().add(value).add(milliseconds), getMessage());
+
+ EqualsCondition<T> c = new EqualsCondition<>(this, true, value);
+ waitWithCheckPoint(accessor, checkGroup,
+
+ "Not " + toString(value), c, true, milliseconds);
+ accessor.getLogger().methodEnded(accessor);
+ return c.getLastCheckValue();
+ }
+
+ /**
+ * Verifies that the element is set to the "value" passed for the entire time passed into "milliseconds". Returns
+ * value found that caused failure or last value observed if time expires.
+ *
+ * @return last value observed
+ */
+ public final T checkMaintainNot(ITestAccessor accessor, T value, int milliseconds) throws InterruptedException {
+ return checkMaintainNot(accessor, (CheckGroup) null, value, milliseconds);
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified for the entire time specified.
+ *
+ * @param accessor Reference to the accessor.
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public T checkMaintainRange(ITestAccessor accessor, CheckGroup checkGroup, T minValue, boolean minInclusive, T maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ checkAccessor(accessor);
+ accessor.getLogger().methodCalledOnObject(accessor, getFullName(),
+ new MethodFormatter().add(minValue).add(minInclusive).add(maxValue).add(maxInclusive).add(milliseconds),
+ getMessage());
+
+ InRangeCondition<T> c = new InRangeCondition<>(this, minValue, minInclusive, maxValue, maxInclusive);
+ waitWithCheckPoint(accessor, checkGroup,
+ "In" + expectedRangeString(toString(minValue), minInclusive, toString(maxValue), maxInclusive), c, true,
+ milliseconds);
+ accessor.getLogger().methodEnded(accessor);
+ return c.getLastCheckValue();
+ }
+
+ public T checkMaintainRangeNT(ITestAccessor accessor, T minValue, boolean minInclusive, T maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ checkAccessor(accessor);
+ accessor.getLogger().methodCalledOnObject(accessor, getFullName(),
+ new MethodFormatter().add(minValue).add(minInclusive).add(maxValue).add(maxInclusive).add(milliseconds),
+ getMessage());
+ InRangeCondition<T> c = new InRangeCondition<>(this, minValue, minInclusive, maxValue, maxInclusive);
+ getMessage().waitForCondition(accessor, c, true, milliseconds);
+ accessor.getLogger().methodEnded(accessor);
+ return c.getLastCheckValue();
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified for the entire time specified.
+ *
+ * @param accessor Reference to the accessor.
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+ * to the range value.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+ * to the range value.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public T checkMaintainNotRange(ITestAccessor accessor, CheckGroup checkGroup, T minValue, boolean minInclusive, T maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ checkAccessor(accessor);
+ accessor.getLogger().methodCalledOnObject(accessor, getFullName(),
+ new MethodFormatter().add(minValue).add(minInclusive).add(maxValue).add(maxInclusive).add(milliseconds),
+ getMessage());
+
+ NotInRangeCondition<T> c = new NotInRangeCondition<>(this, minValue, minInclusive, maxValue, maxInclusive);
+ waitWithCheckPoint(accessor, checkGroup,
+ "Not In" + expectedRangeString(toString(minValue), minInclusive, toString(maxValue), maxInclusive), c, true,
+ milliseconds);
+ accessor.getLogger().methodEnded(accessor);
+ return c.getLastCheckValue();
+ }
+
+ public T checkMaintainNotRangeNT(ITestAccessor accessor, T minValue, boolean minInclusive, T maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ checkAccessor(accessor);
+ accessor.getLogger().methodCalledOnObject(accessor, getFullName(),
+ new MethodFormatter().add(minValue).add(minInclusive).add(maxValue).add(maxInclusive).add(milliseconds),
+ getMessage());
+
+ NotInRangeCondition<T> c = new NotInRangeCondition<>(this, minValue, minInclusive, maxValue, maxInclusive);
+ getMessage().waitForCondition(accessor, c, true, milliseconds);
+ accessor.getLogger().methodEnded(accessor);
+ return c.getLastCheckValue();
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified for the entire time specified. Assumes
+ * range is inclusive.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public final T checkMaintainNotRange(ITestAccessor accessor, CheckGroup checkGroup, T minValue, T maxValue, int milliseconds) throws InterruptedException {
+ return checkMaintainNotRange(accessor, checkGroup, minValue, true, maxValue, true, milliseconds);
+ }
+
+ public boolean checkPulse(ITestAccessor accessor, CheckGroup checkGroup, T pulsedValue, T nonPulsedValue, int milliseconds, int pulses) throws InterruptedException {
+ if (accessor == null) {
+ throw new NullPointerException("The parameter accessor is null");
+ }
+
+ accessor.getLogger().methodCalledOnObject(accessor, getFullName(),
+ new MethodFormatter().add(pulsedValue).add(nonPulsedValue).add(milliseconds), getMessage());
+ final PulseCondition<T> c = new PulseCondition<>(this, pulsedValue, nonPulsedValue, pulses);
+
+ MsgWaitResult result = getMessage().waitForCondition(accessor, c, false, milliseconds);
+ CheckPoint passFail =
+ new CheckPoint(getFullName(), toString(pulsedValue) + " FOR " + pulses + " PULSES",
+ toString(c.getLastCheckValue()) + " FOR " + c.getPulses() + " PULSES", result.isPassed(),
+ result.getElapsedTime());
+
+ if (checkGroup == null) {
+ accessor.getLogger().testpoint(accessor, accessor.getTestScript(), accessor.getTestCase(), passFail);
+ } else {
+ checkGroup.add(passFail);
+ }
+ accessor.getLogger().methodEnded(accessor);
+ return passFail.isPass();
+ }
+
+ public final boolean checkPulse(ITestAccessor accessor, T pulsedValue, T nonPulsedValue) throws InterruptedException {
+ return checkPulse(accessor, null, pulsedValue, nonPulsedValue);
+ }
+
+ public final boolean checkPulse(ITestAccessor accessor, CheckGroup checkGroup, T pulsedValue, T nonPulsedValue) throws InterruptedException {
+ return checkPulse(accessor, checkGroup, pulsedValue, nonPulsedValue, 1000, 2);
+ }
+
+ public final boolean checkPulse(ITestAccessor accessor, T pulsedValue, T nonPulsedValue, int milliseconds) throws InterruptedException {
+ return checkPulse(accessor, null, pulsedValue, nonPulsedValue, milliseconds, 2);
+ }
+
+ public final boolean checkPulse(ITestAccessor accessor, T pulsedValue, T nonPulsedValue, int milliseconds, int pulses) throws InterruptedException {
+ return checkPulse(accessor, null, pulsedValue, nonPulsedValue, milliseconds, pulses);
+ }
+
+ public boolean checkPulse(ITestAccessor accessor, CheckGroup checkGroup, T pulsedValue, T nonPulsedValue, int milliseconds) throws InterruptedException {
+ return checkPulse(accessor, checkGroup, pulsedValue, nonPulsedValue, milliseconds, 2);
+ }
+
+ public abstract T valueOf(MemoryResource mem);
+
+ @Override
+ public String toString() {
+
+ return elementName + "=" + getValue().toString();
+ }
+
+ @Override
+ public int compareTo(DiscreteElement<T> o) {
+ return getValue().compareTo(o.getValue());
+ }
+
+ /**
+ * Verifies that the element is set to a value in the "list".
+ *
+ * @param list List of values to check for
+ * @return if check passed
+ */
+ public final boolean checkInList(ITestAccessor accessor, T[] list) {
+ return checkList(accessor, null, true, list);
+ }
+
+ /**
+ * Verifies that the element is set to a value NOT in the "list".
+ *
+ * @param list List of values to check for
+ * @return if check passed
+ */
+ public final boolean checkNotInList(ITestAccessor accessor, T[] list) {
+ return checkList(accessor, null, false, list);
+ }
+
+ /**
+ * Verifies that the element is set to a value IN or NOT IN the "list" passed. "isInList" determines if checking for
+ * IN the list or NOT.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param isInList Determines if checking for the element's value to be in or not in the "list". Passing TRUE will
+ * test for IN the "list".
+ * @param list List of values to check for
+ * @param milliseconds Number of milliseconds to wait
+ * @return if check passed
+ */
+ public boolean checkList(ITestAccessor accessor, CheckGroup checkGroup, boolean isInList, T[] list, int milliseconds) throws InterruptedException {
+ ListCondition<T> c = new ListCondition<>(this, isInList, list);
+
+ if (accessor == null) {
+ throw new NullPointerException("The parameter accessor is null");
+ }
+ accessor.getLogger().methodCalledOnObject(accessor, getFullName(),
+ new MethodFormatter().add(isInList).add(list).add(milliseconds), getMessage());
+
+ MsgWaitResult result = getMessage().waitForCondition(accessor, c, false, milliseconds);
+ CheckGroup passFail = inList(accessor, isInList, c.getLastCheckValue(), list, result.getElapsedTime());
+ assert result.isPassed() == passFail.isPass() : "result does not match checkgroup";
+ if (checkGroup == null) {
+ accessor.getLogger().testpoint(accessor, accessor.getTestScript(), accessor.getTestCase(), passFail);
+ } else {
+ checkGroup.add(passFail);
+ }
+ accessor.getLogger().methodEnded(accessor);
+ return passFail.isPass();
+ }
+
+ /**
+ * Verifies that the element is set to a value NOT in the "list".
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param list List of values to check for
+ * @return if check passed
+ */
+ public final boolean checkNotInList(ITestAccessor accessor, CheckGroup checkGroup, T[] list) {
+ return this.checkList(accessor, checkGroup, false, list);
+ }
+
+ /**
+ * Verifies that the element is set to a value NOT in the "list".
+ *
+ * @param list List of values to check for
+ * @param milliseconds Number of milliseconds to wait
+ * @return if check passed
+ */
+ public final boolean checkNotInList(ITestAccessor accessor, T[] list, int milliseconds) throws InterruptedException {
+ return this.checkList(accessor, (CheckGroup) null, false, list, milliseconds);
+ }
+
+ /**
+ * Verifies that the element is set to a value IN or NOT IN the "list" passed. "wantInList" determines if checking
+ * for IN the list or NOT.
+ *
+ * @param wantInList Determines if checking for the element's value to be in or not in the "list". Passing TRUE will
+ * test for IN the "list".
+ * @param list List of values to check for
+ * @return if check passed
+ */
+ public final boolean checkList(ITestAccessor accessor, boolean wantInList, T[] list) {
+ return this.checkList(accessor, null, wantInList, list);
+ }
+
+ /**
+ * Verifies that the element is set to a value IN or NOT IN the "list" passed. "isInList" determines if checking for
+ * IN the list or NOT.
+ *
+ * @param isInList Determines if checking for the element's value to be in or not in the "list". Passing TRUE will
+ * test for IN the "list".
+ * @param list List of values to check for
+ * @param milliseconds Number of milliseconds to wait
+ * @return if check passed
+ */
+ public final boolean checkList(ITestAccessor accessor, boolean isInList, T[] list, int milliseconds) throws InterruptedException {
+ return checkList(accessor, (CheckGroup) null, isInList, list, milliseconds);
+ }
+
+ /**
+ * Verifies that the element is set to a value IN or NOT IN the "list" passed. "wantInList" determines if checking
+ * for IN the list or NOT.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param wantInList Determines if checking for the element's value to be in or not in the "list". Passing TRUE will
+ * test for IN the "list".
+ * @param list List of values to check for
+ * @return if check passed
+ */
+ public boolean checkList(ITestAccessor accessor, CheckGroup checkGroup, boolean wantInList, T[] list) {
+
+ final T actualValue = getValue();
+
+ // Check if the value is in the list
+ CheckGroup passFail = inList(accessor, wantInList, actualValue, list, 0);
+
+ if (checkGroup == null) {
+ accessor.getLogger().testpoint(accessor, accessor.getTestScript(), accessor.getTestCase(), passFail);
+ } else {
+ checkGroup.add(passFail);
+ }
+
+ return passFail.isPass();
+ }
+
+ /**
+ * Verifies that the element is set to a value in the "list".
+ *
+ * @param list List of values to check for
+ * @param milliseconds Number of milliseconds to wait
+ * @return if check passed
+ */
+ public final boolean checkInList(ITestAccessor accessor, T[] list, int milliseconds) throws InterruptedException {
+ return this.checkList(accessor, (CheckGroup) null, true, list, milliseconds);
+ }
+
+ /**
+ * Verifies that the element is set to a value NOT in the "list".
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param list List of values to check for
+ * @param milliseconds Number of milliseconds to wait
+ * @return if check passed
+ */
+ public final boolean checkNotInList(ITestAccessor accessor, CheckGroup checkGroup, T[] list, int milliseconds) throws InterruptedException {
+ return this.checkList(accessor, checkGroup, false, list, milliseconds);
+ }
+
+ /**
+ * Verifies that the element is set to a value in the list for the entire time passed into milliseconds.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param list The list of values to check against
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public final T checkMaintainInList(ITestAccessor accessor, CheckGroup checkGroup, T[] list, int milliseconds) throws InterruptedException {
+ return this.checkMaintainList(accessor, checkGroup, list, true, milliseconds);
+ }
+
+ /**
+ * Verifies that the element is set to a value not in the list for the entire time passed into milliseconds.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param list The list of values to check against
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public final T checkMaintainNotInList(ITestAccessor accessor, CheckGroup checkGroup, T[] list, int milliseconds) throws InterruptedException {
+ return this.checkMaintainList(accessor, checkGroup, list, false, milliseconds);
+ }
+
+ /**
+ * Verifies that the element is set to a value in the "list".
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param list List of values to check for
+ * @param milliseconds Number of milliseconds to wait
+ * @return if check passed
+ */
+ public final boolean checkInList(ITestAccessor accessor, CheckGroup checkGroup, T[] list, int milliseconds) throws InterruptedException {
+ return this.checkList(accessor, checkGroup, true, list, milliseconds);
+ }
+
+ /**
+ * Verifies that the element is set to a value in the "list".
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param list List of values to check for
+ * @return if check passed
+ */
+ public final boolean checkInList(ITestAccessor accessor, CheckGroup checkGroup, T[] list) {
+ return checkList(accessor, checkGroup, true, list);
+ }
+
+ /**
+ * Waits until the element is set to a value either in or not in the "list" as determined by "isInList".
+ *
+ * @param list The list of values to check against
+ * @param isInList If the value is expected to be in or not in the "list"
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public T waitForList(ITestAccessor accessor, T[] list, boolean isInList, int milliseconds) throws InterruptedException {
+
+ accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(),
+ new MethodFormatter().add(list).add(isInList).add(milliseconds), this.getMessage());
+
+ ListCondition<T> c = new ListCondition<>(this, isInList, list);
+ getMessage().waitForCondition(accessor, c, false, milliseconds);
+ accessor.getLogger().methodEnded(accessor);
+ return c.getLastCheckValue();
+ }
+
+ public T checkMaintainList(ITestAccessor accessor, CheckGroup checkGroup, T[] list, boolean isInList, int milliseconds) throws InterruptedException {
+ accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(),
+ new MethodFormatter().add(list).add(isInList).add(milliseconds), this.getMessage());
+
+ ListCondition<T> c = new ListCondition<>(this, isInList, list);
+
+ MsgWaitResult result = getMessage().waitForCondition(accessor, c, true, milliseconds);
+
+ T value = c.getLastCheckValue();
+
+ CheckGroup passFail = inList(accessor, isInList, value, list, result.getElapsedTime());
+ if (checkGroup == null) {
+ accessor.getLogger().testpoint(accessor, accessor.getTestScript(), accessor.getTestCase(), passFail);
+ } else {
+ checkGroup.add(passFail);
+ }
+ accessor.getLogger().methodEnded(accessor);
+ return value;
+ }
+
+ /**
+ * This method checks a an array of EnumBase objects to determine if a given EnumBase object is or isn't in the list.
+ * It then returns a CheckGroup object that describes the checks and pass/fail status.
+ *
+ * @param isInList <ul>
+ * <li><b>True </b> used to get a pass iff the item is in the list.</li>
+ * <li><b>False </b> used to get a pass iff the item is not in the list.</li>
+ * </ul>
+ * @param actual The EnumBase object to check for.
+ * @param list The array of EnumBase objects to look through.
+ * @return A CheckGroup object that describes all comparisons made and outcomes.
+ */
+ private CheckGroup inList(ITestAccessor accessor, boolean isInList, T actual, T[] list, long elapsedTime) {
+ accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(),
+ new MethodFormatter().add(isInList).add(actual).add(list), this.getMessage());
+ CheckGroup checkGroup;
+ final String not = "Not ";
+
+ int i = 0;
+ // Build CheckPoint based on the type of check
+ if (isInList) {
+ checkGroup = new CheckGroup(Operation.OR, this.getFullName()); // Pass if at least one item
+ // matches
+ for (T expected : list) {
+ // Check if current item in the list matches.
+ checkGroup.add(new CheckPoint("List Item: " + i, expected.toString(), actual.toString(), expected.equals(actual),
+ elapsedTime));
+ i++;
+ }
+ } else {
+ checkGroup = new CheckGroup(Operation.AND, this.getFullName()); // Pass iff none of the
+ // items match
+ for (T expected : list) {
+ checkGroup.add(new CheckPoint("List Item: " + i, not + expected.toString(), actual.toString(),
+ !expected.equals(actual), elapsedTime));
+ i++;
+ }
+ }
+ accessor.getLogger().methodEnded(accessor);
+ return checkGroup;
+ }
+
+ /**
+ * Sets the element to the first enumeration for the wait time and then it sets it to the second enumeration.
+ */
+ public synchronized void toggle(ITestEnvironmentAccessor accessor, T value1, T value2, int milliseconds) throws InterruptedException {
+ accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(),
+ new MethodFormatter().add(value1).add(value2).add(milliseconds), getMessage());
+
+ set(accessor, value1);
+ accessor.setTimerFor(this, milliseconds);
+ wait();
+ accessor.getScriptCtrl().lock();
+ set(accessor, value2);
+
+ accessor.getLogger().methodEnded(accessor);
+ }
+
+ /**
+ * Will be removed in MS_0.1.6.
+ *
+ * @use {@link #getValue()} instead
+ */
+ @Deprecated
+ public T get() {
+ return getValue();
+ }
+
+ /**
+ * gets this element's current value. Does logging
+ */
+ public T get(ITestEnvironmentAccessor accessor) {
+// accessor.getLogger().methodCalled(accessor, new MethodFormatter());
+ if (accessor != null) {
+ accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(), new MethodFormatter(),
+ getMessage());
+ }
+
+ T v = getValue();
+ ReturnFormatter returnFormatter = new ReturnFormatter();
+ returnFormatter.add(v);
+ if (accessor != null) {
+ accessor.getLogger().methodEnded(accessor, returnFormatter);
+ }
+ return v;
+ }
+
+ /**
+ * get this elements current value
+ *
+ * @return the value of this element
+ */
+ public T getNoLog() {
+ return getValue();
+ }
+
+ @Deprecated
+ public void set(T value) {
+ setValue(value);
+ }
+
+ public void setNoLog(T value) {
+ setValue(value);
+ }
+
+ @Deprecated
+ public void setNoLog(ITestEnvironmentAccessor accessor, T value) {
+ setValue(value);
+ }
+
+ private void checkAccessor(ITestEnvironmentAccessor accessor) {
+ if (accessor == null) {
+ throw new NullPointerException("The parameter accessor is null");
+ }
+ }
+
+ abstract public T elementMask(T value);
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/Element.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/Element.java
new file mode 100644
index 000000000..86b57e415
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/Element.java
@@ -0,0 +1,316 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.elements;
+
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.logging.Level;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ITimeout;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.MessageSystemException;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.enums.DataType;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public abstract class Element implements ITimeout {
+// protected final Message msg;
+ private final WeakReference<Message> msg;
+ protected String elementName;
+ private volatile boolean timedOut;
+ private final List<Object> elementPath;
+ private final String fullName;
+
+ protected final int byteOffset;
+ protected int lsb;
+ protected final MessageData messageData;
+ protected int msb;
+ protected final int originalMsb;
+ protected final int originalLsb;
+ private String elementPathAsString;
+
+ public Element(Message msg, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalMsb, int originalLsb) {
+ this.msg = new WeakReference<>(msg);
+ this.elementName = elementName;
+ this.messageData = messageData;
+ this.byteOffset = byteOffset;
+ this.lsb = lsb;
+ this.msb = msb;
+ this.originalLsb = originalLsb;
+ this.originalMsb = originalMsb;
+ elementPath = new ArrayList<>();
+ fullName = (msg != null ? msg.getName() : messageData.getName()) + "." + this.elementName;
+ }
+
+ public Element(Message msg, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+ this(msg, elementName, messageData, bitOffset / 8, 0, 0, 0, 0);
+ this.msb = bitOffset % 8;
+ this.lsb = msb + bitLength - 1;
+ }
+
+ public Element(Message msg, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+ this(msg, elementName, messageData, byteOffset, msb, lsb, msb, lsb);
+ }
+
+ public int getMsb() {
+ return msb;
+ }
+
+ public int getLsb() {
+ return lsb;
+ }
+
+ public int getByteOffset() {
+ return byteOffset;
+ }
+
+ public MessageData getMsgData() {
+ return messageData;
+ }
+
+ public int getBitLength() {
+ return Math.abs(getMsb() - getLsb()) + 1;
+ }
+
+ public int getStartingBit() {
+ return getByteOffset() * 8 + Math.min(getMsb(), getLsb());
+ }
+
+ /*
+ * protected void set(TestEnvironmentAccessor accessor, long value) { if (accessor != null) {
+ * accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(), (new MethodFormatter()).add(value)); }
+ * ((MemHolder) current.get()).getMem().s.setLong(value); if (accessor != null) {
+ * accessor.getLogger().methodEnded(accessor); } }
+ */
+ /**
+ * @return Returns full name string.
+ */
+ public String getFullName() {
+ return fullName;
+ }
+
+ public String getName() {
+ return this.elementName;
+ }
+
+ public String getDescriptiveName() {
+ return this.elementName;
+ }
+
+ /**
+ * @return Returns the msg.
+ */
+ public Message getMessage() {
+ return msg.get();
+ }
+
+ public String getElementName() {
+ return elementName;
+ }
+
+ @Override
+ public boolean isTimedOut() {
+ return this.timedOut;
+ }
+
+ @Override
+ public void setTimeout(boolean timeout) {
+ this.timedOut = timeout;
+ }
+
+ public DataType getType() {
+ return messageData.getType();
+ }
+
+ /**
+ * @return Returns the lsb.
+ */
+ public int getOriginalLsb() {
+ return originalLsb;
+ }
+
+ /**
+ * @return Returns the msb.
+ */
+ public int getOriginalMsb() {
+ return originalMsb;
+ }
+
+ private int calculateBitsToShift() {
+ int size = lsb - msb + 1;
+ return 32 - size;
+ }
+
+ private int calculateLongBitsToShift() {
+ int size = lsb - msb + 1;
+ return 64 - size;
+ }
+
+ protected int signExtend(int value) {
+ int bitsToShift = calculateBitsToShift();
+ return value << bitsToShift >> bitsToShift;
+ }
+
+ protected int removeSign(int value) {
+ int bitsToShift = calculateBitsToShift();
+ return value << bitsToShift >>> bitsToShift;
+ }
+
+ protected long removeSign(long value) {
+ int bitsToShift = calculateLongBitsToShift();
+ return value << bitsToShift >>> bitsToShift;
+ }
+
+ /**
+ * @return whether this message maps solely to PubSub
+ */
+ public boolean isNonMappingElement() {
+ return false;
+ }
+
+ /**
+ * Looks for the element matching this elements name inside one of the messages passed
+ *
+ * @param messages Those messages mapped to a certain physical type, one of whom contains a mapping to this element
+ * @return An element of one of the messages passed with the same name as this element or this element if no match is
+ * found.
+ */
+ @SuppressWarnings("rawtypes")
+ public Element findElementInMessages(Collection<? extends Message> messages) {
+ for (Message currentMessage : messages) {
+ // System.out.println("SwitchMessages" + currentMessage.getMessageName());
+ Element el = currentMessage.getElement(this.getElementPath());
+ if (el != null && currentMessage.isValidElement(this, el)) {
+ return el;
+ }
+ }
+ return this.getNonMappingElement();
+ }
+
+ public Element switchMessages(Collection<? extends Message<?,?,?>> messages) {
+ for (Message currentMessage : messages) {
+ // System.out.println("SwitchMessages" + currentMessage.getMessageName());
+ Element el = currentMessage.getElement(this.getElementPath());
+ if (el != null && currentMessage.isValidElement(this, el)) {
+ return el;
+ }
+ }
+ return this.getNonMappingElement();
+ }
+
+ protected void sendMessage() {
+ this.getMessage().send();
+ }
+
+ /**
+ * This method returns a properly formatted string that describes the range and inclusive/exclusive properties of
+ * each end of the range.
+ *
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+ * to the range value.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+ * to the range value.
+ * @return the string holding "[", "]", "(", or ")"
+ */
+ protected static String expectedRangeString(Object minValue, boolean minInclusive, Object maxValue, boolean maxInclusive) {
+ // A means for a return value
+ String retVal;
+
+ // Start with the proper symbol for the lower bound
+ if (minInclusive) {
+ retVal = "[";
+ } else {
+ retVal = "(";
+ }
+
+ // Add in the minimum and maximum values
+ retVal += minValue + " .. " + maxValue;
+
+ // End with the proper symbol for the upper bound
+ if (maxInclusive) {
+ retVal += "]";
+ } else {
+ retVal += ")";
+ }
+
+ // Return the formatted string
+ return retVal;
+ }
+
+ protected abstract Element getNonMappingElement();
+
+ protected void throwNoMappingElementException() {
+ throw new MessageSystemException(
+ "The element " + msg.get().getName() + "." + elementName + " does not exist for the message's current MemType!! " + "\nIt shouldn't be used for this environment type!!",
+ Level.SEVERE);
+ }
+
+ /**
+ * @return the elementPath
+ */
+ public List<Object> getElementPath() {
+ return elementPath;
+ }
+
+ public void addPath(Object... objs) {
+ for (Object obj : objs) {
+ elementPath.add(obj);
+ }
+ elementPath.add(this.getName());
+ }
+
+ @Override
+ public String toString() {
+
+ return elementName;
+ }
+
+ public void zeroize() {
+
+ getMsgData().getMem().setLong(0L, byteOffset, msb, lsb);
+
+ }
+
+ public void visit(IElementVisitor visitor) {
+ visitor.asGenericElement(this);
+ }
+
+ public String getElementPathAsString() {
+ if (elementPathAsString == null) {
+ StringBuilder sb = new StringBuilder();
+ for (int i = 1; i < elementPath.size(); i++) {
+ Object obj = elementPath.get(i);
+ if (obj instanceof String) {
+ sb.append(obj);
+
+ } else if (obj instanceof Integer) {
+ sb.delete(sb.length() - 1, sb.length());
+ sb.append("[");
+ sb.append(((Integer) obj).intValue());
+ sb.append("]");
+ }
+ if (i < elementPath.size() - 1) {
+ sb.append(".");
+ }
+ }
+ elementPathAsString = sb.toString();
+ }
+ return elementPathAsString;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/EmptyEnum_Element.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/EmptyEnum_Element.java
new file mode 100644
index 000000000..39f13c5c3
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/EmptyEnum_Element.java
@@ -0,0 +1,135 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.elements;
+
+import java.util.Collection;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.nonmapping.NonMappingEmptyEnumElement;
+import org.eclipse.osee.ote.message.enums.EmptyEnum;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+
+/**
+ * @author Michael P. Masterson
+ */
+public class EmptyEnum_Element extends DiscreteElement<EmptyEnum> {
+
+ public EmptyEnum_Element(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+ this(message, elementName, messageData, byteOffset, msb, lsb, msb, lsb);
+ }
+
+ public EmptyEnum_Element(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+ super(message, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
+ }
+
+ public EmptyEnum_Element(Message message, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+ super(message, elementName, messageData, bitOffset, bitLength);
+ }
+
+ /**
+ * Checks that this element correctly forwards a message sent from cause with the value passed.
+ *
+ * @param cause The originator of the signal
+ * @param value The value sent by cause and being forwarded by this element
+ */
+ public void checkForwarding(ITestAccessor accessor, EmptyEnum_Element cause, EmptyEnum value) throws InterruptedException {
+ /* check for 0 to begin */
+ check(accessor, EmptyEnum.toEnum(0), 0);
+
+ /* Set the DP1 Signal */
+ cause.set(accessor, value);
+
+ /* Check Value on DP2 */
+ check(accessor, value, 1000);
+
+ /* Set DP1 to 0 */
+ cause.set(accessor, EmptyEnum.toEnum(0));
+
+ /* Set DP2 Mux to 0 */
+ set(accessor, EmptyEnum.toEnum(0));
+
+ /* Check Value on DP2 is still set */
+ check(accessor, value, 500);
+
+ /* Check DP2 is 0 for two-pulse signals and high for four-pulse signal */
+ check(accessor, EmptyEnum.toEnum(0), 500);
+
+ }
+
+ @Override
+ @Deprecated
+ public EmptyEnum_Element findElementInMessages(Collection<? extends Message> messages) {
+ return (EmptyEnum_Element) super.findElementInMessages(messages);
+ }
+
+ @Override
+ public EmptyEnum_Element switchMessages(Collection<? extends Message<?,?,?>> messages) {
+ return (EmptyEnum_Element) super.switchMessages(messages);
+ }
+
+ /**
+ * Sets the element to the "value" passed and immediately sends the message that contains it.
+ *
+ * @param enumeration The value to set.
+ */
+ public void setAndSend(ITestEnvironmentAccessor accessor, EmptyEnum enumeration) {
+ this.set(accessor, enumeration);
+ super.sendMessage();
+ }
+
+ @Override
+ protected Element getNonMappingElement() {
+ return new NonMappingEmptyEnumElement(this);
+ }
+
+ @Override
+ public void visit(IElementVisitor visitor) {
+ visitor.asEmptyEnumElement(this);
+ }
+
+ @Override
+ public void parseAndSet(ITestEnvironmentAccessor accessor, String value) throws IllegalArgumentException {
+ int intValue = Integer.parseInt(value);
+ getMsgData().getMem().setInt(intValue, byteOffset, msb, lsb);
+ }
+
+ @Override
+ public EmptyEnum getValue() {
+ return toEnum(getMsgData().getMem().getInt(byteOffset, msb, lsb));
+ }
+
+ @Override
+ public void setValue(EmptyEnum obj) {
+ getMsgData().getMem().setInt(obj.getValue(), byteOffset, msb, lsb);
+ }
+
+ @Override
+ public String toString(EmptyEnum obj) {
+ return "EmptyEnum_" + obj.getValue();
+ }
+
+ @Override
+ public EmptyEnum valueOf(MemoryResource mem) {
+ return toEnum(mem.getInt(byteOffset, msb, lsb));
+ }
+
+ private EmptyEnum toEnum(int intValue) {
+ return EmptyEnum.toEnum(intValue);
+ }
+
+ @Override
+ public EmptyEnum elementMask(EmptyEnum value) {
+ return value;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/EnumeratedElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/EnumeratedElement.java
new file mode 100644
index 000000000..be3fabc6d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/EnumeratedElement.java
@@ -0,0 +1,193 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.elements;
+
+import java.util.Collection;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.nonmapping.NonMappingEnumeratedElement;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class EnumeratedElement<T extends Enum<T> & IEnumValue<T>> extends DiscreteElement<T> {
+
+ private final Class<T> clazz;
+ private final T[] values;
+
+ public EnumeratedElement(Message msg, String elementName, Class<T> clazz, MessageData messageData, int byteOffset, int msb, int lsb, int originalMsb, int originalLsb) {
+ super(msg, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
+ this.clazz = clazz;
+
+ values = clazz.getEnumConstants();
+ }
+
+ public EnumeratedElement(Message msg, String elementName, Class<T> clazz, MessageData messageData, int byteOffset, int msb, int lsb) {
+ this(msg, elementName, clazz, messageData, byteOffset, msb, lsb, msb, lsb);
+ }
+
+ private T getValue(int intVal) {
+ T undefined = null;
+ for (T val : values) {
+ if (val.getIntValue() == intVal) {
+ return val;
+ } else if (undefined == null) {
+ undefined = val.getEnum(intVal);
+ }
+ }
+ return undefined;
+ }
+
+ public EnumeratedElement(Message message, String elementName, Class<T> clazz, MessageData messageData, int bitOffset, int bitLength) {
+ super(message, elementName, messageData, bitOffset, bitLength);
+ this.clazz = clazz;
+
+ values = clazz.getEnumConstants();
+ }
+
+ public int getIntValue() {
+ return getMsgData().getMem().getInt(byteOffset, msb, lsb);
+ }
+
+ /**
+ * Sets the element to the "value" passed and immediately sends the meessage that contains it.
+ *
+ * @param enumeration The value to set.
+ */
+ public void setAndSend(ITestEnvironmentAccessor accessor, T enumeration) {
+ this.set(accessor, enumeration);
+ super.sendMessage();
+ }
+
+ /**
+ * Waits until the element is set to a value not in the "list" passed
+ *
+ * @param list The list of values to check against
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public T waitForNotInList(ITestAccessor accessor, T[] list, int milliseconds) throws InterruptedException {
+ return this.waitForList(accessor, list, false, milliseconds);
+ }
+
+ /**
+ * Waits until the element is set to a value in the "list" passed
+ *
+ * @param list The list of values to check against
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public T waitForInList(ITestAccessor accessor, T[] list, int milliseconds) throws InterruptedException {
+ return this.waitForList(accessor, list, true, milliseconds);
+ }
+
+ /**
+ * This function will verify that this signal is pulsed for 2 cycles.
+ *
+ * @param value The value to be checked
+ */
+ public void checkPulse(ITestAccessor accessor, T value) throws InterruptedException {
+
+ T nonPulsedValue = getValue(0);
+ if (value == nonPulsedValue) {
+ nonPulsedValue = getValue(1);
+ }
+
+ checkPulse(accessor, value, nonPulsedValue);
+
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Override
+ public EnumeratedElement<T> findElementInMessages(Collection<? extends Message> messages) {
+ return (EnumeratedElement<T>) super.findElementInMessages(messages);
+ }
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public EnumeratedElement<T> switchMessages(Collection<? extends Message<?,?,?>> messages) {
+ return (EnumeratedElement<T>) super.switchMessages(messages);
+ }
+
+ protected T toEnum(int intValue) {
+ final T val = getValue(intValue);
+ if (val != null) {
+ return val;
+ }
+ throw new IllegalArgumentException(
+ "No enum value associated with the integer value " + intValue + " for element " + getName());
+ }
+
+ @Override
+ public T getValue() {
+ return toEnum(getMsgData().getMem().getInt(byteOffset, msb, lsb));
+ }
+
+ @Override
+ public T valueOf(MemoryResource otherMem) {
+ return toEnum(otherMem.getInt(byteOffset, msb, lsb));
+ }
+
+ @Override
+ public void setValue(T obj) {
+ getMsgData().getMem().setInt(obj.getIntValue(), byteOffset, msb, lsb);
+ }
+
+ public T[] getEnumValues() {
+ return clazz.getEnumConstants();
+ }
+
+ @Override
+ public String toString(T obj) {
+ return String.format("%s [%d]", obj.name(), obj.getIntValue());
+ }
+
+ @Override
+ public void parseAndSet(ITestEnvironmentAccessor accessor, String value) throws IllegalArgumentException {
+ this.set(accessor, Enum.valueOf(clazz, value));
+ }
+
+ public void set(String value) throws IllegalArgumentException {
+ this.setValue(Enum.valueOf(clazz, value));
+ }
+
+ public void setbyEnumIndex(int index) throws IllegalArgumentException {
+ getMsgData().getMem().setInt(values[index].getIntValue(), byteOffset, msb, lsb);
+ }
+
+ @Override
+ public void visit(IElementVisitor visitor) {
+ visitor.asEnumeratedElement(this);
+ }
+
+ @Override
+ protected NonMappingEnumeratedElement<T> getNonMappingElement() {
+ return new NonMappingEnumeratedElement<T>(this);
+ }
+
+ @Override
+ public String valueOf() {
+ return String.format("%s [%d]", getValue().name(), getIntValue());
+ }
+
+ public Class<T> getEnumClass() {
+ return clazz;
+ }
+
+ @Override
+ public T elementMask(T value) {
+ return value;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/FixedPointElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/FixedPointElement.java
new file mode 100644
index 000000000..505e6e3b2
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/FixedPointElement.java
@@ -0,0 +1,342 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.elements;
+
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.MethodFormatter;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.testPoint.CheckGroup;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.MessageSystemTestEnvironment;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.nonmapping.NonMappingFixedPointElement;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+
+/**
+ * @author Andrew M. Finkbeiner
+ * @author John Butler
+ */
+public class FixedPointElement extends RealElement {
+
+ private final double resolution;
+ private final boolean signed;
+ private final double offset;
+
+ public FixedPointElement(Message message, String elementName, MessageData messageData, double resolution, boolean signed, int byteOffset, int msb, int lsb) {
+ this(message, elementName, messageData, resolution, 0, signed, byteOffset, msb, lsb, msb, lsb);
+ }
+
+ public FixedPointElement(Message message, String elementName, MessageData messageData, double resolution, double offset, boolean signed, int byteOffset, int msb, int lsb) {
+ this(message, elementName, messageData, resolution, offset, signed, byteOffset, msb, lsb, msb, lsb);
+ }
+
+ public FixedPointElement(Message message, String elementName, MessageData messageData, double resolution, boolean signed, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+ this(message, elementName, messageData, resolution, 0, signed, byteOffset, msb, lsb, originalLsb, originalMsb);
+ }
+
+ public FixedPointElement(Message message, String elementName, MessageData messageData, double resolution, double offset, boolean signed, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+ super(message, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
+ this.resolution = resolution;
+ this.signed = signed;
+ this.offset = offset;
+ }
+
+ public FixedPointElement(Message message, String elementName, MessageData messageData, double resolution, double offset, boolean signed, int bitOffset, int bitLength) {
+ super(message, elementName, messageData, bitOffset, bitLength);
+ this.resolution = resolution;
+ this.signed = signed;
+ this.offset = offset;
+ }
+
+ /**
+ * Sets the element to the "value" passed.
+ *
+ * @param value The value to set.
+ */
+ @Override
+ public void set(ITestEnvironmentAccessor accessor, double value) {
+ if (accessor != null) {
+ accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(), new MethodFormatter().add(value),
+ this.getMessage());
+ }
+ setValue(value);
+
+ if (accessor != null) {
+ accessor.getLogger().methodEnded(accessor);
+ }
+ }
+
+ /**
+ * Sets the element to the "value" passeda nd immediately sends the message that contains it...
+ *
+ * @param value The value to set.
+ */
+ @Override
+ public void setAndSend(ITestEnvironmentAccessor accessor, double value) {
+ this.set(accessor, value);
+ super.sendMessage();
+ }
+
+ public void setNoLog(ITestEnvironmentAccessor accessor, double value) {
+ setValue(value);
+ }
+
+ /**
+ * Checks that this element correctly forwards a message sent from cause with the value passed.
+ *
+ * @param cause The originator of the signal
+ * @param value The value sent by cause and being forwarded by this element
+ */
+ public void checkForwarding(ITestAccessor accessor, FixedPointElement cause, double value) throws InterruptedException {
+ /* check for 0 to begine */
+ check(accessor, 0d, 0);
+
+ /* Set the DP1 Mux Signal */
+ cause.set(accessor, value);
+
+ /* Chk Value on DP2 */
+ check(accessor, value, 1000);
+
+ /* Set DP1 to 0 */
+ cause.set(accessor, 0);
+
+ /* Init DP2 Mux to 0 */
+ set(accessor, 0);
+
+ /* Chk Value on DP2 is still set */
+ check(accessor, value, 500);
+
+ /* Chk DP2 is 0 for two-pulse signals and high for four-oulse signal */
+ check(accessor, 0d, 500);
+ }
+
+ private double toFixed(long value, boolean signed, double resolution, double offset) {
+ int shift = 64 - (lsb - msb + 1);
+ if (signed) {// two's compliment
+ if (value >>> lsb - msb == 1) {// we've got a negative
+ value--;
+ value = ~value;
+ value = value << shift;
+ value = value >>> shift;
+ value = value * -1;
+ }
+ } else {
+ value = value << shift;
+ value = value >>> shift;
+ }
+ return value * resolution + offset;
+ }
+
+ private long toFixedLong(double value, boolean signed, double resolution, double offset) {
+ long returnValue = Math.round((value - offset) / resolution);
+
+ if (value > 0 && toFixed(returnValue, signed, resolution, offset) < 0) {
+ returnValue = Math.round((value - resolution - offset) / resolution);
+ if (value > 0 && toFixed(returnValue, signed, resolution, offset) < 0) {
+ returnValue = Math.round((value - resolution * 2 - offset) / resolution);
+ if (value > 0 && toFixed(returnValue, signed, resolution, offset) < 0) {
+ OseeLog.log(MessageSystemTestEnvironment.class, Level.INFO, getName());
+ } else {
+ OseeLog.log(MessageSystemTestEnvironment.class, Level.INFO, getName());
+ }
+ } else {
+ OseeLog.log(MessageSystemTestEnvironment.class, Level.INFO, getName());
+ }
+ }
+
+ if (signed && value < 0) {
+ returnValue = returnValue * -1;
+ int shift = 64 - (lsb - msb + 1);
+ returnValue = returnValue << shift;
+ returnValue = ~returnValue;
+ returnValue = returnValue >>> shift;
+ returnValue++;
+ }
+ return returnValue;
+ }
+
+ @Override
+ public void setValue(Double obj) {
+ getMsgData().getMem().setLong(toFixedLong(obj, signed, resolution, offset), byteOffset, msb, lsb);
+ }
+
+ @Override
+ public void setHex(long hex) {
+ getMsgData().getMem().setLong(hex, byteOffset, msb, lsb);
+ }
+
+ @Override
+ public Double getValue() {
+ return toFixed(getRaw(), signed, resolution, offset);
+ }
+
+ @Override
+ public Double valueOf(MemoryResource mem) {
+ return toFixed(getRaw(mem), signed, resolution, offset);
+ }
+
+ @Override
+ protected double toDouble(long value) {
+ return toFixed(value, signed, resolution, offset);
+ }
+
+ @Override
+ protected long toLong(double value) {
+ return toFixedLong(value, signed, resolution, offset);
+ }
+
+ /**
+ * @return Returns the offset.
+ */
+ public double getMinVal() {
+ return offset;
+ }
+
+ /**
+ * @return Returns the resolution.
+ */
+ public double getResolution() {
+ return resolution;
+ }
+
+ /**
+ * @return Returns the signed.
+ */
+ public boolean isSigned() {
+ return signed;
+ }
+
+ @Override
+ public void visit(IElementVisitor visitor) {
+ visitor.asFixedPointElement(this);
+ }
+
+ @Override
+ protected NonMappingFixedPointElement getNonMappingElement() {
+ return new NonMappingFixedPointElement(this);
+ }
+
+ @Override
+ public boolean check(ITestAccessor accessor, CheckGroup checkGroup, Double value, int milliseconds) throws InterruptedException {
+ return super.check(accessor, checkGroup, adjust(value), milliseconds);
+ }
+
+ @Override
+ public boolean check(ITestAccessor accessor, CheckGroup checkGroup, Double value) {
+ return super.check(accessor, checkGroup, adjust(value));
+ }
+
+ @Override
+ public boolean checkList(ITestAccessor accessor, CheckGroup checkGroup, boolean isInList, Double[] list, int milliseconds) throws InterruptedException {
+ return super.checkList(accessor, checkGroup, isInList, adjust(list), milliseconds);
+ }
+
+ @Override
+ public boolean checkList(ITestAccessor accessor, CheckGroup checkGroup, boolean wantInList, Double[] list) {
+ return super.checkList(accessor, checkGroup, wantInList, adjust(list));
+ }
+
+ @Override
+ public Double checkMaintain(ITestAccessor accessor, CheckGroup checkGroup, Double value, int milliseconds) throws InterruptedException {
+ return super.checkMaintain(accessor, checkGroup, adjust(value), milliseconds);
+ }
+
+ @Override
+ public Double checkMaintainList(ITestAccessor accessor, CheckGroup checkGroup, Double[] list, boolean isInList, int milliseconds) throws InterruptedException {
+ return super.checkMaintainList(accessor, checkGroup, adjust(list), isInList, milliseconds);
+ }
+
+ @Override
+ public Double checkMaintainNot(ITestAccessor accessor, CheckGroup checkGroup, Double value, int milliseconds) throws InterruptedException {
+ return super.checkMaintainNot(accessor, checkGroup, adjust(value), milliseconds);
+ }
+
+ @Override
+ public Double checkMaintainNotRange(ITestAccessor accessor, CheckGroup checkGroup, Double minValue, boolean minInclusive, Double maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ return super.checkMaintainNotRange(accessor, checkGroup, minValue, minInclusive, maxValue, maxInclusive,
+ milliseconds);
+ }
+
+ @Override
+ public Double checkMaintainRange(ITestAccessor accessor, CheckGroup checkGroup, Double minValue, boolean minInclusive, Double maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ return super.checkMaintainRange(accessor, checkGroup, minValue, minInclusive, maxValue, maxInclusive,
+ milliseconds);
+ }
+
+ @Override
+ public boolean checkNot(ITestAccessor accessor, CheckGroup checkGroup, Double value, int milliseconds) throws InterruptedException {
+ return super.checkNot(accessor, checkGroup, adjust(value), milliseconds);
+ }
+
+ @Override
+ public boolean checkNot(ITestAccessor accessor, CheckGroup checkGroup, Double value) {
+ return super.checkNot(accessor, checkGroup, adjust(value));
+ }
+
+ @Override
+ public boolean checkNotRange(ITestAccessor accessor, CheckGroup checkGroup, Double minValue, boolean minInclusive, Double maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ return super.checkNotRange(accessor, checkGroup, minValue, minInclusive, maxValue, maxInclusive, milliseconds);
+ }
+
+ @Override
+ public boolean checkPulse(ITestAccessor accessor, CheckGroup checkGroup, Double pulsedValue, Double nonPulsedValue, int milliseconds) throws InterruptedException {
+ return super.checkPulse(accessor, checkGroup, adjust(pulsedValue), adjust(nonPulsedValue), milliseconds);
+ }
+
+ @Override
+ public boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, Double minValue, boolean minInclusive, Double maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ return super.checkRange(accessor, checkGroup, minValue, minInclusive, maxValue, maxInclusive, milliseconds);
+ }
+
+ @Override
+ public boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, Double minValue, boolean minInclusive, Double maxValue, boolean maxInclusive) {
+ return super.checkRange(accessor, checkGroup, minValue, minInclusive, maxValue, maxInclusive);
+ }
+
+ @Override
+ public Double waitForList(ITestAccessor accessor, Double[] list, boolean isInList, int milliseconds) throws InterruptedException {
+ return super.waitForList(accessor, adjust(list), isInList, milliseconds);
+ }
+
+ @Override
+ public Double waitForNotRange(ITestEnvironmentAccessor accessor, Double minValue, boolean minInclusive, Double maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ return super.waitForNotRange(accessor, minValue, minInclusive, maxValue, maxInclusive, milliseconds);
+ }
+
+ @Override
+ public Double waitForNotValue(ITestEnvironmentAccessor accessor, Double value, int milliseconds) throws InterruptedException {
+ return super.waitForNotValue(accessor, adjust(value), milliseconds);
+ }
+
+ @Override
+ public Double waitForRange(ITestEnvironmentAccessor accessor, Double minValue, boolean minInclusive, Double maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ return super.waitForRange(accessor, minValue, minInclusive, maxValue, maxInclusive, milliseconds);
+ }
+
+ @Override
+ public Double waitForValue(ITestEnvironmentAccessor accessor, Double value, int milliseconds) throws InterruptedException {
+ return super.waitForValue(accessor, adjust(value), milliseconds);
+ }
+
+ private Double adjust(Double value) {
+ return toDouble(toLong(value));
+ }
+
+ private Double[] adjust(Double[] list) {
+ Double[] newList = new Double[list.length];
+ for (int i = 0; i < list.length; i++) {
+ newList[i] = adjust(list[i]);
+ }
+ return newList;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/Float32Element.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/Float32Element.java
new file mode 100644
index 000000000..fccee40a4
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/Float32Element.java
@@ -0,0 +1,137 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.elements;
+
+import org.eclipse.osee.ote.core.MethodFormatter;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.nonmapping.NonMappingFloat32Element;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Float32Element extends RealElement {
+
+ public Float32Element(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+ this(message, elementName, messageData, byteOffset, msb, lsb, msb, lsb);
+ }
+
+ public Float32Element(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+ super(message, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
+ }
+
+ public Float32Element(Message message, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+ super(message, elementName, messageData, bitOffset, bitLength);
+ }
+
+ /**
+ * Checks that this element correctly forwards a message sent from cause with the value passed.
+ *
+ * @param cause The originator of the signal
+ * @param value The value sent by cause and being forwarded by this element
+ */
+ public void checkForwarding(ITestAccessor accessor, Float32Element cause, double value) throws InterruptedException {
+ /* check for 0 to begine */
+ check(accessor, 0d, 0);
+
+ /* Set the DP1 Mux Signal */
+ cause.set(accessor, (float) value);
+
+ /* Chk Value on DP2 */
+ check(accessor, value, 1000);
+
+ /* Set DP1 to 0 */
+ cause.set(accessor, 0);
+
+ /* Init DP2 Mux to 0 */
+ set(accessor, 0);
+
+ /* Chk Value on DP2 is still set */
+ check(accessor, value, 500);
+
+ /* Chk DP2 is 0 for two-pulse signals and high for four-oulse signal */
+ check(accessor, 0d, 500);
+
+ }
+
+ /**
+ * Sets the element to the "value" passed.
+ *
+ * @param value The value to set.
+ */
+ @Override
+ public void set(ITestEnvironmentAccessor accessor, double value) {
+ if (accessor != null) {
+ accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(), new MethodFormatter().add(value),
+ this.getMessage());
+ }
+ setValue(value);
+ if (accessor != null) {
+ accessor.getLogger().methodEnded(accessor);
+ }
+ }
+
+ /**
+ * Sets the element to the "value" passed and immediately sends the message that contains it..
+ *
+ * @param value The value to set.
+ */
+ @Override
+ public void setAndSend(ITestEnvironmentAccessor accessor, double value) {
+ this.set(accessor, value);
+ super.sendMessage();
+ }
+
+ @Override
+ public Double getValue() {
+ return new Double(Float.intBitsToFloat(getMsgData().getMem().getInt(byteOffset, msb, lsb)));
+
+ }
+
+ @Override
+ public Double valueOf(MemoryResource mem) {
+ return new Double(Float.intBitsToFloat(mem.getInt(byteOffset, msb, lsb)));
+ }
+
+ @Override
+ public void setValue(Double obj) {
+ setValue(obj.floatValue());
+ }
+
+ @Override
+ public void setValue(Float obj) {
+ getMsgData().getMem().setInt(Float.floatToIntBits(obj), byteOffset, msb, lsb);
+ }
+
+ @Override
+ protected double toDouble(long value) {
+ return Float.intBitsToFloat((int) value);
+ }
+
+ @Override
+ protected long toLong(double value) {
+ return Double.doubleToLongBits(value);
+ }
+
+ @Override
+ protected NonMappingFloat32Element getNonMappingElement() {
+ return new NonMappingFloat32Element(this);
+ }
+
+ @Override
+ public void setHex(long hex) {
+ getMsgData().getMem().setLong(hex, byteOffset, msb, lsb);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/Float64Element.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/Float64Element.java
new file mode 100644
index 000000000..83d2abde7
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/Float64Element.java
@@ -0,0 +1,159 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.elements;
+
+import org.eclipse.osee.ote.core.MethodFormatter;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.nonmapping.NonMappingFloat64Element;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Float64Element extends RealElement {
+
+ public Float64Element(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+ this(message, elementName, messageData, byteOffset, msb, lsb, msb, lsb);
+ }
+
+ public Float64Element(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+ super(message, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
+ }
+
+ public Float64Element(Message message, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+ super(message, elementName, messageData, bitOffset, bitLength);
+ }
+
+ /**
+ * Checks that this element correctly forwards a message sent from cause with the value passed.
+ *
+ * @param cause The originator of the signal
+ * @param value The value sent by cause and being forwarded by this element
+ */
+ public void checkForwarding(ITestAccessor accessor, Float64Element cause, double value) throws InterruptedException {
+ /* check for 0 to begine */
+ check(accessor, 0d, 0);
+
+ /* Set the DP1 Mux Signal */
+ cause.set(accessor, value);
+
+ /* Chk Value on DP2 */
+ check(accessor, value, 1000);
+
+ /* Set DP1 to 0 */
+ cause.set(accessor, 0);
+
+ /* Init DP2 Mux to 0 */
+ set(accessor, 0);
+
+ /* Chk Value on DP2 is still set */
+ check(accessor, value, 500);
+
+ /* Chk DP2 is 0 for two-pulse signals and high for four-oulse signal */
+ check(accessor, 0d, 500);
+
+ }
+
+ /**
+ * Sets the element to the "value" passed.
+ *
+ * @param value The value to set.
+ */
+ @Override
+ public void set(ITestEnvironmentAccessor accessor, double value) {
+ if (accessor != null) {
+ accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(), new MethodFormatter().add(value),
+ this.getMessage());
+ }
+ setValue(value);
+ if (accessor != null) {
+ accessor.getLogger().methodEnded(accessor);
+ }
+ }
+
+ /**
+ * Sets the element to the "value" passed and immediately sends the message that contains it..
+ *
+ * @param value The value to set.
+ */
+ @Override
+ public void setAndSend(ITestEnvironmentAccessor accessor, double value) {
+ this.set(accessor, value);
+ super.sendMessage();
+ }
+
+ public void setNoLog(ITestEnvironmentAccessor accessor, double value) {
+ setValue(value);
+ }
+
+ @Override
+ public Double getValue() {
+ return Double.longBitsToDouble(getMsgData().getMem().getLong(byteOffset, msb, lsb));
+ }
+
+ @Override
+ public Double valueOf(MemoryResource mem) {
+ return Double.longBitsToDouble(mem.getLong(byteOffset, msb, lsb));
+ }
+
+ @Override
+ public void setValue(Double obj) {
+ getMsgData().getMem().setLong(Double.doubleToLongBits(obj), byteOffset, msb, lsb);
+ }
+
+ /**
+ * Sets the element to the "value" passed.
+ *
+ * @param accessor - For logging.
+ * @param bits - The bits to set.
+ */
+ public void setRawBits(ITestEnvironmentAccessor accessor, long bits) {
+ if (accessor != null) {
+ accessor.getLogger().methodCalledOnObject(accessor, this.getFullName(), new MethodFormatter().add(bits),
+ this.getMessage());
+ }
+
+ getMsgData().getMem().setLong(bits, byteOffset, msb, lsb);
+ if (accessor != null) {
+ accessor.getLogger().methodEnded(accessor);
+ }
+ }
+
+ /**
+ * Sest the element without the logging.
+ */
+ public void setRawBits(long bits) {
+ getMsgData().getMem().setLong(bits, byteOffset, msb, lsb);
+ }
+
+ @Override
+ protected double toDouble(long value) {
+ return Double.longBitsToDouble(value);
+ }
+
+ @Override
+ protected long toLong(double value) {
+ return Double.doubleToLongBits(value);
+ }
+
+ @Override
+ protected Element getNonMappingElement() {
+ return new NonMappingFloat64Element(this);
+ }
+
+ @Override
+ public void setHex(long hex) {
+ getMsgData().getMem().setLong(hex, byteOffset, msb, lsb);
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/IElementVisitor.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/IElementVisitor.java
new file mode 100644
index 000000000..ba7a6097a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/IElementVisitor.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.elements;
+
+/**
+ * @author Andy Jury
+ */
+public interface IElementVisitor {
+
+ void asGenericElement(Element element);
+
+ void asBooleanElement(BooleanElement element);
+
+ void asIntegerElement(IntegerElement element);
+
+ void asRealElement(RealElement element);
+
+ void asCharElement(CharElement element);
+
+ void asEnumeratedElement(EnumeratedElement<?> element);
+
+ void asFixedPointElement(FixedPointElement element);
+
+ void asRecordElement(RecordElement element);
+
+ void asFloat32(Float32Element element);
+
+ void asFloat64(Float64Element element);
+
+ void asStringElement(StringElement element);
+
+ void asRecordMap(RecordMap<? extends RecordElement> element);
+
+ void asEmptyEnumElement(EmptyEnum_Element element);
+
+ void asLongIntegerElement(LongIntegerElement element);
+
+ void asSignedInteger16Element(SignedInteger16Element element);
+
+ void asArrayElement(ArrayElement element);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/IEnumValue.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/IEnumValue.java
new file mode 100644
index 000000000..13b058b04
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/IEnumValue.java
@@ -0,0 +1,17 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.elements;
+
+public interface IEnumValue<T> {
+ public int getIntValue();
+
+ T getEnum(int value);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/IRecordFactory.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/IRecordFactory.java
new file mode 100644
index 000000000..846fb9510
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/IRecordFactory.java
@@ -0,0 +1,18 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.elements;
+
+public interface IRecordFactory {
+
+ RecordElement create(int i);
+
+ int getBitLength();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/InaccessibleElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/InaccessibleElement.java
new file mode 100644
index 000000000..e9ccc8120
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/InaccessibleElement.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.elements;
+
+import java.util.Collection;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MessageData;
+
+public class InaccessibleElement extends Element {
+
+ // TODO - this is a temporary hack for (PLT/CPG)_UFD_CMD. When cdb adds
+ // individual elements, delete this class!!! Make sure to remove it from
+ // MuxSignalType too!! Also make sure to take code out of Message Generation
+ // too.
+ public InaccessibleElement(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+ this(message, elementName, messageData, byteOffset, msb, lsb, msb, lsb);
+ }
+
+ public InaccessibleElement(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+ super(message, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
+ }
+
+ @Override
+ public InaccessibleElement findElementInMessages(Collection<? extends Message> messages) {
+ return (InaccessibleElement) super.findElementInMessages(messages);
+ }
+
+ @Override
+ public InaccessibleElement switchMessages(Collection<? extends Message<?,?,?>> messages) {
+ return (InaccessibleElement) super.switchMessages(messages);
+ }
+
+ @Override
+ protected Element getNonMappingElement() {
+ return null;
+ }
+
+ public int compareTo(InaccessibleElement o) {
+ return 0;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/IntegerElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/IntegerElement.java
new file mode 100644
index 000000000..48ae746a1
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/IntegerElement.java
@@ -0,0 +1,233 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.elements;
+
+import java.util.Collection;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.HeaderData;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.nonmapping.NonMappingIntegerElement;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class IntegerElement extends NumericElement<Integer> {
+
+ @Override
+ public void visit(IElementVisitor visitor) {
+ visitor.asIntegerElement(this);
+ }
+
+ public IntegerElement(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+ this(message, elementName, messageData, byteOffset, msb, lsb, msb, lsb);
+ }
+
+ public IntegerElement(Message message, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+ super(message, elementName, messageData, bitOffset, bitLength);
+ }
+
+ public IntegerElement(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+ super(message, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
+ }
+
+ @Override
+ public IntegerElement findElementInMessages(Collection<? extends Message> messages) {
+ return (IntegerElement) super.findElementInMessages(messages);
+ }
+
+ @Override
+ public IntegerElement switchMessages(Collection<? extends Message<?,?,?>> messages) {
+ return (IntegerElement) super.switchMessages(messages);
+ }
+
+ @Override
+ public String toString(Integer obj) {
+ int value = elementMask(obj);
+ return value + "(0x" + Integer.toHexString(value).toUpperCase() + ")";
+ }
+
+ @Override
+ public void setValue(Integer value) {
+ getMsgData().getMem().setInt(value, byteOffset, msb, lsb);
+ }
+
+ @Override
+ public Integer getValue() {
+ return Integer.valueOf(getMsgData().getMem().getInt(byteOffset, msb, lsb));
+ }
+
+ @Override
+ public Integer valueOf(MemoryResource mem) {
+ return Integer.valueOf(mem.getInt(byteOffset, msb, lsb));
+ }
+
+ /**
+ * Checks that this element correctly forwards a message sent from cause with the value passed.
+ *
+ * @param cause The originator of the signal
+ * @param value The value sent by cause and being forwarded by this element
+ */
+ public void checkForwarding(ITestAccessor accessor, IntegerElement cause, int value) throws InterruptedException {
+ value = removeSign(value);
+ /* check for 0 to begine */
+ check(accessor, 0, 0);
+
+ /* Set the DP1 Mux Signal */
+ cause.set(accessor, value);
+
+ /* Chk Value on DP2 */
+ check(accessor, value, 1000);
+
+ /* Set DP1 to 0 */
+ cause.set(accessor, 0);
+
+ /* Init DP2 Mux to 0 */
+ set(accessor, 0);
+
+ /* Chk Value on DP2 is still set */
+ check(accessor, value, 500);
+
+ /* Chk DP2 is 0 for two-pulse signals and high for four-pulse signal */
+ check(accessor, 0, 500);
+
+ }
+
+ /**
+ * This function will verify that this signal is pulsed for 2 cycles.
+ *
+ * @param value The value to be checked
+ */
+ public void checkPulse(ITestAccessor accessor, Integer value) throws InterruptedException {
+
+ int nonPulsedValue = 0;
+ if (value == 0) {
+ nonPulsedValue = 1;
+ }
+
+ checkPulse(accessor, value, nonPulsedValue);
+
+ }
+
+ /**
+ * Sets the element to the "value" passed.
+ *
+ * @param value The value to set.
+ */
+ @Override
+ public void set(ITestEnvironmentAccessor accessor, Integer value) {
+ super.set(accessor, value);
+ }
+
+ /**
+ * Sets the element to the "value" passed and immediately sends the message that contains it..
+ *
+ * @param value The value to set.
+ */
+ public void setAndSend(ITestEnvironmentAccessor accessor, int value) {
+ this.set(accessor, value);
+ super.sendMessage();
+ }
+
+ /**
+ * Waits until the element has a value within the range specified. Assumes the range is inclusive.
+ *
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public int waitForRange(ITestEnvironmentAccessor accessor, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+ return this.waitForRange(accessor, minValue, true, maxValue, true, milliseconds);
+ }
+
+ /**
+ * Waits until the element has a value within the range specified. Either end of the range can be inclusive or not.
+ *
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+ * to the range value.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+ * to the range value.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public int waitForRange(ITestEnvironmentAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ return super.waitForRange(accessor, Integer.valueOf(minValue), minInclusive, Integer.valueOf(maxValue),
+ maxInclusive, milliseconds);
+ }
+
+ /**
+ * Waits until the element has a value within the range specified. Range is assumes to be inclusive.
+ *
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public int waitForNotRange(ITestEnvironmentAccessor accessor, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+ return this.waitForNotRange(accessor, minValue, true, maxValue, true, milliseconds);
+ }
+
+ /**
+ * Waits until the element has a value within the range specified. Either end of the range can be inclusive or not.
+ *
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+ * to the range value.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+ * to the range value.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public int waitForNotRange(ITestEnvironmentAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ return super.waitForNotRange(accessor, Integer.valueOf(minValue), minInclusive, Integer.valueOf(maxValue),
+ maxInclusive, milliseconds);
+ }
+
+ @Override
+ public void parseAndSet(ITestEnvironmentAccessor accessor, String value) throws IllegalArgumentException {
+ this.set(accessor, Integer.parseInt(value));
+ }
+
+ @Override
+ protected Element getNonMappingElement() {
+ return new NonMappingIntegerElement(this);
+ }
+
+ @Override
+ public Integer elementMask(Integer value) {
+ return removeSign(value);
+ }
+
+ public static void main(String[] args) {
+ final HeaderData hd = new HeaderData("test_data", new MemoryResource(new byte[64], 2, 64));
+ IntegerElement e1 = new IntegerElement(null, "e1", hd, 0, 0, 31);
+ IntegerElement e2 = new IntegerElement(null, "e2", hd, 4, 0, 31);
+ e1.setValue(-1);
+ e2.setValue(-1000);
+
+ System.out.printf(" e1 value = %d\n", e1.getValue());
+ System.out.printf(" e2 value = %d\n", e2.getValue());
+
+ }
+
+ @Override
+ public long getNumericBitValue() {
+ return getValue() & 0xFFFFFFFFL;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/LongIntegerElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/LongIntegerElement.java
new file mode 100644
index 000000000..f04d99cb2
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/LongIntegerElement.java
@@ -0,0 +1,183 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.elements;
+
+import java.util.Collection;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.testPoint.CheckGroup;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.nonmapping.NonMappingLongIntegerElement;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class LongIntegerElement extends NumericElement<Long> {
+
+ @Override
+ public void visit(IElementVisitor visitor) {
+ visitor.asLongIntegerElement(this);
+ }
+
+ public LongIntegerElement(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+ this(message, elementName, messageData, byteOffset, msb, lsb, msb, lsb);
+ }
+
+ public LongIntegerElement(Message message, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+ super(message, elementName, messageData, bitOffset, bitLength);
+ }
+
+ public LongIntegerElement(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+ super(message, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
+ }
+
+ @Override
+ public LongIntegerElement findElementInMessages(Collection<? extends Message> messages) {
+ return (LongIntegerElement) super.findElementInMessages(messages);
+ }
+
+ @Override
+ public LongIntegerElement switchMessages(Collection<? extends Message<?,?,?>> messages) {
+ return (LongIntegerElement) super.switchMessages(messages);
+ }
+
+ @Override
+ public String toString(Long obj) {
+ long value = elementMask(obj);
+ return value + "(0x" + Long.toHexString(value).toUpperCase() + ")";
+ }
+
+ @Override
+ public void setValue(Long value) {
+ getMsgData().getMem().setLong(value, byteOffset, msb, lsb);
+ }
+
+ @Override
+ public Long getValue() {
+ return Long.valueOf(getMsgData().getMem().getLong(byteOffset, msb, lsb));
+ }
+
+ @Override
+ public Long valueOf(MemoryResource mem) {
+ return Long.valueOf(mem.getLong(byteOffset, msb, lsb));
+ }
+
+ /**
+ * Checks that this element correctly forwards a message sent from cause with the value passed.
+ *
+ * @param cause The originator of the signal
+ * @param value The value sent by cause and being forwarded by this element
+ */
+ public void checkForwarding(ITestAccessor accessor, LongIntegerElement cause, long value) throws InterruptedException {
+ value = removeSign(value);
+ /* check for 0 to begine */
+ check(accessor, 0, 0);
+
+ /* Set the DP1 Mux Signal */
+ cause.set(accessor, value);
+
+ /* Chk Value on DP2 */
+ check(accessor, value, 1000);
+
+ /* Set DP1 to 0 */
+ cause.set(accessor, 0);
+
+ /* Init DP2 Mux to 0 */
+ set(accessor, 0);
+
+ /* Chk Value on DP2 is still set */
+ check(accessor, value, 500);
+
+ /* Chk DP2 is 0 for two-pulse signals and high for four-pulse signal */
+ check(accessor, 0, 500);
+
+ }
+
+ /**
+ * Verifies that the element is set to "value" within the number of "milliseconds" passed.
+ *
+ * @param value Expected value.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ */
+ public boolean check(ITestAccessor accessor, long value, int milliseconds) throws InterruptedException {
+ return super.check(accessor, (CheckGroup) null, removeSign(value), milliseconds);
+ }
+
+ /**
+ * This function will verify that this signal is pulsed for 2 cycles.
+ *
+ * @param value The value to be checked
+ */
+ public void checkPulse(ITestAccessor accessor, long value) throws InterruptedException {
+ long nonPulsedValue = 0;
+ if (value == 0) {
+ nonPulsedValue = 1;
+ }
+
+ checkPulse(accessor, value, nonPulsedValue);
+
+ }
+
+ /**
+ * Sets the element to the "value" passed.
+ *
+ * @param value The value to set.
+ */
+ public void set(ITestEnvironmentAccessor accessor, long value) {
+ super.set(accessor, value);
+ }
+
+ /**
+ * Sets the element to the "value" passed.
+ *
+ * @param value The value to set.
+ */
+ @Deprecated
+ public void set(long value) {
+ setValue(value);
+ }
+
+ /**
+ * Sets the element to the "value" passed and immediately sends the message that contains it..
+ *
+ * @param value The value to set.
+ */
+ public void setAndSend(ITestEnvironmentAccessor accessor, long value) {
+ this.set(accessor, value);
+ super.sendMessage();
+ }
+
+ @Override
+ public void parseAndSet(ITestEnvironmentAccessor accessor, String value) throws IllegalArgumentException {
+ this.set(accessor, Long.parseLong(value));
+ }
+
+ @Override
+ protected NonMappingLongIntegerElement getNonMappingElement() {
+ return new NonMappingLongIntegerElement(this);
+ }
+
+ @Override
+ public Long elementMask(Long value) {
+ return removeSign(value);
+ }
+
+ @Override
+ public long getNumericBitValue() {
+ return getValue();
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/MsgWaitResult.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/MsgWaitResult.java
new file mode 100644
index 000000000..57ca29287
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/MsgWaitResult.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.elements;
+
+public class MsgWaitResult {
+ private final long time;
+ private final int xmitCount;
+ private final boolean passed;
+
+ public MsgWaitResult(long time, int xmitCount, boolean passed) {
+ this.time = time;
+ this.xmitCount = xmitCount;
+ this.passed = passed;
+ }
+
+ public long getElapsedTime() {
+ return time;
+ }
+
+ public int getXmitCount() {
+ return xmitCount;
+ }
+
+ public boolean isPassed() {
+ return passed;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/NonFilteredStringElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/NonFilteredStringElement.java
new file mode 100644
index 000000000..c155e2e65
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/NonFilteredStringElement.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.elements;
+
+
+public class NonFilteredStringElement extends StringElement{
+
+ public NonFilteredStringElement(StringElement element) {
+ super(element.getMessage(), element.getName(), element.getMsgData(), element.getByteOffset(), element.getMsb(), element.getLsb());
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.osee.ote.message.elements.StringElement#getValue()
+ */
+ @Override
+ public String getValue() {
+ return getMsgData().getMem().getUnfilteredASCIIString(byteOffset, msb, lsb);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/NumericElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/NumericElement.java
new file mode 100644
index 000000000..3e3cdb669
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/NumericElement.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.elements;
+
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MessageData;
+
+public abstract class NumericElement<T extends Number & Comparable<T>> extends DiscreteElement<T> {
+
+ public NumericElement(Message msg, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalMsb, int originalLsb) {
+ super(msg, elementName, messageData, byteOffset, msb, lsb, originalMsb, originalLsb);
+ }
+
+ public NumericElement(Message msg, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+ super(msg, elementName, messageData, byteOffset, msb, lsb);
+ }
+
+ public NumericElement(Message msg, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+ super(msg, elementName, messageData, bitOffset, bitLength);
+ }
+
+ public abstract long getNumericBitValue();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/RealElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/RealElement.java
new file mode 100644
index 000000000..feb99974c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/RealElement.java
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.elements;
+
+import java.util.Collection;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.data.MessageData;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public abstract class RealElement extends NumericElement<Double> {
+
+ @Override
+ public void visit(IElementVisitor visitor) {
+ visitor.asRealElement(this);
+ }
+
+ public RealElement(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+ this(message, elementName, messageData, byteOffset, msb, lsb, msb, lsb);
+ }
+
+ public RealElement(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+ super(message, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
+ }
+
+ public RealElement(Message message, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+ super(message, elementName, messageData, bitOffset, bitLength);
+ }
+
+ @Override
+ public RealElement findElementInMessages(Collection<? extends Message> messages) {
+ return (RealElement) super.findElementInMessages(messages);
+ }
+
+ @Override
+ public RealElement switchMessages(Collection<? extends Message<?,?,?>> messages) {
+ return (RealElement) super.switchMessages(messages);
+ }
+
+ public void setValue(Float value) {
+ setValue(value.doubleValue());
+ }
+
+ @Override
+ public String valueOf() {
+ return getValue().toString();
+ }
+
+ public long getRaw() {
+ return getRaw(getMsgData().getMem());
+ }
+
+ public long getRaw(MemoryResource mem) {
+ return mem.getLong(byteOffset, msb, lsb);
+ }
+
+ public abstract void set(ITestEnvironmentAccessor accessor, double value);
+
+ public abstract void setAndSend(ITestEnvironmentAccessor accessor, double value);
+
+ /**
+ * sets the bit pattern for this element. All hex values must be in the form of: <br>
+ * <p>
+ * <code><b>0x[<I>hex characters</I>]L</b></code><br>
+ * <p>
+ * The trailing 'L' signals java to treat the value as a long integer.
+ *
+ * @param hex a bit patter to set the element to. The pattern is not limited to hexadecimal
+ */
+ public abstract void setHex(long hex);
+
+ protected abstract double toDouble(long value);
+
+ protected abstract long toLong(double value);
+
+ @Override
+ public void parseAndSet(ITestEnvironmentAccessor accessor, String value) throws IllegalArgumentException {
+ this.set(accessor, Double.parseDouble(value));
+ }
+
+ @Override
+ public String toString(Double obj) {
+ return obj.toString();
+ }
+
+ @Override
+ public Double elementMask(Double value) {
+ return value;
+ }
+
+ @Override
+ public long getNumericBitValue() {
+ return getRaw();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/RecordElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/RecordElement.java
new file mode 100644
index 000000000..e98dab4e8
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/RecordElement.java
@@ -0,0 +1,159 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.elements;
+
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.nonmapping.NonMappingRecordElement;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public abstract class RecordElement extends Element {
+
+ private final Map<String, Element> elementMap;
+ private final int recordBitSize;
+
+ private int bitOffset;
+ private final int index;
+ private boolean isPartOfMap = true;
+ private final int firstRecordBitOffset;
+ public int BIT_OFFSET;
+
+ /**
+ * @param message -
+ * @param elementName -
+ */
+ public RecordElement(Message message, String elementName, int index, MessageData messageData, int firstRecordBitOffset, int recordBitSize) {
+ super(message, elementName, messageData, firstRecordBitOffset + index * recordBitSize, recordBitSize);
+ elementMap = new LinkedHashMap<>();
+ BIT_OFFSET = this.bitOffset = firstRecordBitOffset + index * recordBitSize;
+ this.recordBitSize = recordBitSize;
+ this.firstRecordBitOffset = firstRecordBitOffset;
+ this.index = index;
+ }
+
+ public RecordElement(Message message, String elementName, MessageData messageData, int firstRecordBitOffset, int recordBitSize) {
+ this(message, elementName, 0, messageData, firstRecordBitOffset, recordBitSize);
+ isPartOfMap = false;
+ }
+
+ public void addElements(Element... elements) {
+ for (Element element : elements) {
+ elementMap.put(element.elementName, element);
+ }
+ }
+
+ @Override
+ public void addPath(Object... objs) {
+ for (Object obj : objs) {
+ getElementPath().add(obj);
+ }
+ if (isPartOfMap) {
+ getElementPath().add(index);
+ } else {
+ getElementPath().add(getElementName());
+ }
+ Object[] myPath = getElementPath().toArray();
+ for (Element el : elementMap.values()) {
+ el.addPath(myPath);
+ }
+ }
+
+ public RecordElement(RecordElement message, String elementName, int offset, MessageData messageData, int firstRecordByteOffset, int recordByteSize) {
+ this(message.getMessage(), elementName, offset, messageData, firstRecordByteOffset, recordByteSize);
+ isPartOfMap = false;
+ }
+
+ public Map<String, Element> getElementMap() {
+ return this.elementMap;
+ }
+
+ @Override
+ protected NonMappingRecordElement getNonMappingElement() {
+ return new NonMappingRecordElement(this);
+ }
+
+ @Override
+ public RecordElement findElementInMessages(Collection<? extends Message> messages) {
+ return (RecordElement) super.findElementInMessages(messages);
+ }
+
+ public RecordElement switchMessagesNew(Collection<? extends Message<?,?,?>> messages) {
+ return (RecordElement) super.switchMessages(messages);
+ }
+
+ public void put(int index, RecordElement newRecord) {
+ // records.put(index, (T)newRecord);
+ }
+
+ public int length() {
+ return -1;
+ }
+
+ public RecordElement get(int index) {
+ // T val = records.get(index);
+ // if(val == null){
+ // val = (T)factory.create(index);
+ // records.put(index, val);
+ // }
+ return null;
+ }
+
+ /**
+ * @return the firstRecordBitOffset
+ */
+ public int getFirstRecordBitOffset() {
+ return firstRecordBitOffset;
+ }
+
+ /**
+ * @return the bitOffset
+ */
+ public int getBitOffset() {
+ return bitOffset;
+ }
+
+ /**
+ * @return the recordBitSize
+ */
+ public int getRecordBitSize() {
+ return recordBitSize;
+ }
+
+ @Override
+ public void visit(IElementVisitor visitor) {
+ visitor.asRecordElement(this);
+ }
+
+ @Override
+ public void zeroize() {
+ for (Element el : elementMap.values()) {
+ el.zeroize();
+ }
+ }
+
+ @Override
+ public String getDescriptiveName() {
+ if (isPartOfMap) {
+ return String.format("%s[%d]", getName(), index);
+ }
+ return getName();
+ }
+
+ public int getIndex() {
+ return index;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/RecordMap.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/RecordMap.java
new file mode 100644
index 000000000..db59bd765
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/RecordMap.java
@@ -0,0 +1,137 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.elements;
+
+import java.util.Collection;
+import java.util.HashMap;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MessageData;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class RecordMap<T extends RecordElement> extends RecordElement {
+
+ private final int NUMBER_OF_RECORDS;
+
+ private final HashMap<Integer, T> records;
+ private IRecordFactory factory;
+
+ public RecordMap(Message message, MessageData messageData, String elementName, int numberOfRecords, IRecordFactory factory) {
+ super(message, elementName, 1, messageData, 0, factory.getBitLength());
+ NUMBER_OF_RECORDS = numberOfRecords;
+ records = new HashMap<>(numberOfRecords);
+ this.factory = factory;
+ }
+
+ public RecordMap(Message message, MessageData messageData, int firstRecordByteOffset, int recordByteSize, int numberOfRecords) {
+ super(message, "", 1, messageData, 0, 0);
+ NUMBER_OF_RECORDS = numberOfRecords;
+ records = new HashMap<>(numberOfRecords);
+ }
+
+ @Override
+ public T get(int index) {
+ if (index >= NUMBER_OF_RECORDS) {
+ throw new IllegalArgumentException(
+ "index(zero-based):" + index + " is greater than NUMBER_OF_RECORDS:" + NUMBER_OF_RECORDS);
+ }
+
+ T val = records.get(index);
+ if (val == null) {
+ val = (T) factory.create(index);
+ for (Object obj : getElementPath()) {
+ val.getElementPath().add(obj);
+ }
+ records.put(index, val);
+ }
+ return val;
+ }
+
+ @Override
+ public void addPath(Object... objs) {
+ for (Object obj : objs) {
+ getElementPath().add(obj);
+ }
+ getElementPath().add(this.getName());
+ }
+
+ @Override
+ public void put(int index, RecordElement newRecord) {
+ records.put(index, (T) newRecord);
+ }
+
+ @Override
+ public int length() {
+ return this.NUMBER_OF_RECORDS;
+ }
+
+ public MessageData getMessageData() {
+ return messageData;
+ }
+
+ public RecordMap<T> switchRecordMapMessages(Collection<? extends Message<?,?,?>> messages) {
+ for (RecordElement element : this.records.values()) {
+ element.switchMessages(messages);
+ }
+
+ return this;
+ }
+
+ // public <U extends Message<? extends ITestEnvironmentMessageSystemAccessor, ? extends MessageData, U>> RecordMap<T> switchMessages(Collection<U> messages) {
+ // for (RecordElement element : this.records.values()) {
+ // element.switchMessages(messages);
+ // }
+ //
+ // return this;
+ // }
+
+
+ @Override
+ public RecordMap<T> findElementInMessages(Collection<? extends Message> messages) {
+ for (RecordElement element : this.records.values()) {
+ element.findElementInMessages(messages);
+ }
+ return this;
+ }
+
+ @Override
+ public RecordMap<T> switchMessages(Collection<? extends Message<?,?,?>> messages) {
+ for (RecordElement element : this.records.values()) {
+ element.switchMessages(messages);
+ }
+ return this;
+ }
+
+ @Override
+ public void visit(IElementVisitor visitor) {
+ visitor.asRecordMap(this);
+ }
+
+ public int compareTo(RecordElement o) {
+ return 0;
+ }
+
+ @Override
+ public void zeroize() {
+ super.zeroize();
+ for (int i = 0; i < length(); i++) {
+ get(i).zeroize();
+ }
+ }
+
+ @Override
+ public String getDescriptiveName() {
+ return String.format("%s[0...%d]", getName(), length() - 1);
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/SignedInteger16Element.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/SignedInteger16Element.java
new file mode 100644
index 000000000..d4f642a42
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/SignedInteger16Element.java
@@ -0,0 +1,205 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.elements;
+
+import java.util.Collection;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.nonmapping.NonMappingSignedInteger16Element;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class SignedInteger16Element extends NumericElement<Integer> {
+
+ @Override
+ public void visit(IElementVisitor visitor) {
+ visitor.asSignedInteger16Element(this);
+ }
+
+ public SignedInteger16Element(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+ this(message, elementName, messageData, byteOffset, msb, lsb, msb, lsb);
+ }
+
+ public SignedInteger16Element(Message message, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+ super(message, elementName, messageData, bitOffset, bitLength);
+ }
+
+ public SignedInteger16Element(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+ super(message, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
+ }
+
+ @Override
+ public SignedInteger16Element findElementInMessages(Collection<? extends Message> messages) {
+ return (SignedInteger16Element) super.findElementInMessages(messages);
+ }
+
+ @Override
+ public SignedInteger16Element switchMessages(Collection<? extends Message<?,?,?>> messages) {
+ return (SignedInteger16Element) super.switchMessages(messages);
+ }
+
+ @Override
+ public String toString(Integer obj) {
+ return obj + "(0x" + Integer.toHexString(obj).toUpperCase() + ")";
+ }
+
+ @Override
+ public void setValue(Integer value) {
+ getMsgData().getMem().setInt(value, byteOffset, msb, lsb);
+ }
+
+ @Override
+ public Integer getValue() {
+ return Integer.valueOf(getMsgData().getMem().getSignedInt16(byteOffset, msb, lsb));
+ }
+
+ @Override
+ public Integer valueOf(MemoryResource mem) {
+ return Integer.valueOf(mem.getSignedInt16(byteOffset, msb, lsb));
+ }
+
+ /**
+ * Checks that this element correctly forwards a message sent from cause with the value passed.
+ *
+ * @param cause The originator of the signal
+ * @param value The value sent by cause and being forwarded by this element
+ */
+ public void checkForwarding(ITestAccessor accessor, SignedInteger16Element cause, int value) throws InterruptedException {
+ /* check for 0 to begine */
+ check(accessor, 0, 0);
+
+ /* Set the DP1 Mux Signal */
+ cause.set(accessor, value);
+
+ /* Chk Value on DP2 */
+ check(accessor, value, 1000);
+
+ /* Set DP1 to 0 */
+ cause.set(accessor, 0);
+
+ /* Init DP2 Mux to 0 */
+ set(accessor, 0);
+
+ /* Chk Value on DP2 is still set */
+ check(accessor, value, 500);
+
+ /* Chk DP2 is 0 for two-pulse signals and high for four-pulse signal */
+ check(accessor, 0, 500);
+
+ }
+
+ /**
+ * This function will verify that this signal is pulsed for 2 cycles.
+ *
+ * @param value The value to be checked
+ */
+ public void checkPulse(ITestAccessor accessor, int value) throws InterruptedException {
+
+ int nonPulsedValue = 0;
+ if (value == 0) {
+ nonPulsedValue = 1;
+ }
+
+ checkPulse(accessor, value, nonPulsedValue);
+
+ }
+
+ /**
+ * Sets the element to the "value" passed.
+ *
+ * @param value The value to set.
+ */
+ public void set(ITestEnvironmentAccessor accessor, int value) {
+ super.set(accessor, value);
+ }
+
+ /**
+ * Sets the element to the "value" passed and immediately sends the message that contains it..
+ *
+ * @param value The value to set.
+ */
+ public void setAndSend(ITestEnvironmentAccessor accessor, int value) {
+ this.set(accessor, value);
+ super.sendMessage();
+ }
+
+ /**
+ * Waits until the element has a value within the range specified. Either end of the range can be inclusive or not.
+ *
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+ * to the range value.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+ * to the range value.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public int waitForRange(ITestEnvironmentAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ return super.waitForRange(accessor, Integer.valueOf(minValue), minInclusive, Integer.valueOf(maxValue),
+ maxInclusive, milliseconds);
+ }
+
+ /**
+ * Waits until the element has a value within the range specified. Range is assumes to be inclusive.
+ *
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public int waitForNotRange(ITestEnvironmentAccessor accessor, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+ return this.waitForNotRange(accessor, minValue, true, maxValue, true, milliseconds);
+ }
+
+ /**
+ * Waits until the element has a value within the range specified. Either end of the range can be inclusive or not.
+ *
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+ * to the range value.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+ * to the range value.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public int waitForNotRange(ITestEnvironmentAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ return super.waitForNotRange(accessor, Integer.valueOf(minValue), minInclusive, Integer.valueOf(maxValue),
+ maxInclusive, milliseconds);
+ }
+
+ @Override
+ public void parseAndSet(ITestEnvironmentAccessor accessor, String value) throws IllegalArgumentException {
+ this.set(accessor, Integer.parseInt(value));
+ }
+
+ @Override
+ protected Element getNonMappingElement() {
+ return new NonMappingSignedInteger16Element(this);
+ }
+
+ @Override
+ public Integer elementMask(Integer value) {
+ return value;
+ }
+
+ @Override
+ public long getNumericBitValue() {
+ return getValue() & 0xFFFFFFFFL;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/StringElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/StringElement.java
new file mode 100644
index 000000000..a394adbbc
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/StringElement.java
@@ -0,0 +1,216 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.elements;
+
+import java.util.Collection;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.MethodFormatter;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.testPoint.CheckPoint;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.condition.EmptyStringCondition;
+import org.eclipse.osee.ote.message.condition.StringTrimCondition;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.nonmapping.NonMappingStringElement;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class StringElement extends DiscreteElement<String> {
+
+ @Override
+ public void visit(IElementVisitor visitor) {
+ visitor.asStringElement(this);
+ }
+
+ public StringElement(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+ this(message, elementName, messageData, byteOffset, msb, lsb, msb, lsb);
+ }
+
+ public StringElement(Message message, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+ super(message, elementName, messageData, bitOffset, bitLength);
+ }
+
+ public StringElement(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+ super(message, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
+ }
+
+ @Override
+ public StringElement findElementInMessages(Collection<? extends Message> messages) {
+ return (StringElement) super.findElementInMessages(messages);
+ }
+
+ @Override
+ public StringElement switchMessages(Collection<? extends Message<?,?,?>> messages) {
+ return (StringElement) super.switchMessages(messages);
+ }
+
+ @Override
+ public String toString(String obj) {
+ return obj;
+ }
+
+ @Override
+ public void setValue(String value) {
+ getMsgData().getMem().setASCIIString(value, byteOffset, msb, lsb);
+ }
+
+ @Override
+ public void parseAndSet(ITestEnvironmentAccessor accessor, String value) throws IllegalArgumentException {
+ set(accessor, value);
+ }
+
+ @Override
+ public String getValue() {
+ return getMsgData().getMem().getASCIIString(byteOffset, msb, lsb);
+ }
+
+ /**
+ * copies this elements chars into the given array. The array must be big enough to contain this elements data or an
+ * ArrayIndexOutOfBoundsException will be thrown. Does not exclude or stop on null (\0) characters in the element
+ * data.
+ *
+ * @param destination the destination array that will receive the char data
+ * @return the actual number of characters copied. The destination array will contain undefined data starting at this
+ * index until the end of the char array.
+ * @throws ArrayIndexOutOfBoundsException if the destination array is too small
+ */
+ public int getChars(char[] destination) throws ArrayIndexOutOfBoundsException {
+ return getMsgData().getMem().getASCIIChars(byteOffset, msb, lsb, destination);
+ }
+
+ public void setChars(final char[] data) {
+ final int sizeInBytes = (lsb - msb + 1) / 8;
+ if (data.length > sizeInBytes) {
+ OseeLog.log(getClass(), Level.WARNING,
+ "char[] passed to setChars() is bigger than the element, setting with subset of passed data");
+ } else if (data.length < sizeInBytes) {
+ OseeLog.log(getClass(), Level.WARNING,
+ "char[] passed to setChars() is smaller than element, setting subset of element");
+ }
+ MemoryResource memory = getMsgData().getMem();
+ final int bytesToSet = Math.min(data.length, sizeInBytes);
+ for (int i = 0; i < bytesToSet; i++) {
+ memory.setByte(data[i], byteOffset + i, 0, 7);
+ }
+ }
+
+ public boolean equals(String other) {
+ return getMsgData().getMem().asciiEquals(byteOffset, msb, lsb, other);
+ }
+
+ @Override
+ public String valueOf(MemoryResource mem) {
+ return mem.getASCIIString(byteOffset, msb, lsb);
+ }
+
+ /**
+ * Verifies that the element is set to "value" within the number of "milliseconds" passed.
+ *
+ * @param value Expected value.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ */
+ public boolean checkTrimWhiteSpace(ITestAccessor accessor, String value, int milliseconds) throws InterruptedException {
+ if (accessor == null) {
+ throw new NullPointerException("The parameter accessor is null");
+ }
+
+ accessor.getLogger().methodCalledOnObject(accessor, getFullName(),
+ new MethodFormatter().add(value).add(milliseconds), getMessage());
+ final StringTrimCondition c = new StringTrimCondition(this, value);
+
+ MsgWaitResult result = getMessage().waitForCondition(accessor, c, false, milliseconds);
+ CheckPoint passFail =
+ new CheckPoint(getFullName(), toString(value), toString(c.getLastCheckValue()), result.isPassed(),
+ result.getElapsedTime());
+
+ accessor.getLogger().testpoint(accessor, accessor.getTestScript(), accessor.getTestCase(), passFail);
+
+ accessor.getLogger().methodEnded(accessor);
+ return passFail.isPass();
+ }
+
+ /**
+ * Sets the element to the "value" passed and immediately sends the message that contains it..
+ *
+ * @param value The value to set.
+ */
+ public void setAndSend(ITestEnvironmentAccessor accessor, String value) {
+ parseAndSet(accessor, value);
+ super.sendMessage();
+ }
+
+ @Override
+ protected NonMappingStringElement getNonMappingElement() {
+ return new NonMappingStringElement(this);
+ }
+
+ @Override
+ public void zeroize() {
+ int sizeInBytes = (lsb - msb + 1) / 8;
+ getMsgData().getMem().zeroizeFromOffset(byteOffset, sizeInBytes);
+ }
+
+ public boolean isEmpty() {
+ return new EmptyStringCondition(this).check();
+ }
+
+ public boolean checkEmpty(ITestAccessor accessor, int milliseconds) throws InterruptedException {
+ if (accessor == null) {
+ throw new NullPointerException("The parameter accessor is null");
+ }
+
+ accessor.getLogger().methodCalledOnObject(accessor, getFullName(), new MethodFormatter().add(milliseconds),
+ getMessage());
+ final EmptyStringCondition c = new EmptyStringCondition(this);
+
+ MsgWaitResult result = getMessage().waitForCondition(accessor, c, false, milliseconds);
+ CheckPoint passFail =
+ new CheckPoint(getFullName(), "Empty", result.isPassed() ? "Empty" : "Not Empty", result.isPassed(),
+ result.getElapsedTime());
+
+ accessor.getLogger().testpoint(accessor, accessor.getTestScript(), accessor.getTestCase(), passFail);
+
+ accessor.getLogger().methodEnded(accessor);
+ return passFail.isPass();
+ }
+
+ public boolean checkMaintainEmpty(ITestAccessor accessor, int milliseconds) throws InterruptedException {
+ if (accessor == null) {
+ throw new NullPointerException("The parameter accessor is null");
+ }
+
+ accessor.getLogger().methodCalledOnObject(accessor, getFullName(), new MethodFormatter().add(milliseconds),
+ getMessage());
+ final EmptyStringCondition c = new EmptyStringCondition(this);
+
+ MsgWaitResult result = getMessage().waitForCondition(accessor, c, true, milliseconds);
+ CheckPoint passFail =
+ new CheckPoint(getFullName(), "Empty", result.isPassed() ? "Empty" : "Not Empty", result.isPassed(),
+ result.getElapsedTime());
+
+ accessor.getLogger().testpoint(accessor, accessor.getTestScript(), accessor.getTestCase(), passFail);
+
+ accessor.getLogger().methodEnded(accessor);
+ return passFail.isPass();
+ }
+
+ @Override
+ public String elementMask(String value) {
+ return value;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingCharElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingCharElement.java
new file mode 100644
index 000000000..78f0895fa
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingCharElement.java
@@ -0,0 +1,910 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.elements.nonmapping;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.testPoint.CheckGroup;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.CharElement;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+
+/**
+ * @author Andy Jury
+ */
+public class NonMappingCharElement extends CharElement {
+
+ public NonMappingCharElement(CharElement element) {
+ super(element.getMessage(), element.getElementName(), element.getMsgData(), element.getByteOffset(),
+ element.getMsb(), element.getLsb());
+ for (Object obj : element.getElementPath()) {
+ this.getElementPath().add(obj);
+ }
+ }
+
+ public NonMappingCharElement(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+ super(message, elementName, messageData, byteOffset, msb, lsb);
+ }
+
+ public NonMappingCharElement(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+ super(message, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
+ }
+
+ public NonMappingCharElement(Message message, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+ super(message, elementName, messageData, bitOffset, bitLength);
+ }
+
+ /**
+ * Checks that this element correctly forwards a message sent from cause with the value passed.
+ *
+ * @param cause The originator of the signal
+ * @param value The value sent by cause and being forwarded by this element
+ */
+ public void checkForwarding(ITestAccessor accessor, CharElement cause, char value) throws InterruptedException {
+
+ throwNoMappingElementException();
+ }
+
+ /**
+ * Verifies that the element is set to "value".
+ *
+ * @param value Expected value
+ * @return if the check passed
+ */
+ public boolean check(ITestAccessor accessor, char value) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to "value".
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param value Expected value
+ * @return if the check passed
+ */
+ public boolean check(ITestAccessor accessor, CheckGroup checkGroup, char value) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified. Assumes that both ends of the range are
+ * inclusive.
+ *
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @return if the check passed
+ */
+ public boolean checkRange(ITestAccessor accessor, char minValue, char maxValue) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified. Assumes that both ends of the range are
+ * inclusive.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @return if the check passed
+ */
+ public boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, char minValue, char maxValue) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified. Either end of the range can be set to be
+ * inclusive or not.
+ *
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive.
+ * @return if the check passed
+ */
+ public boolean checkRange(ITestAccessor accessor, char minValue, boolean minInclusive, char maxValue, boolean maxInclusive) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified. Either end of the range can be set to be
+ * inclusive or not.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive.
+ * @return if the check passed
+ */
+ public boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, char minValue, boolean minInclusive, char maxValue, boolean maxInclusive) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is NOT set to "value".
+ *
+ * @param value value to test against
+ * @return if the check passed
+ */
+ public boolean checkNot(ITestAccessor accessor, char value) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is NOT set to "value".
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param value value to test against
+ * @return if the check passed
+ */
+ public boolean checkNot(ITestAccessor accessor, CheckGroup checkGroup, char value) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value outside the range specified. Assumes that both ends of the range are
+ * inclusive. Therefore observed value may not equal either of the range values.
+ *
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @return if the check passed
+ */
+ public boolean checkNotRange(ITestAccessor accessor, char minValue, char maxValue) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value outside the range specified. Assumes that both ends of the range are
+ * inclusive. Therefore observed value may not equal either of the range values.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @return if the check passed
+ */
+ public boolean checkNotRange(ITestAccessor accessor, CheckGroup checkGroup, char minValue, char maxValue) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value outside the range specified. Either end of the range can be set to be
+ * inclusive or not.
+ *
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+ * to the range value.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+ * to the range value.
+ * @return if the check passed
+ */
+ public boolean checkNotRange(ITestAccessor accessor, char minValue, boolean minInclusive, char maxValue, boolean maxInclusive) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value outside the range specified. Either end of the range can be set to be
+ * inclusive or not.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+ * to the range value.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+ * to the range value.
+ * @return if the check passed
+ */
+ public boolean checkNotRange(ITestAccessor accessor, CheckGroup checkGroup, char minValue, boolean minInclusive, char maxValue, boolean maxInclusive) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to "value" within the number of "milliseconds" passed.
+ *
+ * @param value Expected value.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ */
+ public boolean check(ITestAccessor accessor, char value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to "value" within the number of "milliseconds" passed.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param value Expected value.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ */
+ public boolean check(ITestAccessor accessor, CheckGroup checkGroup, char value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified. Assumes that both ends of the range are
+ * inclusive.
+ *
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait for the element to be within the range.
+ * @return if the check passed
+ */
+ public boolean checkRange(ITestAccessor accessor, char minValue, char maxValue, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified. Assumes that both ends of the range are
+ * inclusive.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait for the element to be within the range.
+ * @return if the check passed
+ */
+ public boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, char minValue, char maxValue, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified. Either end of the range can be set to be
+ * inclusive or not.
+ *
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minimum value of the range is inclusive.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive.
+ * @param milliseconds Number of milliseconds to wait for the element to be within the range.
+ * @return if the check passed
+ */
+ public boolean checkRange(ITestAccessor accessor, char minValue, boolean minInclusive, char maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified. Either end of the range can be set to be
+ * inclusive or not.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive.
+ * @param milliseconds Number of milliseconds to wait for the element to be within the range.
+ * @return if the check passed
+ */
+ public boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, char minValue, boolean minInclusive, char maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to some value other than "value" within the number of "milliseconds" passed.
+ * Passes if at any point with in the time allowed, the elment is set to a value other than "value".
+ *
+ * @param value value to test against.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ */
+ public boolean checkNot(ITestAccessor accessor, char value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to some value other than "value" within the number of "milliseconds" passed.
+ * Passes if at any point with in the time allowed, the elment is set to a value other than "value".
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param value value to test against.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ */
+ public boolean checkNot(ITestAccessor accessor, CheckGroup checkGroup, char value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value outside the range specified. Assumes that both ends of the range are
+ * inclusive.
+ *
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait for the element to be outside the range.
+ * @return if the check passed
+ */
+ public boolean checkNotRange(ITestAccessor accessor, char minValue, char maxValue, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value outside the range specified. Assumes that both ends of the range are
+ * inclusive.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait for the element to be outside the range.
+ * @return if the check passed
+ */
+ public boolean checkNotRange(ITestAccessor accessor, CheckGroup checkGroup, char minValue, char maxValue, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value outside the range specified. Either end of the range can be set to be
+ * inclusive or not.
+ *
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+ * to the range value.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+ * to the range value.
+ * @param milliseconds Number of milliseconds to wait for the element to be outside the range.
+ * @return if the check passed
+ */
+ public boolean checkNotRange(ITestAccessor accessor, char minValue, boolean minInclusive, char maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value outside the range specified. Either end of the range can be set to be
+ * inclusive or not.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+ * to the range value.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+ * to the range value.
+ * @param milliseconds Number of milliseconds to wait for the element to be outside the range.
+ * @return if the check passed
+ */
+ public boolean checkNotRange(ITestAccessor accessor, CheckGroup checkGroup, char minValue, boolean minInclusive, char maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is Not set to "value" within the number of "milliseconds" passed.
+ *
+ * @param value Expected value.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ */
+ @Override
+ public boolean checkNot(ITestAccessor accessor, String value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is Not set to "value" within the number of "milliseconds" passed.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param value Expected value.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ */
+ @Override
+ public boolean checkNot(ITestAccessor accessor, CheckGroup checkGroup, String value, int milliseconds) throws InterruptedException {
+
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to "value" within the number of "milliseconds" passed.
+ *
+ * @param value Expected value.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ */
+ @Override
+ public boolean check(ITestAccessor accessor, String value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to "value" within the number of "milliseconds" passed.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param value Expected value.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ */
+ @Override
+ public boolean check(ITestAccessor accessor, CheckGroup checkGroup, String value, int milliseconds) throws InterruptedException {
+
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the string starting at the element is not set to "value".
+ *
+ * @param value Expected value
+ * @return if the check passed
+ */
+ @Override
+ public boolean checkNot(ITestAccessor accessor, String value) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the string starting at the element is not set to "value".
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param value Expected value
+ * @return if the check passed
+ */
+ @Override
+ public boolean checkNot(ITestAccessor accessor, CheckGroup checkGroup, String value) {
+
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the string starting at the element is set to "value".
+ *
+ * @param value Expected value
+ * @return if the check passed
+ */
+ @Override
+ public boolean check(ITestAccessor accessor, String value) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the string starting at the element is set to "value".
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param value Expected value
+ * @return if the check passed
+ */
+ @Override
+ public boolean check(ITestAccessor accessor, CheckGroup checkGroup, String value) {
+
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to the "value" passed for the entire time passed into "milliseconds". Returns
+ * value found that caused failure or last value observed if time expires.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @return last value observed. Either value expected or value found at timeout.
+ */
+ public char checkMaintain(ITestAccessor accessor, CheckGroup checkGroup, char value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return ' ';
+ }
+
+ /**
+ * Verifies that the element is set to the "value" passed for the entire time passed into "milliseconds". Returns
+ * value found that caused failure or last value observed if time expires.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @return last value observed
+ */
+ public char checkMaintainNot(ITestAccessor accessor, CheckGroup checkGroup, char value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return ' ';
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified for the entire time specified. Assumes
+ * range is inclusive.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public char checkMaintainRange(ITestAccessor accessor, CheckGroup checkGroup, char minValue, char maxValue, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return ' ';
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified for the entire time specified.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public char checkMaintainRange(ITestAccessor accessor, CheckGroup checkGroup, char minValue, boolean minInclusive, char maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return ' ';
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified for the entire time specified. Assumes
+ * range is inclusive.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public char checkMaintainNotRange(ITestAccessor accessor, CheckGroup checkGroup, char minValue, char maxValue, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return ' ';
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified for the entire time specified.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+ * to the range value.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+ * to the range value.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public char checkMaintainNotRange(ITestAccessor accessor, CheckGroup checkGroup, char minValue, boolean minInclusive, char maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return ' ';
+ }
+
+ @Override
+ public Character get(ITestEnvironmentAccessor accessor) {
+ throwNoMappingElementException();
+ return ' ';
+ }
+
+ /**
+ * Returns the string of length "stringLength" starting as the position of the element.
+ *
+ * @param stringLength the length of the string to return
+ * @return the string starting with this element
+ */
+ @Override
+ public String getString(ITestEnvironmentAccessor accessor, int stringLength) {
+ throwNoMappingElementException();
+ return null;
+ }
+
+ /**
+ * Sets the element and the next ("value".length() -1) bytes to "value".charAt().
+ *
+ * @param value the string to set the bytes to
+ */
+ @Override
+ public void parseAndSet(ITestEnvironmentAccessor accessor, String value) {
+
+ throwNoMappingElementException();
+ }
+
+ /**
+ * Sets the element and the next ("value".length() -1) bytes to "value".charAt(). <b>No Log Record gets created in
+ * the Script Log File.</b>
+ *
+ * @param value the string to set the bytes to
+ */
+ @Override
+ public void setNoLog(ITestEnvironmentAccessor accessor, String value) {
+ throwNoMappingElementException();
+ }
+
+ /**
+ * Sets the element to the "value" passed.
+ *
+ * @param value The value to set.
+ */
+ public void set(ITestEnvironmentAccessor accessor, char value) {
+ throwNoMappingElementException();
+ }
+
+ /**
+ * Sets the element to the "value" passed and immediately sends the message that contains it.
+ *
+ * @param value The value to set.
+ */
+ public void setAndSend(ITestEnvironmentAccessor accessor, char value) {
+ throwNoMappingElementException();
+ }
+
+ /**
+ * Sets the element to the "value" passed. <b>No Log Record gets created in the Script Log File.</b>
+ *
+ * @param value The value to set.
+ */
+ public void setNoLog(ITestEnvironmentAccessor accessor, char value) {
+ throwNoMappingElementException();
+ }
+
+ /**
+ * Waits until the element has a value within the range specified. Either end of the range can be inclusive or not.
+ *
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+ * to the range value.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+ * to the range value.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public char waitForNotRange(ITestEnvironmentAccessor accessor, char minValue, boolean minInclusive, char maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return ' ';
+ }
+
+ /**
+ * Waits until the element has a value within the range specified. Range is assumes to be inclusive.
+ *
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public char waitForNotRange(ITestEnvironmentAccessor accessor, char minValue, char maxValue, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return ' ';
+ }
+
+ /**
+ * Waits until the element has a value within the range specified. Either end of the range can be inclusive or not.
+ *
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+ * to the range value.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+ * to the range value.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public char waitForRange(ITestEnvironmentAccessor accessor, char minValue, boolean minInclusive, char maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return ' ';
+ }
+
+ /**
+ * Waits until the element has a value within the range specified. Assumes the range is inclusive.
+ *
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public char waitForRange(ITestEnvironmentAccessor accessor, char minValue, char maxValue, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return ' ';
+ }
+
+ /**
+ * Waits until the element has a value other than the "value" passed. Returns last value observed upon a timout.
+ *
+ * @param value The expected value to wait for.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public char waitNotValue(ITestEnvironmentAccessor accessor, char value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return ' ';
+ }
+
+ /**
+ * Waits until the element equals the "value" passed. Returns last value observed upon a timout.
+ *
+ * @param value The expected value to wait for.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value found. Either value expected or value found at timeout.
+ */
+ public char waitForValue(ITestEnvironmentAccessor accessor, char value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return ' ';
+ }
+
+ /**
+ * Waits until the element equals the "value" passed. Returns last value observed upon a timout.
+ *
+ * @param value The expected value to wait for.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value found. Either value expected or value found at timeout.
+ */
+ @Override
+ protected String waitForValue(ITestEnvironmentAccessor accessor, String value, int milliseconds) throws InterruptedException {
+
+ throwNoMappingElementException();
+ return null;
+ }
+
+ /**
+ * Waits until the element does not equal the "value" passed. Returns last value observed upon a timout.
+ *
+ * @param value The expected value to wait for.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value found. Either value expected or value found at timeout.
+ */
+ @Override
+ protected String waitForNotValue(ITestEnvironmentAccessor accessor, String value, int milliseconds) throws InterruptedException {
+
+ throwNoMappingElementException();
+ return null;
+ }
+
+ @Override
+ public void setValue(Character value) {
+
+ throwNoMappingElementException();
+ }
+
+ @Override
+ public Character getValue() {
+ throwNoMappingElementException();
+ return ' ';
+ }
+
+ @Override
+ public String toString(Character obj) {
+ throwNoMappingElementException();
+ return null;
+ }
+
+ @Override
+ public boolean isNonMappingElement() {
+ return true;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingEmptyEnumElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingEmptyEnumElement.java
new file mode 100644
index 000000000..738ba7e4f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingEmptyEnumElement.java
@@ -0,0 +1,348 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.elements.nonmapping;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.testPoint.CheckGroup;
+import org.eclipse.osee.ote.core.testPoint.CheckPoint;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.condition.IDiscreteElementCondition;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.DiscreteElement;
+import org.eclipse.osee.ote.message.elements.Element;
+import org.eclipse.osee.ote.message.elements.EmptyEnum_Element;
+import org.eclipse.osee.ote.message.elements.IElementVisitor;
+import org.eclipse.osee.ote.message.enums.EmptyEnum;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+
+public class NonMappingEmptyEnumElement extends EmptyEnum_Element {
+
+ /**
+ * Copy constructor.
+ */
+ public NonMappingEmptyEnumElement(EmptyEnum_Element element) {
+ super(element.getMessage(), element.getElementName(), element.getMsgData(), element.getByteOffset(),
+ element.getMsb(), element.getLsb());
+ for (Object obj : element.getElementPath()) {
+ this.getElementPath().add(obj);
+ }
+ }
+
+ public NonMappingEmptyEnumElement(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+ super(message, elementName, messageData, byteOffset, msb, lsb);
+ }
+
+ public NonMappingEmptyEnumElement(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+ super(message, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
+ }
+
+ public NonMappingEmptyEnumElement(Message message, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+ super(message, elementName, messageData, bitOffset, bitLength);
+ }
+
+ @Override
+ public void checkForwarding(ITestAccessor accessor, EmptyEnum_Element cause, EmptyEnum value) throws InterruptedException {
+ throwNoMappingElementException();
+ }
+
+ @Override
+ public EmptyEnum elementMask(EmptyEnum value) {
+ throwNoMappingElementException();
+ return null;
+ }
+
+ @Override
+ public EmptyEnum get(ITestEnvironmentAccessor accessor) {
+ throwNoMappingElementException();
+ return null;
+ }
+
+ @Override
+ protected Element getNonMappingElement() {
+ throwNoMappingElementException();
+ return null;
+ }
+
+ @Override
+ public EmptyEnum getValue() {
+ throwNoMappingElementException();
+ return null;
+ }
+
+ @Override
+ public void parseAndSet(ITestEnvironmentAccessor accessor, String value) throws IllegalArgumentException {
+ throwNoMappingElementException();
+ }
+
+ @Override
+ public void setAndSend(ITestEnvironmentAccessor accessor, EmptyEnum enumeration) {
+ throwNoMappingElementException();
+ }
+
+ @Override
+ public void setValue(EmptyEnum obj) {
+ throwNoMappingElementException();
+ }
+
+ @Override
+ public String toString(EmptyEnum obj) {
+ throwNoMappingElementException();
+ return null;
+ }
+
+ @Override
+ public EmptyEnum valueOf(MemoryResource mem) {
+ throwNoMappingElementException();
+ return null;
+ }
+
+ @Override
+ public void visit(IElementVisitor visitor) {
+ throwNoMappingElementException();
+ }
+
+ @Override
+ public boolean check(ITestAccessor accessor, CheckGroup checkGroup, EmptyEnum value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ @Override
+ public boolean check(ITestAccessor accessor, CheckGroup checkGroup, EmptyEnum value) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ @Override
+ public boolean checkList(ITestAccessor accessor, CheckGroup checkGroup, boolean isInList, EmptyEnum[] list, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ @Override
+ public boolean checkList(ITestAccessor accessor, CheckGroup checkGroup, boolean wantInList, EmptyEnum[] list) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ @Override
+ public EmptyEnum checkMaintain(ITestAccessor accessor, CheckGroup checkGroup, EmptyEnum value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return null;
+ }
+
+ @Override
+ public EmptyEnum checkMaintainList(ITestAccessor accessor, CheckGroup checkGroup, EmptyEnum[] list, boolean isInList, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return null;
+ }
+
+ @Override
+ public EmptyEnum checkMaintainNot(ITestAccessor accessor, CheckGroup checkGroup, EmptyEnum value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return null;
+ }
+
+ @Override
+ public EmptyEnum checkMaintainNotNT(ITestAccessor accessor, EmptyEnum value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return null;
+ }
+
+ @Override
+ public EmptyEnum checkMaintainNotRange(ITestAccessor accessor, CheckGroup checkGroup, EmptyEnum minValue, boolean minInclusive, EmptyEnum maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return null;
+ }
+
+ @Override
+ public EmptyEnum checkMaintainNotRangeNT(ITestAccessor accessor, EmptyEnum minValue, boolean minInclusive, EmptyEnum maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return null;
+ }
+
+ @Override
+ public EmptyEnum checkMaintainNT(ITestAccessor accessor, EmptyEnum value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return null;
+ }
+
+ @Override
+ public EmptyEnum checkMaintainRange(ITestAccessor accessor, CheckGroup checkGroup, EmptyEnum minValue, boolean minInclusive, EmptyEnum maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return null;
+ }
+
+ @Override
+ public EmptyEnum checkMaintainRangeNT(ITestAccessor accessor, EmptyEnum minValue, boolean minInclusive, EmptyEnum maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return null;
+ }
+
+ @Override
+ public boolean checkNot(ITestAccessor accessor, CheckGroup checkGroup, EmptyEnum value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ @Override
+ public boolean checkNot(ITestAccessor accessor, CheckGroup checkGroup, EmptyEnum value) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ @Override
+ public boolean checkNotNT(ITestAccessor accessor, CheckGroup checkGroup, EmptyEnum value) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ @Override
+ public boolean checkNotRange(ITestAccessor accessor, CheckGroup checkGroup, EmptyEnum minValue, boolean minInclusive, EmptyEnum maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ @Override
+ public boolean checkNotRangeNT(ITestAccessor accessor, EmptyEnum minValue, boolean minInclusive, EmptyEnum maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ @Override
+ public boolean checkPulse(ITestAccessor accessor, CheckGroup checkGroup, EmptyEnum pulsedValue, EmptyEnum nonPulsedValue, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ @Override
+ public boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, EmptyEnum minValue, boolean minInclusive, EmptyEnum maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ @Override
+ public boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, EmptyEnum minValue, boolean minInclusive, EmptyEnum maxValue, boolean maxInclusive) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ @Override
+ public boolean checkRangeNT(ITestAccessor accessor, EmptyEnum minValue, boolean minInclusive, EmptyEnum maxValue, boolean maxInclusive, int millis) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ @Override
+ public boolean checkRangeNT(ITestAccessor accessor, EmptyEnum minValue, boolean minInclusive, EmptyEnum maxValue, boolean maxInclusive) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ @Override
+ public boolean checkNT(ITestAccessor accessor, CheckGroup checkGroup, EmptyEnum value) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ @Override
+ public int compareTo(DiscreteElement<EmptyEnum> o) {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ @Override
+ public EmptyEnum get() {
+ throwNoMappingElementException();
+ return null;
+ }
+
+ @Override
+ public EmptyEnum getNoLog() {
+ throwNoMappingElementException();
+ return null;
+ }
+
+ @Override
+ public void set(EmptyEnum value) {
+ throwNoMappingElementException();
+ }
+
+ @Override
+ public void set(ITestEnvironmentAccessor accessor, EmptyEnum value) {
+ throwNoMappingElementException();
+ }
+
+ @Override
+ public void setNoLog(EmptyEnum value) {
+ throwNoMappingElementException();
+ }
+
+ @Override
+ public void setNoLog(ITestEnvironmentAccessor accessor, EmptyEnum value) {
+ throwNoMappingElementException();
+ }
+
+ @Override
+ public synchronized void toggle(ITestEnvironmentAccessor accessor, EmptyEnum value1, EmptyEnum value2, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ }
+
+ @Override
+ public String toString() {
+ throwNoMappingElementException();
+ return "non mapping empty enum";
+ }
+
+ @Override
+ public String valueOf() {
+ throwNoMappingElementException();
+ return null;
+ }
+
+ @Override
+ public EmptyEnum waitForList(ITestAccessor accessor, EmptyEnum[] list, boolean isInList, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return null;
+ }
+
+ @Override
+ public EmptyEnum waitForNotRange(ITestEnvironmentAccessor accessor, EmptyEnum minValue, boolean minInclusive, EmptyEnum maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return null;
+ }
+
+ @Override
+ public EmptyEnum waitForNotValue(ITestEnvironmentAccessor accessor, EmptyEnum value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return null;
+ }
+
+ @Override
+ public EmptyEnum waitForRange(ITestEnvironmentAccessor accessor, EmptyEnum minValue, boolean minInclusive, EmptyEnum maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return null;
+ }
+
+ @Override
+ public EmptyEnum waitForValue(ITestEnvironmentAccessor accessor, EmptyEnum value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return null;
+ }
+
+ @Override
+ protected CheckPoint waitWithCheckPoint(ITestAccessor accessor, CheckGroup checkGroup, String expected, IDiscreteElementCondition<EmptyEnum> condition, boolean maintain, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingEnumeratedElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingEnumeratedElement.java
new file mode 100644
index 000000000..02e8f8126
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingEnumeratedElement.java
@@ -0,0 +1,381 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.elements.nonmapping;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.testPoint.CheckGroup;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.EnumeratedElement;
+import org.eclipse.osee.ote.message.elements.IEnumValue;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+
+/**
+ * @author Andy Jury
+ */
+public class NonMappingEnumeratedElement<T extends Enum<T> & IEnumValue<T>> extends EnumeratedElement<T> {
+
+ public NonMappingEnumeratedElement(EnumeratedElement<T> element) {
+ this(element.getMessage(), element.getElementName(), element.getEnumClass(), element.getMsgData(),
+ element.getByteOffset(), element.getMsb(), element.getLsb());
+
+ for (Object obj : element.getElementPath()) {
+ this.getElementPath().add(obj);
+ }
+ }
+
+ public NonMappingEnumeratedElement(Message msg, String elementName, Class<T> clazz, MessageData messageData, int byteOffset, int msb, int lsb, int originalMsb, int originalLsb) {
+ super(msg, elementName, clazz, messageData, byteOffset, msb, lsb, originalMsb, originalLsb);
+ }
+
+ public NonMappingEnumeratedElement(Message msg, String elementName, Class<T> clazz, MessageData messageData, int byteOffset, int msb, int lsb) {
+ super(msg, elementName, clazz, messageData, byteOffset, msb, lsb);
+ }
+
+ public NonMappingEnumeratedElement(Message message, String elementName, Class<T> clazz, MessageData messageData, int bitOffset, int bitLength) {
+ super(message, elementName, clazz, messageData, bitOffset, bitLength);
+ }
+
+ /**
+ * Verifies that the element is set to a value IN or NOT IN the "list" passed. "wantInList" determines if checking
+ * for IN the list or NOT.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param wantInList Determines if checking for the element's value to be in or not in the "list". Passing TRUE will
+ * test for IN the "list".
+ * @param list List of values to check for
+ * @return if check passed
+ */
+ @Override
+ public boolean checkList(ITestAccessor accessor, CheckGroup checkGroup, boolean wantInList, T[] list) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value IN or NOT IN the "list" passed. "isInList" determines if checking for
+ * IN the list or NOT.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param isInList Determines if checking for the element's value to be in or not in the "list". Passing TRUE will
+ * test for IN the "list".
+ * @param list List of values to check for
+ * @param milliseconds Number of milliseconds to wait
+ * @return if check passed
+ */
+ @Override
+ public boolean checkList(ITestAccessor accessor, CheckGroup checkGroup, boolean isInList, T[] list, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value in (or not in as determined by "isInList") the list for the entire
+ * time passed into milliseconds.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param list The list of values to check against
+ * @param isInList If the value is expected to be in or not in the "list"
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ @Override
+ public T checkMaintainList(ITestAccessor accessor, CheckGroup checkGroup, T[] list, boolean isInList, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return null;
+ }
+
+ /**
+ * Waits until the element is set to a value either in or not in the "list" as determined by "isInList".
+ *
+ * @param list The list of values to check against
+ * @param isInList If the value is expected to be in or not in the "list"
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ @Override
+ public T waitForList(ITestAccessor accessor, T[] list, boolean isInList, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return null;
+ }
+
+ /**
+ * Waits until the element has a value other than the "value" passed. Returns last value observed upon a time-out.
+ *
+ * @param enumeration The expected value to wait for.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ @Override
+ public T waitForNotValue(ITestEnvironmentAccessor accessor, T enumeration, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return null;
+ }
+
+ @Override
+ /**
+ * Sets the element to the first enumeration for the wait time and then it sets it to the second
+ * enumeration.
+ *
+ */
+ public void toggle(ITestEnvironmentAccessor accessor, T enumeration1, T enumeration2, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ }
+
+ @Override
+ /**
+ * Returns the current value of the element.
+ *
+ * @return The current value of the element.
+ */
+ public T get(ITestEnvironmentAccessor accessor) {
+ throwNoMappingElementException();
+ return null;
+ }
+
+ @Override
+ /**
+ * Sets the element to the "value" passed.
+ *
+ * @param enumeration The value to set.
+ */
+ public void set(ITestEnvironmentAccessor accessor, T enumeration) {
+ throwNoMappingElementException();
+ }
+
+ @Override
+ public void setAndSend(ITestEnvironmentAccessor accessor, T enumeration) {
+ throwNoMappingElementException();
+ }
+
+ @Override
+ /**
+ * Waits until the element is set to a value not in the "list" passed
+ *
+ * @param list The list of values to check against
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public T waitForNotInList(ITestAccessor accessor, T[] list, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return null;
+ }
+
+ @Override
+ /**
+ * Waits until the element is set to a value in the "list" passed
+ *
+ * @param list The list of values to check against
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public T waitForInList(ITestAccessor accessor, T[] list, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return null;
+ }
+
+ @Override
+ /**
+ * Verifies that the element is set to "value".
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is
+ * going to log then the reference to the CheckGroup must be passed and this method
+ * will add the result of the check to the group with out logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference
+ * should be passed and this method will log the test point.
+ * @param enumeration Expected value
+ * @return if the check passed
+ */
+ public boolean check(ITestAccessor accessor, CheckGroup checkGroup, T enumeration) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ @Override
+ /**
+ * Verifies that the element is NOT set to "value".
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is
+ * going to log then the reference to the CheckGroup must be passed and this method
+ * will add the result of the check to the group with out logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference
+ * should be passed and this method will log the test point.
+ * @param enumeration value to test against
+ * @return if the check passed
+ */
+ public boolean checkNot(ITestAccessor accessor, CheckGroup checkGroup, T enumeration) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ @Override
+ /**
+ * Verifies that the element is set to "value" within the number of "milliseconds" passed.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is
+ * going to log then the reference to the CheckGroup must be passed and this method
+ * will add the result of the check to the group with out logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference
+ * should be passed and this method will log the test point.
+ * @param enumeration Expected value.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ */
+ public boolean check(ITestAccessor accessor, CheckGroup checkGroup, T enumeration, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ @Override
+ /**
+ * Verifies that the element is set to some value other than "value" within the number of
+ * "milliseconds" passed. Passes if at any point with in the time allowed, the element is set to
+ * a value other than "value".
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is
+ * going to log then the reference to the CheckGroup must be passed and this method
+ * will add the result of the check to the group with out logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference
+ * should be passed and this method will log the test point.
+ * @param enumeration value to test against.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ */
+ public boolean checkNot(ITestAccessor accessor, CheckGroup checkGroup, T enumeration, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ @Override
+ /**
+ * Verifies that the element is set to the "value" passed for the entire time passed into
+ * "milliseconds". Returns value found that caused failure or last value observed if time
+ * expires.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is
+ * going to log then the reference to the CheckGroup must be passed and this method
+ * will add the result of the check to the group with out logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference
+ * should be passed and this method will log the test point.
+ * @return last value observed. Either value expected or value found at timeout.
+ */
+ public T checkMaintain(ITestAccessor accessor, CheckGroup checkGroup, T enumeration, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return null;
+ }
+
+ @Override
+ /**
+ * Verifies that the element is set to a value other than the "value" passed for the entire time
+ * passed into "milliseconds". Returns value found that caused failure or last value observed if
+ * time expires.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is
+ * going to log then the reference to the CheckGroup must be passed and this method
+ * will add the result of the check to the group with out logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference
+ * should be passed and this method will log the test point.
+ * @return last value observed
+ */
+ public T checkMaintainNot(ITestAccessor accessor, CheckGroup checkGroup, T enumeration, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return null;
+ }
+
+ /**
+ * This function will verify that this signal is pulsed for 2 cycles.
+ *
+ * @param value The value to be checked
+ */
+ @Override
+ public void checkPulse(ITestAccessor accessor, T value) throws InterruptedException {
+ throwNoMappingElementException();
+ }
+
+ @Override
+ public boolean checkPulse(ITestAccessor accessor, CheckGroup checkGroup, T pulsedValue, T nonPulsedValue, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ @Override
+ protected T toEnum(int intValue) {
+ throwNoMappingElementException();
+ return null;
+ }
+
+ @Override
+ public T[] getEnumValues() {
+ throwNoMappingElementException();
+ return null;
+ }
+
+ @Override
+ public void parseAndSet(ITestEnvironmentAccessor accessor, String value) throws IllegalArgumentException {
+ throwNoMappingElementException();
+ }
+
+ @Override
+ public boolean isNonMappingElement() {
+ return true;
+ }
+
+ @Override
+ public void setbyEnumIndex(int index) throws IllegalArgumentException {
+ throwNoMappingElementException();
+ }
+
+ @Override
+ public void setValue(T obj) {
+ throwNoMappingElementException();
+ }
+
+ @Override
+ public String toString(T obj) {
+ throwNoMappingElementException();
+ return super.toString(obj);
+ }
+
+ @Override
+ public String valueOf() {
+ throwNoMappingElementException();
+ return super.valueOf();
+ }
+
+ @Override
+ public T valueOf(MemoryResource otherMem) {
+ throwNoMappingElementException();
+ return super.valueOf(otherMem);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingFixedPointElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingFixedPointElement.java
new file mode 100644
index 000000000..84975d8e5
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingFixedPointElement.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.elements.nonmapping;
+
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.FixedPointElement;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+
+/**
+ * @author Andy Jury
+ */
+public class NonMappingFixedPointElement extends FixedPointElement {
+
+ /**
+ * Copy constructor.
+ */
+ public NonMappingFixedPointElement(FixedPointElement element) {
+ super(element.getMessage(), element.getElementName(), element.getMsgData(), 0, false, element.getByteOffset(),
+ element.getMsb(), element.getLsb());
+ for (Object obj : element.getElementPath()) {
+ this.getElementPath().add(obj);
+ }
+ }
+
+ public NonMappingFixedPointElement(Message message, String elementName, MessageData messageData, double resolution, boolean signed, int byteOffset, int msb, int lsb) {
+ super(message, elementName, messageData, resolution, signed, byteOffset, msb, lsb);
+ }
+
+ public NonMappingFixedPointElement(Message message, String elementName, MessageData messageData, double resolution, double minVal, boolean signed, int byteOffset, int msb, int lsb) {
+ super(message, elementName, messageData, resolution, minVal, signed, byteOffset, msb, lsb);
+ }
+
+ public NonMappingFixedPointElement(Message message, String elementName, MessageData messageData, double resolution, boolean signed, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+ super(message, elementName, messageData, resolution, signed, byteOffset, msb, lsb, originalLsb, originalMsb);
+ }
+
+ public NonMappingFixedPointElement(Message message, String elementName, MessageData messageData, double resolution, double minVal, boolean signed, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+ super(message, elementName, messageData, resolution, minVal, signed, byteOffset, msb, lsb, originalLsb,
+ originalMsb);
+ }
+
+ public NonMappingFixedPointElement(Message message, String elementName, MessageData messageData, double resolution, double minVal, boolean signed, int bitOffset, int bitLength) {
+ super(message, elementName, messageData, resolution, minVal, signed, bitOffset, bitLength);
+ }
+
+ @Override
+ public void checkForwarding(ITestAccessor accessor, FixedPointElement cause, double value) throws InterruptedException {
+ throwNoMappingElementException();
+ }
+
+ /**
+ * @return Returns the minVal.
+ */
+ @Override
+ public double getMinVal() {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * @return Returns the resolution.
+ */
+ @Override
+ public double getResolution() {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * @return Returns the signed.
+ */
+ @Override
+ public boolean isSigned() {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ @Override
+ public boolean isNonMappingElement() {
+ return true;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingFloat32Element.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingFloat32Element.java
new file mode 100644
index 000000000..e6beb91ee
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingFloat32Element.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.elements.nonmapping;
+
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.Float32Element;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+
+/**
+ * @author Andy Jury
+ */
+public class NonMappingFloat32Element extends Float32Element {
+
+ /**
+ * Copy constructor.
+ */
+ public NonMappingFloat32Element(Float32Element element) {
+ super(element.getMessage(), element.getElementName(), element.getMsgData(), element.getByteOffset(),
+ element.getMsb(), element.getLsb());
+ for (Object obj : element.getElementPath()) {
+ this.getElementPath().add(obj);
+ }
+ }
+
+ public NonMappingFloat32Element(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+ super(message, elementName, messageData, byteOffset, msb, lsb);
+ }
+
+ public NonMappingFloat32Element(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+ super(message, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
+ }
+
+ public NonMappingFloat32Element(Message message, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+ super(message, elementName, messageData, bitOffset, bitLength);
+ }
+
+ @Override
+ public void checkForwarding(ITestAccessor accessor, Float32Element cause, double value) throws InterruptedException {
+ throwNoMappingElementException();
+ }
+
+ @Override
+ public boolean isNonMappingElement() {
+ return true;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingFloat64Element.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingFloat64Element.java
new file mode 100644
index 000000000..4b9d83d3f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingFloat64Element.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.elements.nonmapping;
+
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.Float64Element;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+
+/**
+ * @author Andy Jury
+ */
+public class NonMappingFloat64Element extends Float64Element {
+
+ /**
+ * Copy constructor.
+ */
+ public NonMappingFloat64Element(Float64Element element) {
+ super(element.getMessage(), element.getElementName(), element.getMsgData(), element.getByteOffset(),
+ element.getMsb(), element.getLsb());
+ for (Object obj : element.getElementPath()) {
+ this.getElementPath().add(obj);
+ }
+ }
+
+ public NonMappingFloat64Element(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+ super(message, elementName, messageData, byteOffset, msb, lsb);
+ }
+
+ public NonMappingFloat64Element(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+ super(message, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
+ }
+
+ public NonMappingFloat64Element(Message message, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+ super(message, elementName, messageData, bitOffset, bitLength);
+ }
+
+ @Override
+ public void checkForwarding(ITestAccessor accessor, Float64Element cause, double value) throws InterruptedException {
+ throwNoMappingElementException();
+
+ }
+
+ @Override
+ public boolean isNonMappingElement() {
+ return true;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingIntegerElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingIntegerElement.java
new file mode 100644
index 000000000..ee796e7da
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingIntegerElement.java
@@ -0,0 +1,841 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.elements.nonmapping;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.testPoint.CheckGroup;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.IntegerElement;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+
+/**
+ * @author Andy Jury
+ */
+public class NonMappingIntegerElement extends IntegerElement {
+
+ /**
+ * Copy constructor.
+ */
+ public NonMappingIntegerElement(IntegerElement element) {
+ super(element.getMessage(), element.getElementName(), element.getMsgData(), element.getByteOffset(),
+ element.getMsb(), element.getLsb());
+ for (Object obj : element.getElementPath()) {
+ this.getElementPath().add(obj);
+ }
+ }
+
+ public NonMappingIntegerElement(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+ super(message, elementName, messageData, byteOffset, msb, lsb);
+ }
+
+ public NonMappingIntegerElement(Message message, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+ super(message, elementName, messageData, bitOffset, bitLength);
+ }
+
+ public NonMappingIntegerElement(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+ super(message, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
+ }
+
+ @Override
+ public String toString(Integer obj) {
+ throwNoMappingElementException();
+ return null;
+ }
+
+ @Override
+ public void setValue(Integer value) {
+ throwNoMappingElementException();
+ }
+
+ @Override
+ public Integer getValue() {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Checks that this element correctly forwards a message sent from cause with the value passed.
+ *
+ * @param cause The originator of the signal
+ * @param value The value sent by cause and being forwarded by this element
+ */
+ @Override
+ public void checkForwarding(ITestAccessor accessor, IntegerElement cause, int value) throws InterruptedException {
+
+ throwNoMappingElementException();
+ }
+
+ /**
+ * Verifies that the element is set to "value".
+ *
+ * @param value Expected value
+ * @return if the check passed
+ */
+ public boolean check(ITestAccessor accessor, int value) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to "value".
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param value Expected value
+ * @return if the check passed
+ */
+ public boolean check(ITestAccessor accessor, CheckGroup checkGroup, int value) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified. Assumes that both ends of the range are
+ * inclusive.
+ *
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @return if the check passed
+ */
+ public boolean checkRange(ITestAccessor accessor, int minValue, int maxValue) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified. Assumes that both ends of the range are
+ * inclusive.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @return if the check passed
+ */
+ public boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, int maxValue) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified. Either end of the range can be set to be
+ * inclusive or not.
+ *
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive.
+ * @return if the check passed
+ */
+ public boolean checkRange(ITestAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified. Either end of the range can be set to be
+ * inclusive or not.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive.
+ * @return if the check passed
+ */
+ public boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is NOT set to "value".
+ *
+ * @param value value to test against
+ * @return if the check passed
+ */
+ public boolean checkNot(ITestAccessor accessor, int value) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is NOT set to "value".
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param value value to test against
+ * @return if the check passed
+ */
+ public boolean checkNot(ITestAccessor accessor, CheckGroup checkGroup, int value) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value outside the range specified. Assumes that both ends of the range are
+ * inclusive. Therefore observed value may not equal either of the range values.
+ *
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @return if the check passed
+ */
+ public boolean checkNotRange(ITestAccessor accessor, int minValue, int maxValue) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value outside the range specified. Assumes that both ends of the range are
+ * inclusive. Therefore observed value may not equal either of the range values.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @return if the check passed
+ */
+ public boolean checkNotRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, int maxValue) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value outside the range specified. Either end of the range can be set to be
+ * inclusive or not.
+ *
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+ * to the range value.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+ * to the range value.
+ * @return if the check passed
+ */
+ public boolean checkNotRange(ITestAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value outside the range specified. Either end of the range can be set to be
+ * inclusive or not.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+ * to the range value.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+ * to the range value.
+ * @return if the check passed
+ */
+ public boolean checkNotRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to "value" within the number of "milliseconds" passed.
+ *
+ * @param value Expected value.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ */
+ public boolean check(ITestAccessor accessor, int value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to "value" within the number of "milliseconds" passed.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param value Expected value.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ */
+ public boolean check(ITestAccessor accessor, CheckGroup checkGroup, int value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * This function will verify that this signal is pulsed for 2 cycles.
+ *
+ * @param value The value to be checked
+ */
+ public void checkPulse(ITestAccessor accessor, int value) throws InterruptedException {
+
+ throwNoMappingElementException();
+ }
+
+ public void checkPulse(ITestAccessor accessor, int pulsedValue, int nonPulsedValue) throws InterruptedException {
+ throwNoMappingElementException();
+ }
+
+ public void checkPulse(ITestAccessor accessor, CheckGroup checkGroup, int pulsedValue, int nonPulsedValue) throws InterruptedException {
+ throwNoMappingElementException();
+ }
+
+ public void checkPulse(ITestAccessor accessor, int pulsedValue, int nonPulsedValue, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ }
+
+ public void checkPulse(ITestAccessor accessor, CheckGroup checkGroup, int pulsedValue, int nonPulsedValue, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified. Assumes that both ends of the range are
+ * inclusive.
+ *
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait for the element to be within the range.
+ * @return if the check passed
+ */
+ public boolean checkRange(ITestAccessor accessor, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified. Assumes that both ends of the range are
+ * inclusive.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait for the element to be within the range.
+ * @return if the check passed
+ */
+ public boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified. Either end of the range can be set to be
+ * inclusive or not.
+ *
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive.
+ * @param milliseconds Number of milliseconds to wait for the element to be within the range.
+ * @return if the check passed
+ */
+ public boolean checkRange(ITestAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified. Either end of the range can be set to be
+ * inclusive or not.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive.
+ * @param milliseconds Number of milliseconds to wait for the element to be within the range.
+ * @return if the check passed
+ */
+ public boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to some value other than "value" within the number of "milliseconds" passed.
+ * Passes if at any point with in the time allowed, the elment is set to a value other than "value".
+ *
+ * @param value value to test against.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ */
+ public boolean checkNot(ITestAccessor accessor, int value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to some value other than "value" within the number of "milliseconds" passed.
+ * Passes if at any point with in the time allowed, the elment is set to a value other than "value".
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param value value to test against.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ */
+ public boolean checkNot(ITestAccessor accessor, CheckGroup checkGroup, int value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value outside the range specified. Assumes that both ends of the range are
+ * inclusive.
+ *
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait for the element to be outside the range.
+ * @return if the check passed
+ */
+ public boolean checkNotRange(ITestAccessor accessor, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value outside the range specified. Assumes that both ends of the range are
+ * inclusive.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait for the element to be outside the range.
+ * @return if the check passed
+ */
+ public boolean checkNotRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value outside the range specified. Either end of the range can be set to be
+ * inclusive or not.
+ *
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+ * to the range value.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+ * to the range value.
+ * @param milliseconds Number of milliseconds to wait for the element to be outside the range.
+ * @return if the check passed
+ */
+ public boolean checkNotRange(ITestAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value outside the range specified. Either end of the range can be set to be
+ * inclusive or not.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+ * to the range value.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+ * to the range value.
+ * @param milliseconds Number of milliseconds to wait for the element to be outside the range.
+ * @return if the check passed
+ */
+ public boolean checkNotRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to the "value" passed for the entire time passed into "milliseconds". Returns
+ * value found that caused failure or last value observed if time expires.
+ *
+ * @return last value observed. Either value expected or value found at timeout.
+ */
+ public int checkMaintain(ITestAccessor accessor, int value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Verifies that the element is set to the "value" passed for the entire time passed into "milliseconds". Returns
+ * value found that caused failure or last value observed if time expires.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @return last value observed. Either value expected or value found at timeout.
+ */
+ public int checkMaintain(ITestAccessor accessor, CheckGroup checkGroup, int value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Verifies that the element is set to the "value" passed for the entire time passed into "milliseconds". Returns
+ * value found that caused failure or last value observed if time expires.
+ *
+ * @return last value observed
+ */
+ public int checkMaintainNot(ITestAccessor accessor, int value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Verifies that the element is set to the "value" passed for the entire time passed into "milliseconds". Returns
+ * value found that caused failure or last value observed if time expires.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @return last value observed
+ */
+ public int checkMaintainNot(ITestAccessor accessor, CheckGroup checkGroup, int value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified for the entire time specified. Assumes
+ * range is inclusive.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public int checkMaintainRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified for the entire time specified.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public int checkMaintainRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified for the entire time specified. Assumes
+ * range is inclusive.
+ *
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public int checkMaintainRange(ITestAccessor accessor, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified for the entire time specified.
+ *
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public int checkMaintainRange(ITestAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ // /**
+ // * Verifies that the element is set to a value within the range specified for the entire time
+ // specified. Assumes range is inclusive.
+ // *
+ // // * @param minValue The minimum value of the range.
+ // * @param maxValue The maximum value of the range.
+ // * @param milliseconds Number of milliseconds to wait before failing.
+ // * @return last value observed
+ // // */
+ // public int checkMaintainRange(ITestAccessor accessor, int minValue, int maxValue, int
+ // milliseconds) throws InterruptedException {
+ // return checkMaintainRange(accessor, (CheckGroup)null, minValue, true, maxValue, true,
+ // milliseconds);}
+ //
+ // /**
+ // * Verifies that the element is set to a value within the range specified for the entire time
+ // specified.
+ // *
+ // // * @param minValue The minimum value of the range.
+ // * @param minInclusive If the minumum value of the range is inclusive.
+ // * @param maxValue The maximum value of the range.
+ // * @param maxInclusive If the maximum value of the range is inclusive.
+ // * @param milliseconds Number of milliseconds to wait before failing.
+ // * @return last value observed
+ // // */
+ // public int checkMaintainRange(ITestAccessor accessor, int minValue, boolean minInclusive, int
+ // maxValue, boolean maxInclusive,
+ // int milliseconds) throws InterruptedException {
+ // return checkMaintainRangeBase(accessor, (CheckGroup)null, minValue, minInclusive, maxValue,
+ // maxInclusive, milliseconds);
+ // }
+
+ /**
+ * Verifies that the element is set to a value within the range specified for the entire time specified. Assumes
+ * range is inclusive.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public int checkMaintainNotRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified for the entire time specified.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+ * to the range value.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+ * to the range value.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public int checkMaintainNotRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Returns the current value of the element.
+ *
+ * @return The current value of the element.
+ */
+ @Override
+ public Integer get(ITestEnvironmentAccessor accessor) {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Sets the element to the "value" passed.
+ *
+ * @param value The value to set.
+ */
+ public void set(ITestEnvironmentAccessor accessor, int value) {
+ throwNoMappingElementException();
+ }
+
+ @Override
+ public void setAndSend(ITestEnvironmentAccessor accessor, int value) {
+ throwNoMappingElementException();
+ }
+
+ /**
+ * Sets the element to the "value" passed.
+ *
+ * @param value The value to set.
+ */
+ public void setNoLog(ITestEnvironmentAccessor accessor, int value) {
+ throwNoMappingElementException();
+ }
+
+ /**
+ * Waits until the element equals the "value" passed. Returns last value observed upon a timout.
+ *
+ * @param value The expected value to wait for.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value found. Either value expected or value found at timeout.
+ */
+ public int waitForValue(ITestEnvironmentAccessor accessor, int value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Waits until the element has a value other than the "value" passed. Returns last value observed upon a timout.
+ *
+ * @param value The expected value to wait for.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public int waitForNotValue(ITestEnvironmentAccessor accessor, int value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Waits until the element has a value within the range specified. Assumes the range is inclusive.
+ *
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ @Override
+ public int waitForRange(ITestEnvironmentAccessor accessor, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Waits until the element has a value within the range specified. Either end of the range can be inclusive or not.
+ *
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+ * to the range value.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+ * to the range value.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ @Override
+ public int waitForRange(ITestEnvironmentAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Waits until the element has a value within the range specified. Range is assumes to be inclusive.
+ *
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ @Override
+ public int waitForNotRange(ITestEnvironmentAccessor accessor, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Waits until the element has a value within the range specified. Either end of the range can be inclusive or not.
+ *
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+ * to the range value.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+ * to the range value.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ @Override
+ public int waitForNotRange(ITestEnvironmentAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ @Override
+ public void parseAndSet(ITestEnvironmentAccessor accessor, String value) throws IllegalArgumentException {
+ throwNoMappingElementException();
+ }
+
+ @Override
+ public boolean isNonMappingElement() {
+ return true;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingLongIntegerElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingLongIntegerElement.java
new file mode 100644
index 000000000..a5988bb5f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingLongIntegerElement.java
@@ -0,0 +1,831 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.elements.nonmapping;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.testPoint.CheckGroup;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.IntegerElement;
+import org.eclipse.osee.ote.message.elements.LongIntegerElement;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+
+/**
+ * @author Andy Jury
+ */
+public class NonMappingLongIntegerElement extends LongIntegerElement {
+
+ /**
+ * Copy constructor.
+ */
+ public NonMappingLongIntegerElement(LongIntegerElement element) {
+ super(element.getMessage(), element.getElementName(), element.getMsgData(), element.getByteOffset(),
+ element.getMsb(), element.getLsb());
+ for (Object obj : element.getElementPath()) {
+ this.getElementPath().add(obj);
+ }
+ }
+
+ public NonMappingLongIntegerElement(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+ super(message, elementName, messageData, byteOffset, msb, lsb);
+ }
+
+ public NonMappingLongIntegerElement(Message message, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+ super(message, elementName, messageData, bitOffset, bitLength);
+ }
+
+ public NonMappingLongIntegerElement(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+ super(message, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
+ }
+
+ @Override
+ public void setValue(Long value) {
+ throwNoMappingElementException();
+ }
+
+ @Override
+ public Long getValue() {
+ throwNoMappingElementException();
+ return 0L;
+ }
+
+ /**
+ * Checks that this element correctly forwards a message sent from cause with the value passed.
+ *
+ * @param cause The originator of the signal
+ * @param value The value sent by cause and being forwarded by this element
+ */
+ public void checkForwarding(ITestAccessor accessor, IntegerElement cause, int value) throws InterruptedException {
+
+ throwNoMappingElementException();
+ }
+
+ /**
+ * Verifies that the element is set to "value".
+ *
+ * @param value Expected value
+ * @return if the check passed
+ */
+ public boolean check(ITestAccessor accessor, int value) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to "value".
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param value Expected value
+ * @return if the check passed
+ */
+ public boolean check(ITestAccessor accessor, CheckGroup checkGroup, int value) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified. Assumes that both ends of the range are
+ * inclusive.
+ *
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @return if the check passed
+ */
+ public boolean checkRange(ITestAccessor accessor, int minValue, int maxValue) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified. Assumes that both ends of the range are
+ * inclusive.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @return if the check passed
+ */
+ public boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, int maxValue) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified. Either end of the range can be set to be
+ * inclusive or not.
+ *
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive.
+ * @return if the check passed
+ */
+ public boolean checkRange(ITestAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified. Either end of the range can be set to be
+ * inclusive or not.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive.
+ * @return if the check passed
+ */
+ public boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is NOT set to "value".
+ *
+ * @param value value to test against
+ * @return if the check passed
+ */
+ public boolean checkNot(ITestAccessor accessor, int value) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is NOT set to "value".
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param value value to test against
+ * @return if the check passed
+ */
+ public boolean checkNot(ITestAccessor accessor, CheckGroup checkGroup, int value) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value outside the range specified. Assumes that both ends of the range are
+ * inclusive. Therefore observed value may not equal either of the range values.
+ *
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @return if the check passed
+ */
+ public boolean checkNotRange(ITestAccessor accessor, int minValue, int maxValue) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value outside the range specified. Assumes that both ends of the range are
+ * inclusive. Therefore observed value may not equal either of the range values.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @return if the check passed
+ */
+ public boolean checkNotRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, int maxValue) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value outside the range specified. Either end of the range can be set to be
+ * inclusive or not.
+ *
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+ * to the range value.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+ * to the range value.
+ * @return if the check passed
+ */
+ public boolean checkNotRange(ITestAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value outside the range specified. Either end of the range can be set to be
+ * inclusive or not.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+ * to the range value.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+ * to the range value.
+ * @return if the check passed
+ */
+ public boolean checkNotRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to "value" within the number of "milliseconds" passed.
+ *
+ * @param value Expected value.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ */
+ public boolean check(ITestAccessor accessor, int value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to "value" within the number of "milliseconds" passed.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param value Expected value.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ */
+ public boolean check(ITestAccessor accessor, CheckGroup checkGroup, int value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * This function will verify that this signal is pulsed for 2 cycles.
+ *
+ * @param value The value to be checked
+ */
+ public void checkPulse(ITestAccessor accessor, int value) throws InterruptedException {
+
+ throwNoMappingElementException();
+ }
+
+ public void checkPulse(ITestAccessor accessor, int pulsedValue, int nonPulsedValue) throws InterruptedException {
+ throwNoMappingElementException();
+ }
+
+ public void checkPulse(ITestAccessor accessor, CheckGroup checkGroup, int pulsedValue, int nonPulsedValue) throws InterruptedException {
+ throwNoMappingElementException();
+ }
+
+ public void checkPulse(ITestAccessor accessor, int pulsedValue, int nonPulsedValue, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ }
+
+ public void checkPulse(ITestAccessor accessor, CheckGroup checkGroup, int pulsedValue, int nonPulsedValue, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified. Assumes that both ends of the range are
+ * inclusive.
+ *
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait for the element to be within the range.
+ * @return if the check passed
+ */
+ public boolean checkRange(ITestAccessor accessor, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified. Assumes that both ends of the range are
+ * inclusive.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait for the element to be within the range.
+ * @return if the check passed
+ */
+ public boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified. Either end of the range can be set to be
+ * inclusive or not.
+ *
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive.
+ * @param milliseconds Number of milliseconds to wait for the element to be within the range.
+ * @return if the check passed
+ */
+ public boolean checkRange(ITestAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified. Either end of the range can be set to be
+ * inclusive or not.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive.
+ * @param milliseconds Number of milliseconds to wait for the element to be within the range.
+ * @return if the check passed
+ */
+ public boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to some value other than "value" within the number of "milliseconds" passed.
+ * Passes if at any point with in the time allowed, the elment is set to a value other than "value".
+ *
+ * @param value value to test against.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ */
+ public boolean checkNot(ITestAccessor accessor, int value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to some value other than "value" within the number of "milliseconds" passed.
+ * Passes if at any point with in the time allowed, the elment is set to a value other than "value".
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param value value to test against.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ */
+ public boolean checkNot(ITestAccessor accessor, CheckGroup checkGroup, int value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value outside the range specified. Assumes that both ends of the range are
+ * inclusive.
+ *
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait for the element to be outside the range.
+ * @return if the check passed
+ */
+ public boolean checkNotRange(ITestAccessor accessor, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value outside the range specified. Assumes that both ends of the range are
+ * inclusive.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait for the element to be outside the range.
+ * @return if the check passed
+ */
+ public boolean checkNotRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value outside the range specified. Either end of the range can be set to be
+ * inclusive or not.
+ *
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+ * to the range value.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+ * to the range value.
+ * @param milliseconds Number of milliseconds to wait for the element to be outside the range.
+ * @return if the check passed
+ */
+ public boolean checkNotRange(ITestAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value outside the range specified. Either end of the range can be set to be
+ * inclusive or not.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+ * to the range value.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+ * to the range value.
+ * @param milliseconds Number of milliseconds to wait for the element to be outside the range.
+ * @return if the check passed
+ */
+ public boolean checkNotRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to the "value" passed for the entire time passed into "milliseconds". Returns
+ * value found that caused failure or last value observed if time expires.
+ *
+ * @return last value observed. Either value expected or value found at timeout.
+ */
+ public int checkMaintain(ITestAccessor accessor, int value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Verifies that the element is set to the "value" passed for the entire time passed into "milliseconds". Returns
+ * value found that caused failure or last value observed if time expires.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @return last value observed. Either value expected or value found at timeout.
+ */
+ public int checkMaintain(ITestAccessor accessor, CheckGroup checkGroup, int value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Verifies that the element is set to the "value" passed for the entire time passed into "milliseconds". Returns
+ * value found that caused failure or last value observed if time expires.
+ *
+ * @return last value observed
+ */
+ public int checkMaintainNot(ITestAccessor accessor, int value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Verifies that the element is set to the "value" passed for the entire time passed into "milliseconds". Returns
+ * value found that caused failure or last value observed if time expires.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @return last value observed
+ */
+ public int checkMaintainNot(ITestAccessor accessor, CheckGroup checkGroup, int value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified for the entire time specified. Assumes
+ * range is inclusive.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public int checkMaintainRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified for the entire time specified.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public int checkMaintainRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified for the entire time specified. Assumes
+ * range is inclusive.
+ *
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public int checkMaintainRange(ITestAccessor accessor, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified for the entire time specified.
+ *
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public int checkMaintainRange(ITestAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ // /**
+ // * Verifies that the element is set to a value within the range specified for the entire time
+ // specified. Assumes range is inclusive.
+ // *
+ // // * @param minValue The minimum value of the range.
+ // * @param maxValue The maximum value of the range.
+ // * @param milliseconds Number of milliseconds to wait before failing.
+ // * @return last value observed
+ // // */
+ // public int checkMaintainRange(ITestAccessor accessor, int minValue, int maxValue, int
+ // milliseconds) throws InterruptedException {
+ // return checkMaintainRange(accessor, (CheckGroup)null, minValue, true, maxValue, true,
+ // milliseconds);}
+ //
+ // /**
+ // * Verifies that the element is set to a value within the range specified for the entire time
+ // specified.
+ // *
+ // // * @param minValue The minimum value of the range.
+ // * @param minInclusive If the minumum value of the range is inclusive.
+ // * @param maxValue The maximum value of the range.
+ // * @param maxInclusive If the maximum value of the range is inclusive.
+ // * @param milliseconds Number of milliseconds to wait before failing.
+ // * @return last value observed
+ // // */
+ // public int checkMaintainRange(ITestAccessor accessor, int minValue, boolean minInclusive, int
+ // maxValue, boolean maxInclusive,
+ // int milliseconds) throws InterruptedException {
+ // return checkMaintainRangeBase(accessor, (CheckGroup)null, minValue, minInclusive, maxValue,
+ // maxInclusive, milliseconds);
+ // }
+
+ /**
+ * Verifies that the element is set to a value within the range specified for the entire time specified. Assumes
+ * range is inclusive.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public int checkMaintainNotRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified for the entire time specified.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+ * to the range value.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+ * to the range value.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public int checkMaintainNotRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Returns the current value of the element.
+ *
+ * @return The current value of the element.
+ */
+ @Override
+ public Long get(ITestEnvironmentAccessor accessor) {
+ throwNoMappingElementException();
+ return 0L;
+ }
+
+ /**
+ * Sets the element to the "value" passed.
+ *
+ * @param value The value to set.
+ */
+ public void set(ITestEnvironmentAccessor accessor, int value) {
+ throwNoMappingElementException();
+ }
+
+ @Override
+ public void setAndSend(ITestEnvironmentAccessor accessor, long value) {
+ throwNoMappingElementException();
+ }
+
+ /**
+ * Sets the element to the "value" passed.
+ *
+ * @param value The value to set.
+ */
+ public void setNoLog(ITestEnvironmentAccessor accessor, int value) {
+ throwNoMappingElementException();
+ }
+
+ /**
+ * Waits until the element equals the "value" passed. Returns last value observed upon a timout.
+ *
+ * @param value The expected value to wait for.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value found. Either value expected or value found at timeout.
+ */
+ public int waitForValue(ITestEnvironmentAccessor accessor, int value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Waits until the element has a value other than the "value" passed. Returns last value observed upon a timout.
+ *
+ * @param value The expected value to wait for.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public int waitForNotValue(ITestEnvironmentAccessor accessor, int value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Waits until the element has a value within the range specified. Assumes the range is inclusive.
+ *
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public int waitForRange(ITestEnvironmentAccessor accessor, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Waits until the element has a value within the range specified. Either end of the range can be inclusive or not.
+ *
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+ * to the range value.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+ * to the range value.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public int waitForRange(ITestEnvironmentAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Waits until the element has a value within the range specified. Range is assumes to be inclusive.
+ *
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public int waitForNotRange(ITestEnvironmentAccessor accessor, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Waits until the element has a value within the range specified. Either end of the range can be inclusive or not.
+ *
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+ * to the range value.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+ * to the range value.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public int waitForNotRange(ITestEnvironmentAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ @Override
+ public void parseAndSet(ITestEnvironmentAccessor accessor, String value) throws IllegalArgumentException {
+ throwNoMappingElementException();
+ }
+
+ @Override
+ public boolean isNonMappingElement() {
+ return true;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingRecordElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingRecordElement.java
new file mode 100644
index 000000000..c72f475f2
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingRecordElement.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.elements.nonmapping;
+
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.RecordElement;
+
+/**
+ * @author Andy Jury
+ */
+public class NonMappingRecordElement extends RecordElement {
+
+ public NonMappingRecordElement(RecordElement element) {
+ super(element.getMessage(), element.getElementName(), element.getMsgData(), element.getByteOffset(),
+ element.getBitLength());
+ for (Object obj : element.getElementPath()) {
+ this.getElementPath().add(obj);
+ }
+ }
+
+ public NonMappingRecordElement(Message message, String elementName, int index, MessageData messageData, int firstRecordBitOffset, int recordBitSize) {
+ super(message, elementName, index, messageData, firstRecordBitOffset, recordBitSize);
+ }
+
+ public NonMappingRecordElement(RecordElement message, String elementName, int offset, MessageData messageData, int firstRecordByteOffset, int recordByteSize) {
+ super(message, elementName, offset, messageData, firstRecordByteOffset, recordByteSize);
+ }
+
+ public NonMappingRecordElement(Message message, String elementName, MessageData messageData, int firstRecordByteOffset, int recordByteSize) {
+ super(message, elementName, messageData, firstRecordByteOffset, recordByteSize);
+ }
+
+ @Override
+ public boolean isNonMappingElement() {
+ return true;
+ }
+
+ public int compareTo(RecordElement o) {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingSignedInteger16Element.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingSignedInteger16Element.java
new file mode 100644
index 000000000..be36e91db
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingSignedInteger16Element.java
@@ -0,0 +1,844 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.elements.nonmapping;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.testPoint.CheckGroup;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.IntegerElement;
+import org.eclipse.osee.ote.message.elements.SignedInteger16Element;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+
+/**
+ * @author Andy Jury
+ */
+public class NonMappingSignedInteger16Element extends IntegerElement {
+
+ /**
+ * Copy constructor.
+ */
+ public NonMappingSignedInteger16Element(SignedInteger16Element element) {
+ super(element.getMessage(), element.getElementName(), element.getMsgData(), element.getByteOffset(),
+ element.getMsb(), element.getLsb());
+ for (Object obj : element.getElementPath()) {
+ this.getElementPath().add(obj);
+ }
+ }
+
+ public NonMappingSignedInteger16Element(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+ super(message, elementName, messageData, byteOffset, msb, lsb);
+ }
+
+ public NonMappingSignedInteger16Element(Message message, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+ super(message, elementName, messageData, bitOffset, bitLength);
+ }
+
+ public NonMappingSignedInteger16Element(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+ super(message, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
+ }
+
+ /**
+ * Checks that this element correctly forwards a message sent from cause with the value passed.
+ *
+ * @param cause The originator of the signal
+ * @param value The value sent by cause and being forwarded by this element
+ */
+ @Override
+ public void checkForwarding(ITestAccessor accessor, IntegerElement cause, int value) throws InterruptedException {
+
+ throwNoMappingElementException();
+ }
+
+ /**
+ * Verifies that the element is set to "value".
+ *
+ * @param value Expected value
+ * @return if the check passed
+ */
+ public boolean check(ITestAccessor accessor, int value) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to "value".
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param value Expected value
+ * @return if the check passed
+ */
+ public boolean check(ITestAccessor accessor, CheckGroup checkGroup, int value) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified. Assumes that both ends of the range are
+ * inclusive.
+ *
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @return if the check passed
+ */
+ public boolean checkRange(ITestAccessor accessor, int minValue, int maxValue) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified. Assumes that both ends of the range are
+ * inclusive.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @return if the check passed
+ */
+ public boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, int maxValue) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified. Either end of the range can be set to be
+ * inclusive or not.
+ *
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive.
+ * @return if the check passed
+ */
+ public boolean checkRange(ITestAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified. Either end of the range can be set to be
+ * inclusive or not.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive.
+ * @return if the check passed
+ */
+ public boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is NOT set to "value".
+ *
+ * @param value value to test against
+ * @return if the check passed
+ */
+ public boolean checkNot(ITestAccessor accessor, int value) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is NOT set to "value".
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param value value to test against
+ * @return if the check passed
+ */
+ public boolean checkNot(ITestAccessor accessor, CheckGroup checkGroup, int value) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value outside the range specified. Assumes that both ends of the range are
+ * inclusive. Therefore observed value may not equal either of the range values.
+ *
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @return if the check passed
+ */
+ public boolean checkNotRange(ITestAccessor accessor, int minValue, int maxValue) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value outside the range specified. Assumes that both ends of the range are
+ * inclusive. Therefore observed value may not equal either of the range values.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @return if the check passed
+ */
+ public boolean checkNotRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, int maxValue) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value outside the range specified. Either end of the range can be set to be
+ * inclusive or not.
+ *
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+ * to the range value.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+ * to the range value.
+ * @return if the check passed
+ */
+ public boolean checkNotRange(ITestAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value outside the range specified. Either end of the range can be set to be
+ * inclusive or not.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+ * to the range value.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+ * to the range value.
+ * @return if the check passed
+ */
+ public boolean checkNotRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive) {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to "value" within the number of "milliseconds" passed.
+ *
+ * @param value Expected value.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ */
+ public boolean check(ITestAccessor accessor, int value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to "value" within the number of "milliseconds" passed.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param value Expected value.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ */
+ public boolean check(ITestAccessor accessor, CheckGroup checkGroup, int value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * This function will verify that this signal is pulsed for 2 cycles.
+ *
+ * @param value The value to be checked
+ */
+ public void checkPulse(ITestAccessor accessor, int value) throws InterruptedException {
+
+ throwNoMappingElementException();
+ }
+
+ public void checkPulse(ITestAccessor accessor, int pulsedValue, int nonPulsedValue) throws InterruptedException {
+ throwNoMappingElementException();
+ }
+
+ public void checkPulse(ITestAccessor accessor, CheckGroup checkGroup, int pulsedValue, int nonPulsedValue) throws InterruptedException {
+ throwNoMappingElementException();
+ }
+
+ public void checkPulse(ITestAccessor accessor, int pulsedValue, int nonPulsedValue, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ }
+
+ public void checkPulse(ITestAccessor accessor, CheckGroup checkGroup, int pulsedValue, int nonPulsedValue, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified. Assumes that both ends of the range are
+ * inclusive.
+ *
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait for the element to be within the range.
+ * @return if the check passed
+ */
+ public boolean checkRange(ITestAccessor accessor, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified. Assumes that both ends of the range are
+ * inclusive.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait for the element to be within the range.
+ * @return if the check passed
+ */
+ public boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified. Either end of the range can be set to be
+ * inclusive or not.
+ *
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive.
+ * @param milliseconds Number of milliseconds to wait for the element to be within the range.
+ * @return if the check passed
+ */
+ public boolean checkRange(ITestAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified. Either end of the range can be set to be
+ * inclusive or not.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive.
+ * @param milliseconds Number of milliseconds to wait for the element to be within the range.
+ * @return if the check passed
+ */
+ public boolean checkRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to some value other than "value" within the number of "milliseconds" passed.
+ * Passes if at any point with in the time allowed, the elment is set to a value other than "value".
+ *
+ * @param value value to test against.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ */
+ public boolean checkNot(ITestAccessor accessor, int value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to some value other than "value" within the number of "milliseconds" passed.
+ * Passes if at any point with in the time allowed, the elment is set to a value other than "value".
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param value value to test against.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ */
+ public boolean checkNot(ITestAccessor accessor, CheckGroup checkGroup, int value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value outside the range specified. Assumes that both ends of the range are
+ * inclusive.
+ *
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait for the element to be outside the range.
+ * @return if the check passed
+ */
+ public boolean checkNotRange(ITestAccessor accessor, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value outside the range specified. Assumes that both ends of the range are
+ * inclusive.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait for the element to be outside the range.
+ * @return if the check passed
+ */
+ public boolean checkNotRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value outside the range specified. Either end of the range can be set to be
+ * inclusive or not.
+ *
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+ * to the range value.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+ * to the range value.
+ * @param milliseconds Number of milliseconds to wait for the element to be outside the range.
+ * @return if the check passed
+ */
+ public boolean checkNotRange(ITestAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to a value outside the range specified. Either end of the range can be set to be
+ * inclusive or not.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+ * to the range value.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+ * to the range value.
+ * @param milliseconds Number of milliseconds to wait for the element to be outside the range.
+ * @return if the check passed
+ */
+ public boolean checkNotRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to the "value" passed for the entire time passed into "milliseconds". Returns
+ * value found that caused failure or last value observed if time expires.
+ *
+ * @return last value observed. Either value expected or value found at timeout.
+ */
+ public int checkMaintain(ITestAccessor accessor, int value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Verifies that the element is set to the "value" passed for the entire time passed into "milliseconds". Returns
+ * value found that caused failure or last value observed if time expires.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @return last value observed. Either value expected or value found at timeout.
+ */
+ public int checkMaintain(ITestAccessor accessor, CheckGroup checkGroup, int value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Verifies that the element is set to the "value" passed for the entire time passed into "milliseconds". Returns
+ * value found that caused failure or last value observed if time expires.
+ *
+ * @return last value observed
+ */
+ public int checkMaintainNot(ITestAccessor accessor, int value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Verifies that the element is set to the "value" passed for the entire time passed into "milliseconds". Returns
+ * value found that caused failure or last value observed if time expires.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @return last value observed
+ */
+ public int checkMaintainNot(ITestAccessor accessor, CheckGroup checkGroup, int value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified for the entire time specified. Assumes
+ * range is inclusive.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public int checkMaintainRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified for the entire time specified.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public int checkMaintainRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified for the entire time specified. Assumes
+ * range is inclusive.
+ *
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public int checkMaintainRange(ITestAccessor accessor, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified for the entire time specified.
+ *
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public int checkMaintainRange(ITestAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ // /**
+ // * Verifies that the element is set to a value within the range specified for the entire time
+ // specified. Assumes range is inclusive.
+ // *
+ // // * @param minValue The minimum value of the range.
+ // * @param maxValue The maximum value of the range.
+ // * @param milliseconds Number of milliseconds to wait before failing.
+ // * @return last value observed
+ // // */
+ // public int checkMaintainRange(ITestAccessor accessor, int minValue, int maxValue, int
+ // milliseconds) throws InterruptedException {
+ // return checkMaintainRange(accessor, (CheckGroup)null, minValue, true, maxValue, true,
+ // milliseconds);}
+ //
+ // /**
+ // * Verifies that the element is set to a value within the range specified for the entire time
+ // specified.
+ // *
+ // // * @param minValue The minimum value of the range.
+ // * @param minInclusive If the minumum value of the range is inclusive.
+ // * @param maxValue The maximum value of the range.
+ // * @param maxInclusive If the maximum value of the range is inclusive.
+ // * @param milliseconds Number of milliseconds to wait before failing.
+ // * @return last value observed
+ // // */
+ // public int checkMaintainRange(ITestAccessor accessor, int minValue, boolean minInclusive, int
+ // maxValue, boolean maxInclusive,
+ // int milliseconds) throws InterruptedException {
+ // return checkMaintainRangeBase(accessor, (CheckGroup)null, minValue, minInclusive, maxValue,
+ // maxInclusive, milliseconds);
+ // }
+
+ /**
+ * Verifies that the element is set to a value within the range specified for the entire time specified. Assumes
+ * range is inclusive.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public int checkMaintainNotRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Verifies that the element is set to a value within the range specified for the entire time specified.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+ * to the range value.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+ * to the range value.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public int checkMaintainNotRange(ITestAccessor accessor, CheckGroup checkGroup, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Returns the current value of the element.
+ *
+ * @return The current value of the element.
+ */
+ @Override
+ public Integer get(ITestEnvironmentAccessor accessor) {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Sets the element to the "value" passed.
+ *
+ * @param value The value to set.
+ */
+ public void set(ITestEnvironmentAccessor accessor, int value) {
+ throwNoMappingElementException();
+ }
+
+ @Override
+ public void setAndSend(ITestEnvironmentAccessor accessor, int value) {
+ throwNoMappingElementException();
+ }
+
+ /**
+ * Sets the element to the "value" passed.
+ *
+ * @param value The value to set.
+ */
+ public void setNoLog(ITestEnvironmentAccessor accessor, int value) {
+ throwNoMappingElementException();
+ }
+
+ /**
+ * Waits until the element equals the "value" passed. Returns last value observed upon a timout.
+ *
+ * @param value The expected value to wait for.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value found. Either value expected or value found at timeout.
+ */
+ public int waitForValue(ITestEnvironmentAccessor accessor, int value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Waits until the element has a value other than the "value" passed. Returns last value observed upon a timout.
+ *
+ * @param value The expected value to wait for.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ public int waitForNotValue(ITestEnvironmentAccessor accessor, int value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Waits until the element has a value within the range specified. Assumes the range is inclusive.
+ *
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ @Override
+ public int waitForRange(ITestEnvironmentAccessor accessor, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Waits until the element has a value within the range specified. Either end of the range can be inclusive or not.
+ *
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+ * to the range value.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+ * to the range value.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ @Override
+ public int waitForRange(ITestEnvironmentAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Waits until the element has a value within the range specified. Range is assumes to be inclusive.
+ *
+ * @param minValue The minimum value of the range.
+ * @param maxValue The maximum value of the range.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ @Override
+ public int waitForNotRange(ITestEnvironmentAccessor accessor, int minValue, int maxValue, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ /**
+ * Waits until the element has a value within the range specified. Either end of the range can be inclusive or not.
+ *
+ * @param minValue The minimum value of the range.
+ * @param minInclusive If the minumum value of the range is inclusive. If true the actual value must not < and not =
+ * to the range value.
+ * @param maxValue The maximum value of the range.
+ * @param maxInclusive If the maximum value of the range is inclusive. If true the actual value must not > and not =
+ * to the range value.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ @Override
+ public int waitForNotRange(ITestEnvironmentAccessor accessor, int minValue, boolean minInclusive, int maxValue, boolean maxInclusive, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ @Override
+ public void parseAndSet(ITestEnvironmentAccessor accessor, String value) throws IllegalArgumentException {
+ throwNoMappingElementException();
+ }
+
+ @Override
+ public boolean isNonMappingElement() {
+ return true;
+ }
+
+ @Override
+ public Integer getValue() {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+ @Override
+ public void setValue(Integer value) {
+ throwNoMappingElementException();
+ }
+
+ @Override
+ public Integer valueOf(MemoryResource mem) {
+ throwNoMappingElementException();
+ return 0;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingStringElement.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingStringElement.java
new file mode 100644
index 000000000..6bb5c7e84
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/elements/nonmapping/NonMappingStringElement.java
@@ -0,0 +1,169 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.elements.nonmapping;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.testPoint.CheckGroup;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.StringElement;
+import org.eclipse.osee.ote.message.interfaces.ITestAccessor;
+
+/**
+ * @author Andy Jury
+ */
+public class NonMappingStringElement extends StringElement {
+
+ /**
+ * Copy constructor.
+ */
+ public NonMappingStringElement(StringElement element) {
+ super(element.getMessage(), element.getElementName(), element.getMsgData(), element.getByteOffset(),
+ element.getMsb(), element.getLsb());
+ for (Object obj : element.getElementPath()) {
+ this.getElementPath().add(obj);
+ }
+ }
+
+ public NonMappingStringElement(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+ super(message, elementName, messageData, byteOffset, msb, lsb);
+ }
+
+ public NonMappingStringElement(Message message, String elementName, MessageData messageData, int bitOffset, int bitLength) {
+ super(message, elementName, messageData, bitOffset, bitLength);
+ }
+
+ public NonMappingStringElement(Message message, String elementName, MessageData messageData, int byteOffset, int msb, int lsb, int originalLsb, int originalMsb) {
+ super(message, elementName, messageData, byteOffset, msb, lsb, originalLsb, originalMsb);
+ }
+
+ @Override
+ public String get(ITestEnvironmentAccessor accessor) {
+ throwNoMappingElementException();
+ return null;
+ }
+
+ /**
+ * Verifies that the element is set to "value" within the number of "milliseconds" passed.
+ *
+ * @param value Expected value.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ */
+ @Override
+ public boolean checkTrimWhiteSpace(ITestAccessor accessor, String value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to "value" within the number of "milliseconds" passed.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param value Expected value.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ */
+ @Override
+ public boolean check(ITestAccessor accessor, CheckGroup checkGroup, String value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to some value other than "value" within the number of "milliseconds" passed.
+ * Passes if at any point with in the time allowed, the elment is set to a value other than "value".
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @param value value to test against.
+ * @param milliseconds Number of milliseconds to wait for the element to equal the "value".
+ * @return If the check passed.
+ */
+ @Override
+ public boolean checkNot(ITestAccessor accessor, CheckGroup checkGroup, String value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return false;
+ }
+
+ /**
+ * Verifies that the element is set to the "value" passed for the entire time passed into "milliseconds". Returns
+ * value found that caused failure or last value observed if time expires.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @return last value observed. Either value expected or value found at timeout.
+ */
+ @Override
+ public String checkMaintain(ITestAccessor accessor, CheckGroup checkGroup, String value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return "";
+ }
+
+ /**
+ * Verifies that the element is set to the "value" passed for the entire time passed into "milliseconds". Returns
+ * value found that caused failure or last value observed if time expires.
+ *
+ * @param checkGroup If this check is part of a larger set of checks which another method is going to log then the
+ * reference to the CheckGroup must be passed and this method will add the result of the check to the group with out
+ * logging a point.
+ * <p>
+ * If an outside method is not going to log the check then a <b>null </b> reference should be passed and this method
+ * will log the test point.
+ * @return last value observed
+ */
+ @Override
+ public String checkMaintainNot(ITestAccessor accessor, CheckGroup checkGroup, String value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return "";
+ }
+
+ /**
+ * Waits until the element has a value other than the "value" passed. Returns last value observed upon a timout.
+ *
+ * @param value The expected value to wait for.
+ * @param milliseconds Number of milliseconds to wait before failing.
+ * @return last value observed
+ */
+ @Override
+ public String waitForNotValue(ITestEnvironmentAccessor accessor, String value, int milliseconds) throws InterruptedException {
+ throwNoMappingElementException();
+ return "";
+ }
+
+ @Override
+ public void parseAndSet(ITestEnvironmentAccessor accessor, String value) throws IllegalArgumentException {
+ throwNoMappingElementException();
+ }
+
+ @Override
+ public void setAndSend(ITestEnvironmentAccessor accessor, String value) throws IllegalArgumentException {
+ throwNoMappingElementException();
+ }
+
+ @Override
+ public boolean isNonMappingElement() {
+ return true;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/enums/DataType.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/enums/DataType.java
new file mode 100644
index 000000000..5f9bdbbe4
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/enums/DataType.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.enums;
+
+import java.io.Serializable;
+import org.eclipse.osee.ote.message.interfaces.INamespace;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public interface DataType extends Serializable, INamespace {
+
+ String name();
+
+ int getToolingDepth();
+
+ int getToolingBufferSize();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/enums/EmptyEnum.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/enums/EmptyEnum.java
new file mode 100644
index 000000000..ae5c1821c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/enums/EmptyEnum.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.enums;
+
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import javax.print.attribute.EnumSyntax;
+import org.eclipse.osee.framework.jdk.core.util.EnumBase;
+
+/**
+ * @author Michael P. Masterson
+ */
+public class EmptyEnum extends EnumBase implements Comparable<EmptyEnum> {
+
+ private static final long serialVersionUID = 1305742348409814145L;
+ private static final HashMap<Integer, EmptyEnum> valuesMap = new HashMap<>(16);
+
+ private final int value;
+
+ private EmptyEnum(int value) {
+ super(value);
+ this.value = value;
+ }
+
+ // public static EmptyEnum getEnum(String str) {
+ // return (EmptyEnum) getEnum(str, stringTable, enumValueTable);
+ // }
+
+ public static EmptyEnum toEnum(int value) {
+ EmptyEnum newValue = valuesMap.get(value);
+ if (newValue == null) {
+ newValue = new EmptyEnum(value);
+ valuesMap.put(value, newValue);
+ }
+ return newValue;
+ }
+
+ // private static void printTable()
+ // {
+ // for( int value : valuesMap.keySet())
+ // {
+ // System.out.println(value + " -> " + valuesMap.get(value));
+ // }
+ // }
+ public static EmptyEnum toEnum(EnumBase otherEnum) {
+ return toEnum(otherEnum.getValue());
+ }
+
+ @Override
+ protected String[] getStringTable() {
+ List<String> retVal = new LinkedList<>();
+ for (EmptyEnum current : valuesMap.values()) {
+ retVal.add("EMPTY_ENUM_" + current.getValue());
+ }
+ return retVal.toArray(new String[16]);
+ }
+
+ @Override
+ protected EnumSyntax[] getEnumValueTable() {
+ EnumSyntax[] retVal = new EnumSyntax[0];
+ return valuesMap.values().toArray(retVal);
+ }
+
+ @Override
+ public String getName() {
+ return "EMPTY_ENUM_" + getValue();
+ }
+
+ @Override
+ public String toString() {
+ return getName();
+ }
+
+ @Override
+ public int getValue() {
+ return value;
+ }
+
+ @Override
+ public int compareTo(EmptyEnum o) {
+ return value - o.value;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/ADDRESS_TYPE.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/ADDRESS_TYPE.java
new file mode 100644
index 000000000..5f0a443f4
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/ADDRESS_TYPE.java
@@ -0,0 +1,83 @@
+/*
+ * PLACE_YOUR_DISTRIBUTION_STATEMENT_RIGHT_HERE
+ */
+package org.eclipse.osee.ote.message.event;
+
+import org.eclipse.osee.ote.message.elements.IEnumValue;
+
+public enum ADDRESS_TYPE implements IEnumValue<ADDRESS_TYPE> {
+
+ IPV4(0),
+ IPV6(1),
+
+ __UNDEFINED(-99999);
+
+ private int value;
+ private static int maxValue = 0;
+
+ private static ADDRESS_TYPE[] lbaValues;
+ private static ADDRESS_TYPE[] lookup = null;
+
+ static {
+ lbaValues();
+ if(maxValue < 32000){
+ lookup = new ADDRESS_TYPE[maxValue + 1];
+ for(int i = 0; i < lbaValues.length; i++){
+ lookup[lbaValues[i].value] = lbaValues[i];
+ }
+ }
+ }
+
+ private ADDRESS_TYPE(int value) {
+ this.value = value;
+ }
+
+ @Override
+ public int getIntValue(){
+ return value;
+ }
+
+ public static ADDRESS_TYPE toEnum(int value){
+ if(lookup == null){
+ for(ADDRESS_TYPE myEnum: values()){
+ if(myEnum.getIntValue() == value){
+ return myEnum;
+ }
+ }
+ __UNDEFINED.value = value;
+ return __UNDEFINED;
+ } else if(value < 0 || value >= lookup.length ){
+ __UNDEFINED.value = value;
+ return __UNDEFINED;
+ } else {
+ ADDRESS_TYPE enumeration = lookup[value];
+ if(enumeration == null){
+ __UNDEFINED.value = value;
+ return __UNDEFINED;
+ } else {
+ return enumeration;
+ }
+ }
+ }
+
+ @Override
+ public ADDRESS_TYPE getEnum(int value){
+ return toEnum(value);
+ }
+
+ public static ADDRESS_TYPE[] lbaValues(){
+ if(lbaValues == null){
+ int count = 0;
+ lbaValues = new ADDRESS_TYPE[values().length-1];
+ for(ADDRESS_TYPE myEnum: values()){
+ if(!"__UNDEFINED".equals(myEnum.name())){
+ lbaValues[count++] = myEnum;
+ if(myEnum.value > maxValue){
+ maxValue = myEnum.value;
+ }
+ }
+ }
+ }
+ return lbaValues;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/FileAvailableRequest.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/FileAvailableRequest.java
new file mode 100644
index 000000000..194e7963e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/FileAvailableRequest.java
@@ -0,0 +1,24 @@
+package org.eclipse.osee.ote.message.event;
+
+import org.eclipse.osee.ote.message.elements.StringElement;
+
+public class FileAvailableRequest extends OteEventMessage {
+ public static final int _BYTE_SIZE = 250;
+ public static final String _TOPIC = "ote/server/FileAvailableRequest";
+ public static final int _MESSAGE_ID = -1;
+
+ public final StringElement FILE;
+
+ public FileAvailableRequest() {
+ super(FileAvailableRequest.class.getSimpleName(), _TOPIC, _BYTE_SIZE);
+
+ int currentOffset = 0;
+ int bitLength;
+ FILE = new StringElement(this, "FILE", getDefaultMessageData(), currentOffset, bitLength=(8*250)); currentOffset+=bitLength;
+
+ if (currentOffset > _BYTE_SIZE*8) {
+ throw new IllegalStateException("Total size of elements exceeds defined message size");
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/FileAvailableStatus.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/FileAvailableStatus.java
new file mode 100644
index 000000000..7027b4719
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/FileAvailableStatus.java
@@ -0,0 +1,27 @@
+package org.eclipse.osee.ote.message.event;
+
+import org.eclipse.osee.ote.message.elements.BooleanElement;
+import org.eclipse.osee.ote.message.elements.StringElement;
+
+public class FileAvailableStatus extends OteEventMessage{
+ public static final int _BYTE_SIZE = 251;
+ public static final String _TOPIC = "ote/server/FileAvailableStatus";
+ public static final int _MESSAGE_ID = -1;
+
+ public final StringElement FILE;
+ public final BooleanElement EXISTS;
+
+ public FileAvailableStatus() {
+ super(FileAvailableRequest.class.getSimpleName(), _TOPIC, _BYTE_SIZE);
+
+ int currentOffset = 0;
+ int bitLength;
+ FILE = new StringElement(this, "FILE", getDefaultMessageData(), currentOffset, bitLength=(8*250)); currentOffset+=bitLength;
+ EXISTS = new BooleanElement(this, "EXISTS", getDefaultMessageData(), currentOffset, bitLength=1); currentOffset+=bitLength;
+
+ if (currentOffset > _BYTE_SIZE*8) {
+ throw new IllegalStateException("Total size of elements exceeds defined message size");
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/MyObjectInputStream.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/MyObjectInputStream.java
new file mode 100644
index 000000000..caf4936e3
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/MyObjectInputStream.java
@@ -0,0 +1,26 @@
+package org.eclipse.osee.ote.message.event;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectStreamClass;
+
+import org.eclipse.osee.framework.plugin.core.util.ExportClassLoader;
+
+public class MyObjectInputStream extends ObjectInputStream {
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Override
+ public Class resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException {
+ try {
+ return ExportClassLoader.getInstance().loadClass(desc.getName());
+ } catch (Exception e) {
+ }
+ return super.resolveClass(desc);
+ }
+
+ public MyObjectInputStream(InputStream in) throws IOException {
+ super(in);
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/OteEventMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/OteEventMessage.java
new file mode 100644
index 000000000..ede78c1da
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/OteEventMessage.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.event;
+
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.MessageSystemTestEnvironment;
+import org.eclipse.osee.ote.message.elements.ArrayElement;
+import org.eclipse.osee.ote.message.elements.EnumeratedElement;
+import org.eclipse.osee.ote.message.elements.IEnumValue;
+import org.eclipse.osee.ote.message.elements.IntegerElement;
+
+/**
+ * This class is a version of OTEByteMessage used for code that is part of the release.
+ *
+ *
+ */
+public class OteEventMessage extends Message<MessageSystemTestEnvironment, OteEventMessageData, OteEventMessage>{
+
+ private int currentOffset = 0;
+
+ private final OteEventMessageData data;
+
+ public OteEventMessage(String name, String topic, int defaultByteSize) {
+ super(name, defaultByteSize, 0, false, 0, 0);
+ data = new OteEventMessageData(this, topic, defaultByteSize);
+ setDefaultMessageData(data);
+ setMemSource(OteEventMessageType.OTE_EVENT_MESSAGE);
+ }
+
+ public OteEventMessage(byte[] bytedata) {
+ super("holder", 0, 0, false, 0, 0);
+ data = new OteEventMessageData(this, bytedata.length);
+ data.getMem().setData(bytedata);
+ setDefaultMessageData(data);
+ setMemSource(OteEventMessageType.OTE_EVENT_MESSAGE);
+ }
+
+ public OteEventMessageHeader getHeader(){
+ return getDefaultMessageData().getMsgHeader();
+ }
+
+ protected <T extends Enum<T> & IEnumValue<T>> EnumeratedElement<T> createEnumeratedElement(String name, int size, Class<T> clazz) {
+ EnumeratedElement<T> el = new EnumeratedElement<>(this, name, clazz, getDefaultMessageData(), currentOffset, 0, size*8-1);
+ currentOffset+=size;
+ return el;
+ }
+
+ protected IntegerElement createIntegerElement(String string, int size) {
+ IntegerElement el = new IntegerElement(this, string, getDefaultMessageData(), currentOffset, 0, size*8-1);
+ currentOffset+=size;
+ return el;
+ }
+
+ protected ArrayElement createArrayElement(String string, int size) {
+ ArrayElement el = new ArrayElement(this, string, getDefaultMessageData(), currentOffset, 0, size*8-1);
+ currentOffset+=size;
+ return el;
+ }
+
+ public static int sizeBytesBits(int size){
+ return 8*size-1;
+ }
+
+ public void setResponse(OteEventMessage msg){
+ getHeader().RESPONSE_ID.setValue(msg.getHeader().MESSAGE_SEQUENCE_NUMBER.getValue());
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/OteEventMessageData.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/OteEventMessageData.java
new file mode 100644
index 000000000..3f4497514
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/OteEventMessageData.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.event;
+
+import org.eclipse.osee.ote.message.data.IMessageDataVisitor;
+import org.eclipse.osee.ote.message.data.MessageData;
+
+
+public class OteEventMessageData extends MessageData{
+
+ private final OteEventMessageHeader header;
+
+ public OteEventMessageData(OteEventMessage msg, String topic, int dataByteSize) {
+ super(msg.getName(), OteEventMessageHeader.HEADER_SIZE + dataByteSize, OteEventMessageHeader.HEADER_SIZE, OteEventMessageType.OTE_EVENT_MESSAGE);
+ this.header = new OteEventMessageHeader(msg, topic, 0, getMem().slice(0, OteEventMessageHeader.HEADER_SIZE));
+ }
+
+ public OteEventMessageData(OteEventMessage msg, int dataByteSize) {
+ super("default", OteEventMessageHeader.HEADER_SIZE + dataByteSize, OteEventMessageHeader.HEADER_SIZE, OteEventMessageType.OTE_EVENT_MESSAGE);
+ this.header = new OteEventMessageHeader(msg, "", 0, getMem().slice(0, OteEventMessageHeader.HEADER_SIZE));
+ }
+
+@Override
+ public OteEventMessageHeader getMsgHeader() {
+ return header;
+ }
+
+ @Override
+ public void initializeDefaultHeaderValues() {
+ }
+
+ @Override
+ public int getPayloadSize() {
+ return super.getDefaultDataByteSize() - OteEventMessageHeader.HEADER_SIZE;
+ }
+
+ @Override
+ public void visit(IMessageDataVisitor visitor) {
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/OteEventMessageHeader.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/OteEventMessageHeader.java
new file mode 100644
index 000000000..cdfc4480e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/OteEventMessageHeader.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.event;
+
+import java.net.InetSocketAddress;
+import java.net.UnknownHostException;
+
+import org.eclipse.osee.ote.message.IMessageHeader;
+import org.eclipse.osee.ote.message.data.HeaderData;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.elements.Element;
+import org.eclipse.osee.ote.message.elements.IntegerElement;
+import org.eclipse.osee.ote.message.elements.LongIntegerElement;
+import org.eclipse.osee.ote.message.elements.StringElement;
+
+public class OteEventMessageHeader implements IMessageHeader{
+
+ public static final int HEADER_SIZE = 164+53;
+ public static final int MARKER_VALUE = 0xFADE;
+ private final HeaderData headerData;
+ private final Object[] paths;
+
+ public final IntegerElement MARKER;
+ public final StringElement TOPIC;
+ public final IntegerElement MESSAGE_ID;
+ public final IntegerElement MESSAGE_SEQUENCE_NUMBER;
+ public final LongIntegerElement UUID_LOW;
+ public final LongIntegerElement UUID_HIGH;
+ public final IntegerElement TTL;
+ public final StringElement RESPONSE_TOPIC;
+ public final IntegerElement RESPONSE_ID;
+ public final SOCKET_ADDRESS_RECORD ADDRESS;
+
+ private final String name;
+
+ public OteEventMessageHeader(OteEventMessage msg, String topic, int messageId, MemoryResource data) {
+ this.name = msg.getName();
+ headerData = new HeaderData("OteEventMessageHeader", data);
+ paths = new Object[]{(msg == null ? "message" : msg.getClass().getName()), "HEADER(OteEventMessageHeader)"};
+ MARKER = new IntegerElement(msg, "MARKER", headerData, 0, 0, 15);
+ TOPIC = new StringElement(msg, "TOPIC", headerData, 2, 0, 8*96);
+ MESSAGE_ID = new IntegerElement(msg, "MESSAGE_ID", headerData, 66+32, 0, 31);
+ MESSAGE_SEQUENCE_NUMBER = new IntegerElement(msg, "MESSAGE_ID", headerData, 66+32, 0, 31);
+ UUID_LOW = new LongIntegerElement(msg, "UUID_LOW", headerData, 74+32, 0, 63);
+ UUID_HIGH = new LongIntegerElement(msg, "UUID_HIGH", headerData, 82+32, 0, 63);
+ TTL = new IntegerElement(msg, "TTL", headerData, 90+32, 0, 31);
+ RESPONSE_TOPIC = new StringElement(msg, "TOPIC", headerData, 94+32, 0, 8*64);
+ RESPONSE_ID = new IntegerElement(msg, "RESPONSE_ID", headerData, 158+32, 0, 31);
+ ADDRESS = new SOCKET_ADDRESS_RECORD(msg, "ADDRESS", headerData, 164+32, 0, SOCKET_ADDRESS_RECORD.SIZE*8-1);
+
+ TOPIC.setValue(topic);
+ MARKER.setValue(MARKER_VALUE);
+ MESSAGE_ID.setValue(messageId);
+ addElement(MARKER);
+ addElement(TOPIC);
+ addElement(MESSAGE_ID);
+ }
+
+ private <T extends Element> T addElement(T instance) {
+ instance.addPath(paths);
+ return instance;
+ }
+
+ @Override
+ public int getHeaderSize() {
+ return HEADER_SIZE;
+ }
+
+ @Override
+ public byte[] getData() {
+ return headerData.toByteArray();
+ }
+
+ @Override
+ public Element[] getElements() {
+ return new Element[]{MARKER, TOPIC};
+ }
+
+ @Override
+ public void setNewBackingBuffer(byte[] data) {
+ headerData.setNewBackingBuffer(data);
+ }
+
+ @Override
+ public String toXml() {
+ StringBuilder builder = new StringBuilder(256);
+ builder.append("<OteEventMessageHeader> ").
+ append("MARKER=\"").append(MARKER.getValue()).append("\" ").
+ append("TOPIC=\"").append(TOPIC.getValue()).append("\" ").
+ append("MESSAGE_ID=\"").append(MESSAGE_ID.getValue()).append("\" ").
+ append("</OteEventMessageHeader>");
+ return builder.toString();
+ }
+
+ @Override
+ public String getMessageName() {
+ return name;
+ }
+
+ public InetSocketAddress getSourceInetSocketAddress() throws UnknownHostException {
+ return new InetSocketAddress(ADDRESS.getAddress(), ADDRESS.getPort());
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/OteEventMessageType.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/OteEventMessageType.java
new file mode 100644
index 000000000..496a85a4f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/OteEventMessageType.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.event;
+
+import org.eclipse.osee.ote.message.enums.DataType;
+
+public enum OteEventMessageType implements DataType {
+ OTE_EVENT_MESSAGE(2, 2048);
+
+ private final int depth;
+ private final int bufferSize;
+
+ private OteEventMessageType(int depth, int bufferSize) {
+ this.depth = depth;
+ this.bufferSize = bufferSize;
+ }
+
+ @Override
+ public int getToolingBufferSize() {
+ return bufferSize;
+ }
+
+ @Override
+ public int getToolingDepth() {
+ return depth;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/OteEventMessageUtil.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/OteEventMessageUtil.java
new file mode 100644
index 000000000..f3e921371
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/OteEventMessageUtil.java
@@ -0,0 +1,149 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.event;
+
+import java.util.Dictionary;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Map;
+import java.util.UUID;
+
+import org.eclipse.osee.ote.core.ServiceUtility;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpointSender;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+import org.osgi.service.event.EventHandler;
+
+public class OteEventMessageUtil {
+
+ public final static String BYTE_KEY = "oteeventbytes";
+
+ public final static String BYTE_KEY_2 = "bytes";
+
+ private static EventAdmin eventAdmin;
+
+ private static EventAdmin getEventAdmin(){
+ if(eventAdmin == null){
+ eventAdmin = ServiceUtility.getService(EventAdmin.class);
+ }
+ return eventAdmin;
+ }
+
+ public static void sendEvent(OteEventMessage message) {
+ sendEvent(message, getEventAdmin());
+ }
+
+ public static void postEvent(OteEventMessage message) {
+ postEvent(message, getEventAdmin());
+ }
+
+ public static void sendEvent(OteEventMessage message, EventAdmin eventAdmin) {
+ message.getHeader().UUID_HIGH.setNoLog((long) 0x0);
+ message.getHeader().UUID_LOW.setNoLog((long) 0x0);
+ Map<String, Object> data = new HashMap<>();
+ data.put(BYTE_KEY, message.getData());
+ Event newevent = new Event(message.getHeader().TOPIC.getValue(), data);
+ eventAdmin.sendEvent(newevent);
+ }
+
+ public static void postEvent(OteEventMessage message, EventAdmin eventAdmin) {
+ message.getHeader().UUID_HIGH.setNoLog((long) 0x0);
+ message.getHeader().UUID_LOW.setNoLog((long) 0x0);
+ Map<String, Object> data = new HashMap<>();
+ data.put(BYTE_KEY, message.getData());
+ Event newevent = new Event(message.getHeader().TOPIC.getValue(), data);
+ eventAdmin.postEvent(newevent);
+ }
+
+ public static void sendEvent(OteEventMessage message, OteUdpEndpointSender sender) throws InterruptedException {
+ sender.send(message);
+ }
+
+ public static void postEvent(OteEventMessage message, OteUdpEndpointSender sender) throws InterruptedException {
+ sender.send(message);
+ }
+
+ public static UUID getUUID(OteEventMessage msg) {
+ return new UUID(msg.getHeader().UUID_HIGH.getValue(), msg.getHeader().UUID_LOW.getValue());
+ }
+
+ public static UUID getUUID(byte[] data) {
+ long low = getLong(data, 74);
+ long high = getLong(data, 82);
+ return new UUID(high, low);
+ }
+
+ private static long getLong(byte[] data, int index){
+ return
+ (long)(0xff & data[index]) << 56 |
+ (long)(0xff & data[index+1]) << 48 |
+ (long)(0xff & data[index+2]) << 40 |
+ (long)(0xff & data[index+3]) << 32 |
+ (long)(0xff & data[index+4]) << 24 |
+ (long)(0xff & data[index+5]) << 16 |
+ (long)(0xff & data[index+6]) << 8 |
+ (long)(0xff & data[index+7]) << 0;
+ }
+
+ public static void setUUID(OteEventMessage msg, UUID id) {
+ msg.getHeader().UUID_HIGH.setValue(id.getMostSignificantBits());
+ msg.getHeader().UUID_LOW.setValue(id.getLeastSignificantBits());
+ }
+
+ public static OteEventMessage getOteEventMessage(Event event) {
+ Object obj = event.getProperty(BYTE_KEY);
+ if (obj != null && obj instanceof byte[]) {
+ return new OteEventMessage((byte[]) obj);
+ } else {
+ obj = event.getProperty(BYTE_KEY_2);
+ if(obj != null && obj instanceof byte[]){
+ return new OteEventMessage((byte[]) obj);
+ }
+ }
+ return null;
+ }
+
+ public static byte[] getBytes(Event event) {
+ Object obj = event.getProperty(BYTE_KEY);
+ if (obj != null && obj instanceof byte[]) {
+ return (byte[]) obj;
+ } else {
+ obj = event.getProperty(BYTE_KEY_2);
+ if (obj != null && obj instanceof byte[]) {
+ return (byte[]) obj;
+ }
+ return null;
+ }
+ }
+
+ public static void putBytes(Event event, OteEventMessage signal) {
+ signal.getDefaultMessageData().getMem().setData(getBytes(event));
+ }
+
+ public static ServiceRegistration<EventHandler> subscribe(String topic, EventHandler handler){
+ Dictionary<String, String> props = new Hashtable<>();
+ props.put("event.topics", topic);
+ return ServiceUtility.getContext().registerService(EventHandler.class, handler, props);
+ }
+
+ public static ServiceRegistration<EventHandler> subscribe(OteEventMessage signal, EventHandler eventHandler) {
+ BundleContext context = ServiceUtility.getContext();
+ if (context == null) {
+ return null;
+ }
+ Hashtable<String, Object> props = new Hashtable<>();
+ props.put("event.topics", signal.getHeader().TOPIC.getValue());
+ return context.registerService(EventHandler.class, eventHandler, props);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/SOCKET_ADDRESS_RECORD.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/SOCKET_ADDRESS_RECORD.java
new file mode 100644
index 000000000..bd3d88aae
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/SOCKET_ADDRESS_RECORD.java
@@ -0,0 +1,67 @@
+package org.eclipse.osee.ote.message.event;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.ArrayElement;
+import org.eclipse.osee.ote.message.elements.EnumeratedElement;
+import org.eclipse.osee.ote.message.elements.IntegerElement;
+
+public class SOCKET_ADDRESS_RECORD extends ArrayElement{
+
+ public static final int SIZE = 21;
+
+ private final EnumeratedElement<ADDRESS_TYPE> type;
+ private final ArrayElement ipaddress;
+ private final IntegerElement port;
+
+ public SOCKET_ADDRESS_RECORD(Message msg, String elementName, MessageData messageData, int byteOffset, int msb, int lsb) {
+ super(msg, elementName, messageData, byteOffset, msb, lsb);
+
+ type = new EnumeratedElement<>(msg, "type", ADDRESS_TYPE.class, messageData, byteOffset, 0, 7);
+ ipaddress = new ArrayElement(msg, "ipaddress", messageData, byteOffset + 1, 0, 8*16-1);
+ port = new IntegerElement(msg, "port", messageData, ipaddress.getByteOffset() + 16, 0, 31);
+ }
+
+ public void setAddress(InetAddress address){
+ byte[] bytes = address.getAddress();
+
+ if(bytes.length == 4){
+ type.setValue(ADDRESS_TYPE.IPV4);
+ } else {
+ type.setValue(ADDRESS_TYPE.IPV6);
+ }
+
+ ipaddress.zeroize();
+ for(int i = 0; i < bytes.length; i++){
+ ipaddress.setValue(i, bytes[i]);
+ }
+ }
+
+ public InetAddress getAddress() throws UnknownHostException{
+ byte[] bytes = null;
+ if(type.getValue() == ADDRESS_TYPE.IPV4){
+ bytes = new byte[4];
+ for(int i = 0; i < 4; i++){
+ bytes[i] = ipaddress.getValue(i);
+ }
+ } else {
+ bytes = new byte[16];
+ for(int i = 0; i < 6; i++){
+ bytes[i] = ipaddress.getValue(i);
+ }
+ }
+ return InetAddress.getByAddress(bytes);
+ }
+
+ public int getPort(){
+ return port.getValue();
+ }
+
+ public void setPort(int port){
+ this.port.setValue(port);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/SerializedClassMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/SerializedClassMessage.java
new file mode 100644
index 000000000..eda416661
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/SerializedClassMessage.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.event;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.util.zip.GZIPInputStream;
+import java.util.zip.GZIPOutputStream;
+
+import org.eclipse.osee.ote.message.elements.ArrayElement;
+
+public class SerializedClassMessage<T> extends OteEventMessage {
+
+ public static final int _BYTE_SIZE = 0;
+
+ public ArrayElement OBJECT;
+
+ public SerializedClassMessage(String topic) {
+ super(SerializedClassMessage.class.getSimpleName(), topic, _BYTE_SIZE);
+ OBJECT = new ArrayElement(this, "CLAZZ", getDefaultMessageData(), 0, 0, 0);
+ addElements(OBJECT);
+ }
+
+
+ public SerializedClassMessage(String topic, Serializable object) throws IOException {
+ this(topic);
+ setObject(object);
+ }
+
+ public SerializedClassMessage(byte[] bytes) {
+ super(bytes);
+ OBJECT = new ArrayElement(this, "CLAZZ", getDefaultMessageData(), 0, 0, 0);
+ addElements(OBJECT);
+ }
+
+ public void setObject(Serializable obj) throws IOException{
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ GZIPOutputStream gos = new GZIPOutputStream(bos);
+ ObjectOutputStream oos = new ObjectOutputStream(gos);
+ oos.writeObject(obj);
+ oos.close();
+ byte[] data = bos.toByteArray();
+ int offset = OBJECT.getByteOffset() + getHeaderSize();
+ byte[] newData = new byte[data.length + offset];
+ System.arraycopy(getData(), 0, newData, 0, offset);
+ System.arraycopy(data, 0, newData, offset, data.length);
+ getDefaultMessageData().setNewBackingBuffer(newData);
+ }
+
+ @SuppressWarnings("unchecked")
+ public T getObject() throws IOException, ClassNotFoundException{
+ int offset = OBJECT.getByteOffset() + getHeaderSize();
+ ByteArrayInputStream bis = new ByteArrayInputStream(getData(), offset, getData().length - offset);
+ GZIPInputStream gis = new GZIPInputStream(bis);
+ MyObjectInputStream ois = new MyObjectInputStream(gis);
+ try{
+ Object obj = ois.readObject();
+ return (T)obj;
+ } finally {
+ ois.close();
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/send/OteEndpointSendEventMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/send/OteEndpointSendEventMessage.java
new file mode 100644
index 000000000..cb12d805d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/send/OteEndpointSendEventMessage.java
@@ -0,0 +1,228 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.event.send;
+
+import java.net.InetSocketAddress;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+import org.eclipse.osee.ote.OTEException;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpoint;
+import org.eclipse.osee.ote.internal.message.event.send.NotifyOnResponse;
+import org.eclipse.osee.ote.internal.message.event.send.OteEventMessageFutureImpl;
+import org.eclipse.osee.ote.internal.message.event.send.OteEventMessageFutureMultipleResponseImpl;
+import org.eclipse.osee.ote.internal.message.event.send.OteEventMessageResponseFutureImpl;
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+
+public class OteEndpointSendEventMessage {
+
+ private final OteUdpEndpoint endpoint;
+ private final Lock lock;
+ private final Condition responseReceived;
+ private final InetSocketAddress destination;
+
+ public OteEndpointSendEventMessage(OteUdpEndpoint eventAdmin, InetSocketAddress destination){
+ this.endpoint = eventAdmin;
+ this.destination = destination;
+ lock = new ReentrantLock();
+ responseReceived = lock.newCondition();
+ }
+
+ /**
+ * sends a message and returns immediately
+ */
+ public void asynchSend(OteEventMessage message) {
+ updateHeaderInfo(message);
+ endpoint.getOteEndpointThreadedSender(destination).send(message);
+ }
+
+ /**
+ * Registers for a callback of the given message type as specified by the RESPONSE_TOPIC element in the sent message
+ * and the class type passed in, then sends the given message and returns immediately. The returned value can be used to
+ * wait for the response using waitForCompletion(). The callback expects you to handle both the response and the timeout case.
+ *
+ * @param clazz - Type of OteEventMessage for the response
+ * @param message - message to send
+ * @param callable - callback executed when the response is recieved or if a timeout occurs or called immediately after the send if
+ * no response is expected
+ * @param timeout - amount of time in milliseconds to wait for response before calling timeout on the passed in OteEventMessageCallable
+ * @return <T extends OteEventMessage> Future<T> - a future that contains the response message
+ */
+ public <T extends OteEventMessage, R extends OteEventMessage> OteEventMessageFuture<T, R> asynchSendAndResponse(Class<R> clazz, T message, OteEventMessageCallable<T, R> callable, long timeout){
+ int responseId = updateHeaderInfo(message);
+ String responseTopic = message.getHeader().RESPONSE_TOPIC.getValue();
+ OteEventMessageFutureImpl<T, R> response = new OteEventMessageFutureImpl<>(clazz, callable, message, responseTopic, responseId, timeout);
+ endpoint.getOteEndpointThreadedSender(destination).send(message);
+ return response;
+ }
+
+ /**
+ * Registers for a callback of the given message type as specified by the RESPONSE_TOPIC element in the sent message
+ * and the class type passed in, then sends the given message and returns immediately. The returned value can be used to
+ * wait for the response using waitForCompletion(). The callback expects you to handle both the response and the timeout case and to determine
+ * when the appropriate number of responses has been received, by specifying it is complete.
+ *
+ * @param clazz - Type of OteEventMessage for the response
+ * @param message - message to send
+ * @param callable - callback executed when the response is recieved or if a timeout occurs or called immediately after the send if
+ * no response is expected
+ * @param timeout - amount of time in milliseconds to wait for response before calling timeout on the passed in OteEventMessageCallable
+ * @return <T extends OteEventMessage> Future<T> - a future that contains the response message
+ */
+ public <T extends OteEventMessage, R extends OteEventMessage> OteEventMessageFuture<T, R> asynchSendAndMultipleResponse(Class<R> clazz, T message, OteEventMessageCallable<T, R> callable, long timeout){
+ int responseId = updateHeaderInfo(message);
+ String responseTopic = message.getHeader().RESPONSE_TOPIC.getValue();
+ OteEventMessageFutureImpl<T, R> response = new OteEventMessageFutureMultipleResponseImpl<>(clazz, callable, message, responseTopic, responseId, timeout);
+ endpoint.getOteEndpointThreadedSender(destination).send(message);
+ return response;
+ }
+
+ /**
+ * Registers for a callback of the given message type and topic.
+ *
+ * @param clazz - Type of OteEventMessage for the response
+ * @param callable - callback executed when the response is recieved
+ * @return a future that you should cancel when done listening so resources can be cleaned up.
+ */
+ public <R extends OteEventMessage> OteEventMessageResponseFuture<R> asynchResponse(Class<R> clazz, String topic, OteEventMessageResponseCallable<R> callable){
+ OteEventMessageResponseFutureImpl<R> response = new OteEventMessageResponseFutureImpl<>(clazz, callable, topic);
+ return response;
+ }
+
+ /**
+ * Sends a message and waits for a response.
+ *
+ * @param class - return type
+ * @param message - message to send
+ * @param timeout - timeout in milliseconds
+ * @return <T extends OteEventMessage> T - NULL if the timeout occurs before a response, otherwise returns the
+ * message specified by the RESPONSE_TOPIC field in the passed in message header.
+ * @throws Exception
+ */
+ public <T extends OteEventMessage> T synchSendAndResponse(Class<T> clazz, String responseTopic, OteEventMessage message, long timeout) throws OTEException {
+ lock.lock();
+ try{
+ int responseId = updateHeaderInfo(message);
+ message.getHeader().RESPONSE_TOPIC.setValue(responseTopic);
+ NotifyOnResponse<T> response = new NotifyOnResponse<>(clazz, responseTopic, responseId, lock, responseReceived);
+ try{
+ endpoint.getOteEndpointThreadedSender(destination).send(message);
+ long nanos = TimeUnit.MILLISECONDS.toNanos(timeout);
+ while(nanos > 0 && !response.hasResponse()) {
+ try {
+ nanos = responseReceived.awaitNanos(nanos);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ } finally {
+ response.dispose();
+ }
+ return response.getMessage();
+ } finally {
+ lock.unlock();
+ }
+ }
+
+ /**
+ * Sends a message and waits for a response.
+ *
+ * @param T - response Message to populate type
+ * @param message - message to send
+ * @param timeout - timeout in milliseconds
+ * @return <T extends OteEventMessage> T - NULL if the timeout occurs before a response, otherwise returns the
+ * message specified by the RESPONSE_TOPIC field in the passed in message header.
+ * @throws Exception
+ */
+ public <T extends OteEventMessage> T synchSendAndResponse(T responseMessage, OteEventMessage sendMessage, long timeout) throws OTEException {
+ lock.lock();
+ try{
+ int responseId = updateHeaderInfo(sendMessage);
+ sendMessage.getHeader().RESPONSE_TOPIC.setValue(responseMessage.getHeader().TOPIC.getValue());
+ NotifyOnResponse<T> response = new NotifyOnResponse<>(responseMessage, responseId, lock, responseReceived);
+ try{
+ endpoint.getOteEndpointThreadedSender(destination).send(sendMessage);
+ long nanos = TimeUnit.MILLISECONDS.toNanos(timeout);
+ while(nanos > 0 && !response.hasResponse()) {
+ try {
+ nanos = responseReceived.awaitNanos(nanos);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ } finally {
+ response.dispose();
+ }
+ return response.getMessage();
+ } finally {
+ lock.unlock();
+ }
+ }
+
+
+ /**
+ * Increment the sequence number and set the source InetSocketAddress
+ *
+ * @param message
+ * @return returns the sequence number that was set
+ */
+ private int updateHeaderInfo(OteEventMessage message){
+ int responseId = message.getHeader().MESSAGE_SEQUENCE_NUMBER.getValue();
+ if(responseId >= Integer.MAX_VALUE){
+ responseId = 1;
+ } else {
+ responseId++;
+ }
+ message.getHeader().MESSAGE_SEQUENCE_NUMBER.setValue(responseId);
+
+ message.getHeader().ADDRESS.setAddress(endpoint.getLocalEndpoint().getAddress());
+ message.getHeader().ADDRESS.setPort(endpoint.getLocalEndpoint().getPort());
+ return responseId;
+ }
+
+ /**
+ * Sends a message and waits for a response without creating a sender thread
+ *
+ * @param T - response Message to populate type
+ * @param message - message to send
+ * @param timeout - timeout in milliseconds
+ * @return <T extends OteEventMessage> T - NULL if the timeout occurs before a response, otherwise returns the
+ * message specified by the RESPONSE_TOPIC field in the passed in message header.
+ * @throws Exception
+ */
+ public <T extends OteEventMessage> T synchSendAndResponseInline(T responseMessage, OteEventMessage sendMessage, long timeout) {
+ lock.lock();
+ try{
+ int responseId = updateHeaderInfo(sendMessage);
+ sendMessage.getHeader().RESPONSE_TOPIC.setValue(responseMessage.getHeader().TOPIC.getValue());
+ NotifyOnResponse<T> response = new NotifyOnResponse<>(responseMessage, responseId, lock, responseReceived);
+ try{
+ endpoint.getOteEndpointInlineSender(destination).send(sendMessage);
+ long nanos = TimeUnit.MILLISECONDS.toNanos(timeout);
+ while(nanos > 0 && !response.hasResponse()) {
+ try {
+ nanos = responseReceived.awaitNanos(nanos);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ } finally {
+ response.dispose();
+ }
+ return response.getMessage();
+ } finally {
+ lock.unlock();
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/send/OteEventMessageCallable.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/send/OteEventMessageCallable.java
new file mode 100644
index 000000000..fc9a2b889
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/send/OteEventMessageCallable.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.event.send;
+
+public interface OteEventMessageCallable<T,R> {
+
+ void timeout(T transmitted);
+
+ void call(T transmitted, R recieved, OteEventMessageFuture<?, ?> future);
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/send/OteEventMessageFuture.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/send/OteEventMessageFuture.java
new file mode 100644
index 000000000..6b7a461d2
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/send/OteEventMessageFuture.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.event.send;
+
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+
+
+
+public interface OteEventMessageFuture<T extends OteEventMessage, R extends OteEventMessage> {
+
+ void cancel();
+
+ void waitForCompletion();
+
+ public boolean isDone();
+
+ public boolean isTimedOut();
+
+ public boolean gotResponse();
+
+ void complete();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/send/OteEventMessageResponseCallable.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/send/OteEventMessageResponseCallable.java
new file mode 100644
index 000000000..6c14cd0cf
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/send/OteEventMessageResponseCallable.java
@@ -0,0 +1,17 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.event.send;
+
+public interface OteEventMessageResponseCallable<R> {
+
+ void call(R received);
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/send/OteEventMessageResponseFuture.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/send/OteEventMessageResponseFuture.java
new file mode 100644
index 000000000..5467847da
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/send/OteEventMessageResponseFuture.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.event.send;
+
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+
+public interface OteEventMessageResponseFuture<R extends OteEventMessage> {
+
+ void cancel();
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/send/OteSendEventMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/send/OteSendEventMessage.java
new file mode 100644
index 000000000..5a834ebb9
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/event/send/OteSendEventMessage.java
@@ -0,0 +1,161 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.event.send;
+
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+import org.eclipse.osee.ote.OTEException;
+import org.eclipse.osee.ote.internal.message.event.send.NotifyOnResponse;
+import org.eclipse.osee.ote.internal.message.event.send.OteEventMessageFutureImpl;
+import org.eclipse.osee.ote.internal.message.event.send.OteEventMessageResponseFutureImpl;
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.osgi.service.event.EventAdmin;
+
+public class OteSendEventMessage {
+
+ private final EventAdmin eventAdmin;
+ private final Lock lock;
+ private final Condition responseReceived;
+
+ public OteSendEventMessage(EventAdmin eventAdmin){
+ this.eventAdmin = eventAdmin;
+ lock = new ReentrantLock();
+ responseReceived = lock.newCondition();
+ }
+
+ /**
+ * sends a message and returns immediately
+ */
+ public void asynchSend(OteEventMessage message) {
+ incrementSequenceNumber(message);
+ OteEventMessageUtil.postEvent(message, eventAdmin);
+ }
+
+ /**
+ * Registers for a callback of the given message type as specified by the RESPONSE_TOPIC element in the sent message
+ * and the class type passed in, then sends the given message and returns immediately. The returned value can be used to
+ * wait for the response using waitForCompletion(). The callback expects you to handle both the response and the timeout case.
+ *
+ * @param clazz - Type of OteEventMessage for the response
+ * @param message - message to send
+ * @param callable - callback executed when the response is recieved or if a timeout occurs or called immediately after the send if
+ * no response is expected
+ * @param timeout - amount of time in milliseconds to wait for response before calling timeout on the passed in OteEventMessageCallable
+ * @return <T extends OteEventMessage> Future<T> - a future that contains the response message
+ */
+ public <T extends OteEventMessage, R extends OteEventMessage> OteEventMessageFuture<T, R> asynchSendAndResponse(Class<R> clazz, T message, OteEventMessageCallable<T, R> callable, long timeout){
+ int responseId = incrementSequenceNumber(message);
+ String responseTopic = message.getHeader().RESPONSE_TOPIC.getValue();
+ OteEventMessageFutureImpl<T, R> response = new OteEventMessageFutureImpl<>(clazz, callable, message, responseTopic, responseId, timeout);
+ OteEventMessageUtil.postEvent(message, eventAdmin);
+ return response;
+ }
+
+ /**
+ * Registers for a callback of the given message type and topic.
+ *
+ * @param clazz - Type of OteEventMessage for the response
+ * @param callable - callback executed when the response is recieved
+ * @return a future that you should cancel when done listening so resources can be cleaned up.
+ */
+ public <R extends OteEventMessage> OteEventMessageResponseFuture<R> asynchResponse(Class<R> clazz, String topic, OteEventMessageResponseCallable<R> callable){
+ OteEventMessageResponseFutureImpl<R> response = new OteEventMessageResponseFutureImpl<>(clazz, callable, topic);
+ return response;
+ }
+
+ /**
+ * Sends a message and waits for a response.
+ *
+ * @param class - return type
+ * @param message - message to send
+ * @param timeout - timeout in milliseconds
+ * @return <T extends OteEventMessage> T - NULL if the timeout occurs before a response, otherwise returns the
+ * message specified by the RESPONSE_TOPIC field in the passed in message header.
+ * @throws Exception
+ */
+ public <T extends OteEventMessage> T synchSendAndResponse(Class<T> clazz, String responseTopic, OteEventMessage message, long timeout) throws OTEException {
+ lock.lock();
+ try{
+ int responseId = incrementSequenceNumber(message);
+ message.getHeader().RESPONSE_TOPIC.setValue(responseTopic);
+ NotifyOnResponse<T> response = new NotifyOnResponse<>(clazz, responseTopic, responseId, lock, responseReceived);
+ try{
+ OteEventMessageUtil.postEvent(message, eventAdmin);
+ long nanos = TimeUnit.MILLISECONDS.toNanos(timeout);
+ while(nanos > 0 && !response.hasResponse()) {
+ try {
+ nanos = responseReceived.awaitNanos(nanos);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ } finally {
+ response.dispose();
+ }
+ return response.getMessage();
+ } finally {
+ lock.unlock();
+ }
+ }
+
+ /**
+ * Sends a message and waits for a response.
+ *
+ * @param T - response Message to populate type
+ * @param message - message to send
+ * @param timeout - timeout in milliseconds
+ * @return <T extends OteEventMessage> T - NULL if the timeout occurs before a response, otherwise returns the
+ * message specified by the RESPONSE_TOPIC field in the passed in message header.
+ * @throws Exception
+ */
+ public <T extends OteEventMessage> T synchSendAndResponse(T responseMessage, OteEventMessage sendMessage, long timeout) throws OTEException {
+ lock.lock();
+ try{
+ int responseId = incrementSequenceNumber(sendMessage);
+ sendMessage.getHeader().RESPONSE_TOPIC.setValue(responseMessage.getHeader().TOPIC.getValue());
+ NotifyOnResponse<T> response = new NotifyOnResponse<>(responseMessage, responseId, lock, responseReceived);
+ try{
+ OteEventMessageUtil.postEvent(sendMessage, eventAdmin);
+ long nanos = TimeUnit.MILLISECONDS.toNanos(timeout);
+ while(nanos > 0 && !response.hasResponse()) {
+ try {
+ nanos = responseReceived.awaitNanos(nanos);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ } finally {
+ response.dispose();
+ }
+ return response.getMessage();
+ } finally {
+ lock.unlock();
+ }
+ }
+
+
+
+ private int incrementSequenceNumber(OteEventMessage message){
+ int responseId = message.getHeader().MESSAGE_SEQUENCE_NUMBER.getValue();
+ if(responseId >= Integer.MAX_VALUE){
+ responseId = 1;
+ } else {
+ responseId++;
+ }
+ message.getHeader().MESSAGE_SEQUENCE_NUMBER.setValue(responseId);
+ return responseId;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/instrumentation/BaseIOInstrumentation.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/instrumentation/BaseIOInstrumentation.java
new file mode 100644
index 000000000..a40a41942
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/instrumentation/BaseIOInstrumentation.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.instrumentation;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.nio.ByteBuffer;
+import java.nio.channels.DatagramChannel;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.message.MessageSystemTestEnvironment;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class BaseIOInstrumentation implements IOInstrumentation {
+
+ private final List<InetSocketAddress> addresses;
+ private final DatagramChannel channel;
+
+ public BaseIOInstrumentation() throws IOException {
+ addresses = new ArrayList<>();
+ channel = DatagramChannel.open();
+ channel.configureBlocking(true);
+
+ }
+
+ @Override
+ public void command(byte[] cmd) {
+ }
+
+ @Override
+ public void register(InetSocketAddress address) {
+ if (address == null) {
+ throw new IllegalArgumentException("address cannot be null");
+ }
+ addresses.add(address);
+ }
+
+ @Override
+ public void unregister(InetSocketAddress address) {
+ addresses.remove(address);
+ }
+
+ public void send(byte[] bytes) {
+ send(ByteBuffer.wrap(bytes));
+ }
+
+ public void send(byte[] bytes, int offset, int length) {
+ send(ByteBuffer.wrap(bytes, offset, length));
+ }
+
+ public void send(ByteBuffer bytes) {
+ bytes.mark();
+ int size = addresses.size();
+ for (int i = 0; i < size; i++) {
+ try {
+ channel.send(bytes, addresses.get(i));
+ bytes.reset();
+ } catch (Exception ex) {
+ OseeLog.log(MessageSystemTestEnvironment.class, Level.SEVERE, ex.toString(), ex);
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/instrumentation/IOInstrumentation.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/instrumentation/IOInstrumentation.java
new file mode 100644
index 000000000..ed0f72f44
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/instrumentation/IOInstrumentation.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.instrumentation;
+
+import java.net.InetSocketAddress;
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IOInstrumentation extends Remote {
+
+ void register(InetSocketAddress address) throws RemoteException;
+
+ void command(byte[] cmd) throws RemoteException;
+
+ void unregister(InetSocketAddress address) throws RemoteException;
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IMessageManager.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IMessageManager.java
new file mode 100644
index 000000000..2ad899cbe
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IMessageManager.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.interfaces;
+
+import java.util.Collection;
+import org.eclipse.osee.ote.core.TestException;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.enums.DataType;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IMessageManager<T extends MessageData, U extends Message<? extends ITestEnvironmentMessageSystemAccessor, T, U>> {
+ void destroy();
+
+ <CLASSTYPE extends U> CLASSTYPE createMessage(Class<CLASSTYPE> messageClass) throws TestException;
+
+ <CLASSTYPE extends U> int getReferenceCount(CLASSTYPE classtype);
+
+ <CLASSTYPE extends U> CLASSTYPE findInstance(Class<CLASSTYPE> clazz, boolean writer);
+
+ Collection<U> getAllMessages();
+
+ Collection<U> getAllReaders();
+
+ Collection<U> getAllWriters();
+
+ Collection<U> getAllReaders(DataType type);
+
+ Collection<U> getAllWriters(DataType type);
+
+ void init() throws Exception;
+
+ void publishMessages(boolean publish);
+
+ boolean isPhysicalTypeAvailable(DataType physicalType);
+
+ IMessageRequestor<T, U> createMessageRequestor(String name);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IMessageRequestor.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IMessageRequestor.java
new file mode 100644
index 000000000..aa51bef91
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IMessageRequestor.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.interfaces;
+
+import org.eclipse.osee.ote.core.TestException;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.data.MessageData;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IMessageRequestor<T extends MessageData, U extends Message<? extends ITestEnvironmentMessageSystemAccessor, T, U>> {
+ <CLASSTYPE extends U> CLASSTYPE getMessageReader(Class<CLASSTYPE> type) throws TestException;
+
+ <CLASSTYPE extends U> CLASSTYPE getMessageWriter(Class<CLASSTYPE> type) throws TestException;
+
+ String getName();
+
+ void remove(U message) throws TestException;
+
+ void dispose();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IMessageScheduleChangeListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IMessageScheduleChangeListener.java
new file mode 100644
index 000000000..12b989675
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IMessageScheduleChangeListener.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.interfaces;
+
+import org.eclipse.osee.ote.message.Message;
+
+/**
+ * @author Andy Jury
+ */
+public interface IMessageScheduleChangeListener {
+
+ public void onRateChanged(Message<?, ?, ?> message, double oldRate, double newRate);
+
+ public void isScheduledChanged(boolean isScheduled);
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IMsgToolServiceClient.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IMsgToolServiceClient.java
new file mode 100644
index 000000000..57790937f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IMsgToolServiceClient.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.interfaces;
+
+import java.net.InetSocketAddress;
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import java.util.UUID;
+
+import org.eclipse.osee.ote.message.enums.DataType;
+
+public interface IMsgToolServiceClient extends Remote {
+ InetSocketAddress getAddressByType(String messageName, DataType memType) throws RemoteException;
+
+ void changeRate(String msgName, double rate) throws RemoteException;
+
+ void changeIsScheduled(String msgName, boolean isScheduled) throws RemoteException;
+
+ UUID getTestSessionKey() throws RemoteException;
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/INamespace.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/INamespace.java
new file mode 100644
index 000000000..71764b5c2
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/INamespace.java
@@ -0,0 +1,15 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.interfaces;
+
+public interface INamespace {
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IOSEEMessageReader.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IOSEEMessageReader.java
new file mode 100644
index 000000000..59c8ed4a1
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IOSEEMessageReader.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.interfaces;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IOSEEMessageReader {
+ void set(byte[] data);
+
+ byte[] get();
+
+ void set(IOSEEMessageWriterListener listener);
+
+ void takeNextSample();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IOSEEMessageReaderListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IOSEEMessageReaderListener.java
new file mode 100644
index 000000000..039f77fe4
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IOSEEMessageReaderListener.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.interfaces;
+
+import org.eclipse.osee.ote.message.listener.IOSEEMessageListener;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IOSEEMessageReaderListener extends IOSEEMessageListener {
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IOSEEMessageWriter.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IOSEEMessageWriter.java
new file mode 100644
index 000000000..3ccf8c042
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IOSEEMessageWriter.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.interfaces;
+
+import org.eclipse.osee.ote.message.MessageSystemException;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IOSEEMessageWriter {
+ void set(byte[] data);
+
+ byte[] get();
+
+ void set(IOSEEMessageWriterListener listener);
+
+ void send() throws MessageSystemException;
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IOSEEMessageWriterListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IOSEEMessageWriterListener.java
new file mode 100644
index 000000000..c4b03a18a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IOSEEMessageWriterListener.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.interfaces;
+
+import org.eclipse.osee.ote.message.listener.IOSEEMessageListener;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IOSEEMessageWriterListener extends IOSEEMessageListener {
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IRemoteMessageService.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IRemoteMessageService.java
new file mode 100644
index 000000000..a149430f7
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/IRemoteMessageService.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.interfaces;
+
+import java.net.InetSocketAddress;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.osee.ote.message.commands.RecordCommand;
+import org.eclipse.osee.ote.message.commands.SetElementValue;
+import org.eclipse.osee.ote.message.commands.SubscribeToMessage;
+import org.eclipse.osee.ote.message.commands.UnSubscribeToMessage;
+import org.eclipse.osee.ote.message.commands.ZeroizeElement;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.tool.SubscriptionDetails;
+import org.eclipse.osee.ote.message.tool.rec.IMessageEntryFactory;
+
+/**
+ * defines the operations clients can request of a remote message manager service
+ *
+ * @author Andrew M. Finkbeiner
+ */
+public interface IRemoteMessageService {
+
+ void unsubscribeToMessage(UnSubscribeToMessage cmd);
+
+ /**
+ * Sets a message element to a specified value
+ */
+ void setElementValue(SetElementValue cmd);
+
+ void zeroizeElement(ZeroizeElement cmd);
+
+ /**
+ * Notifies service to send message updates to the specified ip address
+ */
+ SubscriptionDetails subscribeToMessage(SubscribeToMessage cmd);
+
+ Set<? extends DataType> getAvailablePhysicalTypes();
+
+ boolean startRecording(RecordCommand cmd);
+
+ InetSocketAddress getRecorderSocketAddress();
+
+ InetSocketAddress getMsgUpdateSocketAddress();
+
+ void stopRecording();
+
+ void terminateService();
+
+ void reset();
+
+ void setupRecorder(IMessageEntryFactory factory);
+
+ public Map<String, Throwable> getCancelledSubscriptions();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/ITestAccessor.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/ITestAccessor.java
new file mode 100644
index 000000000..478a8571f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/ITestAccessor.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.interfaces;
+
+import org.eclipse.osee.ote.core.TestCase;
+import org.eclipse.osee.ote.core.TestScript;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public interface ITestAccessor extends ITestEnvironmentMessageSystemAccessor {
+ public TestCase getTestCase();
+
+ @Override
+ public TestScript getTestScript();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/ITestEnvironmentMessageSystem.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/ITestEnvironmentMessageSystem.java
new file mode 100644
index 000000000..b8e4de0a6
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/ITestEnvironmentMessageSystem.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.interfaces;
+
+import java.rmi.RemoteException;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironment;
+import org.eclipse.osee.ote.message.IInstrumentationRegistrationListener;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface ITestEnvironmentMessageSystem extends ITestEnvironment {
+
+ @Override
+ void addInstrumentationRegistrationListener(IInstrumentationRegistrationListener listener) throws RemoteException;
+
+ @Override
+ void removeInstrumentationRegistrationListener(IInstrumentationRegistrationListener listener) throws RemoteException;
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/ITestEnvironmentMessageSystemAccessor.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/ITestEnvironmentMessageSystemAccessor.java
new file mode 100644
index 000000000..c3dccb9c3
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/ITestEnvironmentMessageSystemAccessor.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.interfaces;
+
+import java.util.Set;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.message.enums.DataType;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface ITestEnvironmentMessageSystemAccessor extends ITestEnvironmentAccessor {
+ IMessageManager getMsgManager();
+
+ boolean isPhysicalTypeAvailable(DataType physicalType);
+
+ Set<? extends DataType> getDataTypes();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/Namespace.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/Namespace.java
new file mode 100644
index 000000000..9a16f685c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/interfaces/Namespace.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.interfaces;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class Namespace implements INamespace {
+
+ private final String namespace;
+
+ public Namespace(String string) {
+ namespace = string;
+ }
+
+ @Override
+ public String toString() {
+ return namespace;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ Namespace ns = (Namespace) obj;
+ return namespace.equals(ns.namespace);
+ }
+
+ @Override
+ public int hashCode() {
+ return namespace.hashCode();
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/internal/MessageIoManagementStarter.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/internal/MessageIoManagementStarter.java
new file mode 100644
index 000000000..eb725d5b6
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/internal/MessageIoManagementStarter.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.internal;
+
+import org.eclipse.osee.ote.core.environment.TestEnvironmentInterface;
+import org.eclipse.osee.ote.message.io.IMessageIoManagementService;
+import org.eclipse.osee.ote.message.io.MessageIoManagementService;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class MessageIoManagementStarter extends ServiceTracker {
+
+ private ServiceRegistration registration;
+
+ public MessageIoManagementStarter(BundleContext context) {
+ super(context, TestEnvironmentInterface.class.getName(), null);
+ }
+
+ @Override
+ public synchronized TestEnvironmentInterface addingService(ServiceReference reference) {
+ TestEnvironmentInterface manager = (TestEnvironmentInterface) super.addingService(reference);
+ registration =
+ context.registerService(IMessageIoManagementService.class.getName(), new MessageIoManagementService(), null);
+ return manager;
+ }
+
+ @Override
+ public synchronized void removedService(ServiceReference reference, Object service) {
+ unregister();
+ super.removedService(reference, service);
+ }
+
+ @Override
+ public synchronized void close() {
+ unregister();
+ super.close();
+ }
+
+ private void unregister(){
+ if (registration != null) {
+ try{
+ registration.unregister();
+ } catch (IllegalStateException ex){
+ //do nothing, we're just making sure it got cleaned up
+ } finally {
+ registration = null;
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/io/IMessageIoDriver.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/io/IMessageIoDriver.java
new file mode 100644
index 000000000..d0ff21366
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/io/IMessageIoDriver.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.io;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IMessageIoDriver {
+ void start();
+
+ void stop();
+
+ boolean isStarted();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/io/IMessageIoManagementService.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/io/IMessageIoManagementService.java
new file mode 100644
index 000000000..f288374f4
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/io/IMessageIoManagementService.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.io;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IMessageIoManagementService {
+
+ void install(IMessageIoDriver ioDriver);
+
+ void uninstall(IMessageIoDriver ioDriver);
+
+ void startIO();
+
+ void stopIO();
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/io/MessageIoManagementService.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/io/MessageIoManagementService.java
new file mode 100644
index 000000000..591f8690b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/io/MessageIoManagementService.java
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.io;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class MessageIoManagementService implements IMessageIoManagementService {
+
+ private final HashSet<IMessageIoDriver> drivers = new HashSet<>();
+
+ private final Lock lock = new ReentrantLock();
+ private boolean ioStarted = false;
+
+ @Override
+ public void install(IMessageIoDriver ioDriver) {
+ lock.lock();
+ if (!drivers.add(ioDriver)) {
+ // driver was already installed
+ lock.unlock();
+ return;
+ }
+ if (ioStarted) {
+ // make sure we release the lock before entering unknown code
+ lock.unlock();
+ ioDriver.start();
+ } else {
+ lock.unlock();
+ }
+ }
+
+ @Override
+ public void startIO() {
+ lock.lock();
+ ioStarted = true;
+
+ Set<IMessageIoDriver> copiedDrivers = new HashSet<>(drivers);
+ lock.unlock();
+ for (IMessageIoDriver driver : copiedDrivers) {
+ driver.start();
+ }
+
+ }
+
+ @Override
+ public void stopIO() {
+ lock.lock();
+ ioStarted = false;
+ Set<IMessageIoDriver> copiedDrivers = new HashSet<>(drivers);
+ lock.unlock();
+ for (IMessageIoDriver driver : copiedDrivers) {
+ driver.stop();
+ }
+ }
+
+ @Override
+ public void uninstall(IMessageIoDriver ioDriver) {
+ lock.lock();
+ boolean changed = drivers.remove(ioDriver);
+ lock.unlock();
+ if (changed && ioDriver.isStarted()) {
+ ioDriver.stop();
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/listener/IOSEEMessageListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/listener/IOSEEMessageListener.java
new file mode 100644
index 000000000..79fb807f3
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/listener/IOSEEMessageListener.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.listener;
+
+import org.eclipse.osee.ote.message.MessageSystemException;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.enums.DataType;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public interface IOSEEMessageListener {
+ void onDataAvailable(MessageData data, DataType type) throws MessageSystemException;
+
+ void onInitListener() throws MessageSystemException;
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/listener/MessageSystemListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/listener/MessageSystemListener.java
new file mode 100644
index 000000000..dd309982e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/listener/MessageSystemListener.java
@@ -0,0 +1,333 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.listener;
+
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Locale;
+import java.util.concurrent.SynchronousQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.osee.framework.jdk.core.util.benchmark.Benchmark;
+import org.eclipse.osee.ote.core.CopyOnWriteNoIteratorList;
+import org.eclipse.osee.ote.core.environment.interfaces.ICancelTimer;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentAccessor;
+import org.eclipse.osee.ote.core.environment.interfaces.ITimeout;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.MessageListenerTrace;
+import org.eclipse.osee.ote.message.MessageSystemException;
+import org.eclipse.osee.ote.message.TimeTrace;
+import org.eclipse.osee.ote.message.condition.ICondition;
+import org.eclipse.osee.ote.message.data.MessageData;
+import org.eclipse.osee.ote.message.elements.MsgWaitResult;
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.interfaces.IOSEEMessageReaderListener;
+import org.eclipse.osee.ote.message.interfaces.IOSEEMessageWriterListener;
+import org.eclipse.osee.ote.properties.OtePropertiesCore;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class MessageSystemListener implements IOSEEMessageReaderListener, IOSEEMessageWriterListener, ITimeout {
+
+ private volatile boolean isTimedOut = false;
+ private int masterMessageCount = 0;
+ private final WeakReference<Message> message;
+
+ private int messageCount = 0;
+
+ /**
+ * A thread pool for handling slow listeners. We start the pool with 5 threads, which should in most cases be more
+ * than enough threads to handle the listeners. Because the queue is static, it will be shared by all
+ * "slow listeners". Because of the expense of thread creation, we want to avoid creating threads when possible. To
+ * accomplish this, we start with more threads than we think we'll need, and we keep any newly created threads around
+ * for a long period of time. We assume that if we need a lot of threads now, we may continue to need a lot of
+ * threads for an extended period of time.
+ * <p>
+ * We use a SynchronousQueue in order to avoid queueing. We prefer to create a new thread to handle requests if
+ * necessary to help ensure that listeners are notified as quickly as possible and without delays caused by other
+ * listeners.
+ */
+ private static final ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, Integer.MAX_VALUE, 60 * 30,
+ TimeUnit.SECONDS, new SynchronousQueue<Runnable>());
+
+ private final CopyOnWriteNoIteratorList<IOSEEMessageListener> fastListeners = new CopyOnWriteNoIteratorList<>(IOSEEMessageListener.class);
+ private final CopyOnWriteNoIteratorList<IOSEEMessageListener> slowListeners = new CopyOnWriteNoIteratorList<>(IOSEEMessageListener.class);
+ private volatile boolean disposed = false;
+ private MessageListenerTrace timeTrace;
+
+ /**
+ * This class takes in a message in the constructor so that it can tell the message to update when it recieves new
+ * data.
+ */
+ public MessageSystemListener(Message msg) {
+ super();
+ this.message = new WeakReference<>(msg);
+ }
+
+ /**
+ * returns the number of received messages since the last call to waitForData
+ */
+ public synchronized int getLocalMessageCount() {
+ return messageCount;
+ }
+
+ public synchronized int getMasterMessageCount() {
+ return masterMessageCount;
+ }
+
+ /**
+ * return whether new data has been received since the last call to waitForData
+ */
+ @Override
+ public boolean isTimedOut() {
+ return this.isTimedOut;
+ }
+
+ @Override
+ public void setTimeout(boolean timeout) {
+ this.isTimedOut = timeout;
+ }
+
+ public synchronized boolean waitForData() throws InterruptedException {
+ messageCount = 0;
+ if (this.isTimedOut) {
+ return true;
+ }
+ while (messageCount == 0 && !isTimedOut) {
+ wait(); // the test environment will notify us after a specified time out
+ }
+ return isTimedOut;
+ }
+
+ public synchronized boolean waitForMessageNumber(int count) throws InterruptedException {
+ while (masterMessageCount < count) {
+ messageCount = 0;
+ wait();// onDataAvailable
+ if (isTimedOut()) {//we timed out
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public MsgWaitResult waitForCondition(ITestEnvironmentAccessor accessor, ICondition condition, boolean maintain, int milliseconds) throws InterruptedException {
+ long time = 0l;
+ boolean pass;
+ if (milliseconds > 0) {
+ ICancelTimer cancelTimer;
+ synchronized (this) {
+ pass = condition.check();
+ time = accessor.getEnvTime();
+ boolean done = pass ^ maintain;
+ cancelTimer = accessor.setTimerFor(this, milliseconds);
+ while (!done) {
+ if (waitForData()) {
+ // we timed out
+ break;
+ } else {
+ pass = condition.checkAndIncrement();
+ done = pass ^ maintain;
+ }
+ }
+ time = accessor.getEnvTime() - time;
+ }
+ cancelTimer.cancelTimer();
+ } else {
+ pass = condition.check();
+ }
+ return new MsgWaitResult(time, condition.getCheckCount(), pass);
+ }
+
+ /**
+ * Registers a listener for the message. If the listener will not respond quickly (for example, if the listener is
+ * going to make RMI calls, or other network activites which it will wait for the remote side to respond), then it
+ * should identify itself as a slow listener by passing the SLOW enumeration for listenerSpeed. "Slow" listeners will be
+ * notified by a separate thread, thereby not forcing other listener notifications to be delayed, and subsequent messages
+ * from being processed.
+ *
+ * @param listener - The listener to be added
+ * @param listenerSpeed - An enum that is either FAST/SLOW
+ * @return Returns boolean success indication.
+ */
+ public boolean addListener(IOSEEMessageListener listener, SPEED listenerSpeed) {
+ CopyOnWriteNoIteratorList c = listenerSpeed == SPEED.FAST ? fastListeners : slowListeners;
+ if (!c.contains(listener)) {
+ c.add(listener);
+ }
+ return true;
+ }
+
+ /**
+ * Adds the listener as a "fast" listener.
+ *
+ * @see MessageSystemListener#addListener(IOSEEMessageListener, SPEED)
+ */
+ public boolean addListener(IOSEEMessageListener listener) {
+ return addListener(listener, SPEED.FAST);
+ }
+
+ /**
+ * Checks to see if the specified listener is registered
+ *
+ * @return true if the listener is register false otherwise
+ */
+ public boolean containsListener(final IOSEEMessageListener listener, final SPEED listenerSpeed) {
+ return listenerSpeed.equals(SPEED.FAST) ? fastListeners.contains(listener) : slowListeners.contains(listener);
+ }
+
+ /**
+ * Convience method.
+ *
+ * @return Returns presence boolean indication.
+ * @see #containsListener(IOSEEMessageListener, SPEED)
+ */
+ public boolean containsListener(final IOSEEMessageListener listener) {
+ return containsListener(listener, SPEED.FAST);
+
+ }
+
+ public boolean removeListener(IOSEEMessageListener listener, SPEED listenerSpeed) {
+
+ return listenerSpeed == SPEED.FAST ? fastListeners.remove(listener) : slowListeners.remove(listener);
+ }
+
+ public boolean removeListener(IOSEEMessageListener listener) {
+ return removeListener(listener, SPEED.FAST) || removeListener(listener, SPEED.SLOW);
+ }
+
+ @Override
+ public synchronized void onDataAvailable(final MessageData data, DataType type) throws MessageSystemException {
+ if(disposed) return;
+ boolean isTimeTrace = timeTrace != null;
+ if(isTimeTrace){
+ timeTrace.addStartNotify();
+ }
+ if (message.get().getMemType() == type) {
+ messageCount++;
+ masterMessageCount++;
+ notifyAll();
+ }
+
+ long start = 0, elapsed;
+ IOSEEMessageListener[] ref = fastListeners.get();
+ for (int i = 0; i < ref.length; i++) {
+ IOSEEMessageListener listener = ref[i];
+ if(isTimeTrace){
+ timeTrace.addStartListener(listener);
+ }
+ listener.onDataAvailable(data, type);
+ if(isTimeTrace){
+ timeTrace.addEndListener(listener);
+ }
+ }
+
+ ref = slowListeners.get();
+ for (int i = 0; i < ref.length; i++){
+ IOSEEMessageListener listener = ref[i];
+ if(isTimeTrace){
+ timeTrace.addStartListener(listener);
+ }
+ threadPool.execute(new SlowListenerNotifier(listener, data, type, false));
+ if(isTimeTrace){
+ timeTrace.addEndListener(listener);
+ }
+ }
+ if(isTimeTrace){
+ timeTrace.addEndNotify();
+ }
+ }
+
+ @Override
+ public synchronized void onInitListener() throws MessageSystemException {
+ if(disposed) return;
+ IOSEEMessageListener[] ref = fastListeners.get();
+ for (int i = 0; i < ref.length; i++) {
+ IOSEEMessageListener listener = ref[i];
+ listener.onInitListener();
+ }
+
+ ref = slowListeners.get();
+ for (int i = 0; i < ref.length; i++){
+ IOSEEMessageListener listener = ref[i];
+ threadPool.execute(new SlowListenerNotifier(listener, null, null, true));
+ }
+ }
+
+ /**
+ * Manages the notification of a slow IOSEEMessageListener. The implementation prevents multiple calls into the
+ * listener at the same time.
+ *
+ * @author David Diepenbrock
+ */
+ private static final class SlowListenerNotifier implements Runnable {
+
+ /**
+ * Indicates if we are performing the onInitListener() call or onDataAvailable() call
+ */
+ private final boolean isOnInit;
+
+ private final IOSEEMessageListener listener;
+
+ private final MessageData data;
+
+ private final DataType type;
+
+ public SlowListenerNotifier(IOSEEMessageListener listener, MessageData data, DataType type, boolean isOnInit) {
+ this.listener = listener;
+ this.data = data;
+ this.type = type;
+ this.isOnInit = isOnInit;
+ }
+
+ @Override
+ public void run() {
+ synchronized (listener) {
+ if (isOnInit) {
+ listener.onInitListener();
+ } else {
+ listener.onDataAvailable(data, type);
+ }
+ }
+ }
+ }
+
+ public Collection<IOSEEMessageListener> getRegisteredFastListeners() {
+ return fastListeners.fillCollection(new ArrayList<IOSEEMessageListener>(fastListeners.length()));
+ }
+
+ public Collection<IOSEEMessageListener> getRegisteredSlowListeners() {
+ return slowListeners.fillCollection(new ArrayList<IOSEEMessageListener>(slowListeners.length()));
+ }
+
+ public void dispose() {
+ this.disposed = true;
+ this.clearListeners();
+ }
+
+ public void clearListeners() {
+ this.fastListeners.clear();
+ this.slowListeners.clear();
+ }
+
+ public synchronized void setMessageListenerTrace(Message message, MessageListenerTrace timeTrace) {
+ this.timeTrace = timeTrace;
+ }
+
+ public synchronized MessageListenerTrace clearListenerTrace(Message message) {
+ MessageListenerTrace trace = this.timeTrace;
+ this.timeTrace = null;
+ return trace;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/listener/SPEED.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/listener/SPEED.java
new file mode 100644
index 000000000..07c2e1da9
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/listener/SPEED.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.listener;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public enum SPEED {
+ FAST,
+ SLOW
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/log/record/MessageJarConfigrecord.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/log/record/MessageJarConfigrecord.java
new file mode 100644
index 000000000..49510ef37
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/log/record/MessageJarConfigrecord.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.log.record;
+
+import java.io.File;
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.log.record.TestRecord;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class MessageJarConfigrecord extends TestRecord {
+
+ private final String[] jarVersions;
+
+ private static final long serialVersionUID = 6919229589873467398L;
+
+ /**
+ * ScriptConfigRecord Constructor. Constructs test script configuration log message with timestamp.
+ *
+ * @param script The test script who's configuration is to be recorded.
+ */
+ public MessageJarConfigrecord(TestScript script, String[] jarVersions, Map<String, File> availableJars) {
+ super(script.getTestEnvironment(), Level.CONFIG, script.getClass().getName(), false);
+ this.jarVersions = jarVersions;
+ }
+
+ /**
+ * Convert an element to XML format.
+ *
+ * @return XML formated config element.
+ */
+ @Override
+ public Element toXml(Document doc) {
+ Element jarConfig = doc.createElement("JarConfig");
+ doc.appendChild(jarConfig);
+
+ for (String version : jarVersions) {
+ Element el = doc.createElement("Jar");
+ el.setTextContent(version);
+ jarConfig.appendChild(el);
+ }
+ return jarConfig;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/timer/AlarmClock.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/timer/AlarmClock.java
new file mode 100644
index 000000000..abd52923b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/timer/AlarmClock.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.timer;
+
+import java.util.TimerTask;
+import org.eclipse.osee.ote.core.environment.interfaces.ICancelTimer;
+import org.eclipse.osee.ote.core.environment.interfaces.ITimeout;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class AlarmClock extends TimerTask implements ICancelTimer {
+ private final ITimeout sleeper;
+
+ public AlarmClock(ITimeout sleeper) {
+ super();
+ this.sleeper = sleeper;
+ sleeper.setTimeout(false);
+ }
+
+ /**
+ * @see java.lang.Runnable#run()
+ */
+ @Override
+ public void run() {
+ synchronized (sleeper) {
+ sleeper.notify();
+ sleeper.setTimeout(true);
+ }
+ }
+
+ @Override
+ public void cancelTimer() {
+ this.cancel();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/timer/CycleCountDown.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/timer/CycleCountDown.java
new file mode 100644
index 000000000..1f8e8f09c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/timer/CycleCountDown.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.timer;
+
+import org.eclipse.osee.ote.core.environment.interfaces.ICancelTimer;
+import org.eclipse.osee.ote.core.environment.interfaces.IScriptControl;
+import org.eclipse.osee.ote.core.environment.interfaces.ITimeout;
+
+/**
+ * This class is used as a 'Time Out' object while waiting for the desired message element value.
+ *
+ * @author Ryan D. Brooks
+ */
+public class CycleCountDown implements ICancelTimer {
+ private int cycleCount;
+ private volatile boolean completed;
+ private final ITimeout objToNotify;
+ private final IScriptControl scriptLock;
+
+ /**
+ * @param objToNotify The Object that is in wait() on which we will call notifyAll()
+ * @param cycleCount The number of cycles to countdown.
+ */
+ public CycleCountDown(IScriptControl scriptLock, ITimeout objToNotify, int cycleCount) {
+ super();
+ this.scriptLock = scriptLock;
+ this.cycleCount = cycleCount;
+ this.objToNotify = objToNotify;
+ this.completed = false;
+ objToNotify.setTimeout(false);
+ }
+
+ /**
+ * @return true if the countdown is complete/canceled, otherwise false
+ */
+ public boolean cycleOccurred() {
+ if (cycleCount == 0 && !completed) {
+ completed = true;
+ synchronized (objToNotify) {
+ objToNotify.setTimeout(true);
+ objToNotify.notifyAll();
+ }
+ }
+ else {
+ cycleCount--;
+ }
+ return completed;
+ }
+
+ @Override
+ public void cancelTimer() {
+ this.completed = true;
+ if (this.scriptLock != null) {
+ this.scriptLock.lock();
+ }
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/timer/RealTime.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/timer/RealTime.java
new file mode 100644
index 000000000..21c1b4b53
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/timer/RealTime.java
@@ -0,0 +1,160 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.timer;
+
+import java.lang.ref.WeakReference;
+import java.util.HashMap;
+import java.util.List;
+import java.util.concurrent.ScheduledFuture;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.jdk.core.util.benchmark.Benchmark;
+import org.eclipse.osee.ote.core.environment.EnvironmentTask;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.TimerControl;
+import org.eclipse.osee.ote.core.environment.interfaces.ICancelTimer;
+import org.eclipse.osee.ote.core.environment.interfaces.ITimeout;
+
+/**
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class RealTime extends TimerControl {
+ private final HashMap<EnvironmentTask, ScheduledFuture<?>> handleMap =
+ new HashMap<EnvironmentTask, ScheduledFuture<?>>(32);
+
+ /**
+ * Constructor
+ */
+ public RealTime() {
+ super((Runtime.getRuntime().availableProcessors() + 1) / 2 + 1);
+ }
+
+ @Override
+ public void addTask(final EnvironmentTask task, final TestEnvironment environment) {
+ if (!handleMap.containsKey(task)) {
+ final WeakReference<TestEnvironment> te = new WeakReference<>(environment);
+ final ScheduledFuture<?> handle = schedulePeriodicTask(new Runnable() {
+ final Benchmark bm = new Benchmark(task.getClass().getName() + ":" + task.getHzRate() + "Hz",
+ (long) (1000000.0 / task.getHzRate()));
+
+ @Override
+ public void run() {
+
+ try {
+ bm.samplePoint();
+ if (task.isRunning()) {
+ task.runOneCycle();
+ }
+ } catch (Throwable ex) {
+ ScheduledFuture<?> h = handleMap.get(task);
+ if (h != null) {
+ h.cancel(false);
+ }
+ te.get().handleException(ex, "exception while running one cycle for task " + task.toString(),
+ Level.SEVERE, false);
+ }
+ }
+
+ }, 0, (long) Math.rint(1000.0 / task.getHzRate()));
+ handleMap.put(task, handle);
+ }
+ }
+
+ @Override
+ public void removeTask(EnvironmentTask task) {
+ ScheduledFuture<?> handle = handleMap.remove(task);
+ if (handle != null) {
+ handle.cancel(false);
+ }
+ }
+
+ @Override
+ public long getEnvTime() {
+ return System.currentTimeMillis();
+ }
+
+ @Override
+ public void envWait(ITimeout obj, int milliseconds) throws InterruptedException {
+ synchronized (obj) {
+ obj.wait(milliseconds);
+ }
+ }
+
+ @Override
+ public ICancelTimer setTimerFor(final ITimeout objToNotify, int milliseconds) {
+ objToNotify.setTimeout(false);
+ final ScheduledFuture<?> handle = scheduleOneShotTask(new Runnable() {
+
+ @Override
+ public void run() {
+ synchronized (objToNotify) {
+ objToNotify.setTimeout(true);
+ objToNotify.notifyAll();
+ }
+ }
+ }, milliseconds);
+
+ return new ICancelTimer() {
+
+ @Override
+ public void cancelTimer() {
+ handle.cancel(false);
+ }
+ };
+ }
+
+ @Override
+ public int getCycleCount() {
+ return (int) System.currentTimeMillis() / 20;
+ }
+
+ @Override
+ public void incrementCycleCount() {
+ }
+
+ public List<CycleCountDown> getCycleCounters() {
+ return null;
+ }
+
+ public void setCycleCounters(List<CycleCountDown> cycleCounters) {
+ }
+
+ @Override
+ public void setCycleCount(int cycle) {
+ }
+
+ @Override
+ public void dispose() {
+ }
+
+ @Override
+ public void cancelAllTasks() {
+ for (ScheduledFuture<?> handle : handleMap.values()) {
+ handle.cancel(false);
+ }
+ handleMap.clear();
+ }
+
+ @Override
+ public void step() {
+ }
+
+ @Override
+ public long getTimeOfDay() {
+ return getEnvTime();
+ }
+
+ @Override
+ public boolean isRealtime() {
+ return true;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/timer/SimulatedTime.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/timer/SimulatedTime.java
new file mode 100644
index 000000000..2c78d216d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/timer/SimulatedTime.java
@@ -0,0 +1,204 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.timer;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.environment.EnvironmentTask;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.TimerControl;
+import org.eclipse.osee.ote.core.environment.interfaces.ICancelTimer;
+import org.eclipse.osee.ote.core.environment.interfaces.IScriptControl;
+import org.eclipse.osee.ote.core.environment.interfaces.ITimeout;
+import org.eclipse.osee.ote.message.MessageSystemTestEnvironment;
+
+/**
+ * We use a frequency resolution of 300hz.
+ *
+ * @author Ryan D. Brooks
+ * @author Andrew M. Finkbeiner
+ */
+public class SimulatedTime extends TimerControl {
+
+ private static final class Task {
+ private final EnvironmentTask task;
+ private final TestEnvironment env;
+
+ public Task(EnvironmentTask task, TestEnvironment env) {
+ super();
+ this.task = task;
+ this.env = env;
+ }
+
+ public void doTask(int cycleCount) {
+ try {
+ task.baseRunOneCycle(cycleCount);
+ } catch (Throwable ex) {
+ OseeLog.log(MessageSystemTestEnvironment.class, Level.SEVERE,
+ "Aborting the test script because an Environment Task is failing", ex);
+ env.getRunManager().abort(ex, false);
+ }
+ }
+ }
+ private final Collection<CycleCountDown> cycleCounters;
+ private final Collection<CycleCountDown> scriptCycleCounters;
+ private final IScriptControl scriptControl;
+ private int cycleCount;
+ private final CopyOnWriteArrayList<Task> tasks = new CopyOnWriteArrayList<>();
+
+ private final long sysTime;
+
+ /**
+ * @param scriptControl -
+ */
+ public SimulatedTime(IScriptControl scriptControl) throws IOException {
+ super(3);
+ this.scriptControl = scriptControl;
+ cycleCounters = new HashSet<>(32);
+ scriptCycleCounters = new HashSet<>(32);
+ cycleCount = 0;
+ sysTime = System.currentTimeMillis();
+ }
+
+ @Override
+ public long getEnvTime() {
+ return (long) (cycleCount * 1000.0 / EnvironmentTask.cycleResolution);
+ }
+
+ @Override
+ public ICancelTimer setTimerFor(ITimeout objToNotify, int milliseconds) {
+ CycleCountDown cycleCountDown = new CycleCountDown(scriptControl, objToNotify,
+ (int) Math.rint(milliseconds / (1000.0 / EnvironmentTask.cycleResolution)) - 1);
+ synchronized (cycleCounters) {
+ if(getRunManager().isCurrentThreadScript()){
+ scriptCycleCounters.add(cycleCountDown);
+ } else {
+ cycleCounters.add(cycleCountDown);
+ }
+ }
+
+ unlockScriptControl();
+
+ return cycleCountDown;
+ }
+
+ protected void unlockScriptControl() {
+ try {
+ scriptControl.unlock();
+ } catch (IllegalMonitorStateException ex) {
+ OseeLog.log(MessageSystemTestEnvironment.class, Level.SEVERE, ex);
+ }
+ }
+
+ @Override
+ public void addTask(EnvironmentTask envTask, TestEnvironment environment) {
+ for (Task task : tasks) {
+ if (task.task == envTask) {
+ return;
+ }
+ }
+
+ tasks.add(new Task(envTask, environment));
+ }
+
+ @Override
+ public void removeTask(EnvironmentTask task) {
+ Task itemToRemove = null;
+ for (Task t : tasks) {
+ if (t.task == task) {
+ itemToRemove = t;
+ break;
+ }
+ }
+ if (itemToRemove != null) {
+ OseeLog.log(MessageSystemTestEnvironment.class, Level.FINE, "removing environment task " + task.toString());
+ tasks.remove(itemToRemove);
+ }
+ }
+
+ @Override
+ public void step() {
+
+ for (Task t : tasks) {
+ t.doTask(cycleCount);
+ }
+ incrementCycleCount();
+ }
+
+ @Override
+ public int getCycleCount() {
+ return cycleCount;
+ }
+
+ public Collection<CycleCountDown> getCycleCounters() {
+ return scriptCycleCounters;
+ }
+
+ @Override
+ public void incrementCycleCount() {
+ cycleCount++;
+ }
+
+ @Override
+ public void setCycleCount(int cycle) {
+ cycleCount = cycle;
+ }
+
+ @Override
+ public void cancelAllTasks() {
+ for (Task t : tasks) {
+ t.task.cancel();
+ }
+ tasks.clear();
+ }
+
+ public void removeOccurredCycleCounters() {
+ synchronized (cycleCounters) {
+ Iterator<CycleCountDown> iter = cycleCounters.iterator();
+ while (iter.hasNext()) {
+ CycleCountDown counter = iter.next();
+ if (counter.cycleOccurred()) {
+ iter.remove();
+ }
+ }
+ iter = scriptCycleCounters.iterator();
+ while (iter.hasNext()) {
+ CycleCountDown counter = iter.next();
+ if (counter.cycleOccurred()) {
+ iter.remove();
+ }
+ }
+ }
+ }
+
+ @Override
+ public void dispose() {
+ cycleCounters.clear();
+ scriptCycleCounters.clear();
+ tasks.clear();
+ }
+
+ @Override
+ public long getTimeOfDay() {
+ return sysTime + getEnvTime();
+ }
+
+ @Override
+ public boolean isRealtime() {
+ return false;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/IFileTransferHandle.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/IFileTransferHandle.java
new file mode 100644
index 000000000..b4e4f3503
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/IFileTransferHandle.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.tool;
+
+import java.io.IOException;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IFileTransferHandle {
+ void stop() throws IOException;
+
+ void addListener(IUdpTransferListener listener);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/IUdpTransferListener.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/IUdpTransferListener.java
new file mode 100644
index 000000000..302f8f88d
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/IUdpTransferListener.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.tool;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IUdpTransferListener {
+ /**
+ * called by the file transfer handler when a file transfer is complete
+ *
+ * @param config the transfer configuration
+ */
+ void onTransferComplete(TransferConfig config);
+
+ /**
+ * called when the an error is experienced during transfer operations. The handle for this transfer will be
+ * automatically stopped prior to this method being called
+ */
+ void onTransferException(TransferConfig config, Throwable t);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/MessageMode.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/MessageMode.java
new file mode 100644
index 000000000..c87a95d35
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/MessageMode.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.tool;
+
+import java.io.Serializable;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public enum MessageMode implements Serializable {
+ READER,
+ WRITER;
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/SubscriptionDetails.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/SubscriptionDetails.java
new file mode 100644
index 000000000..fdbd070a9
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/SubscriptionDetails.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.tool;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+import org.eclipse.osee.ote.message.enums.DataType;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class SubscriptionDetails implements Serializable {
+
+ private static final long serialVersionUID = -3968654375167145281L;
+
+ private final SubscriptionKey key;
+ private final byte[] currentData;
+ private final Set<DataType> availableMemTypes;
+
+ public SubscriptionDetails(SubscriptionKey key, byte[] currentData, Set<DataType> availableMemTypes) {
+ this.key = key;
+ this.currentData = currentData;
+ this.availableMemTypes = new HashSet<>(availableMemTypes);
+ }
+
+ public SubscriptionKey getKey() {
+ return key;
+ }
+
+ public byte[] getCurrentData() {
+ return currentData;
+ }
+
+ public Set<DataType> getAvailableMemTypes() {
+ return availableMemTypes;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/SubscriptionKey.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/SubscriptionKey.java
new file mode 100644
index 000000000..a3da131b2
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/SubscriptionKey.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.tool;
+
+import java.io.Serializable;
+import org.eclipse.osee.ote.message.enums.DataType;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public final class SubscriptionKey implements Serializable {
+
+ private static final long serialVersionUID = 4385205425559852952L;
+
+ private final int id;
+ private final DataType type;
+ private final MessageMode mode;
+ private final String messageClassName;
+
+ public SubscriptionKey(int id, DataType type, MessageMode mode, String messageClassName) {
+ this.id = id;
+ this.type = type;
+ this.mode = mode;
+ this.messageClassName = messageClassName;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public DataType getType() {
+ return type;
+ }
+
+ public MessageMode getMode() {
+ return mode;
+ }
+
+ public String getMessageClassName() {
+ return messageClassName;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/TransferConfig.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/TransferConfig.java
new file mode 100644
index 000000000..c2ad7452f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/TransferConfig.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.tool;
+
+import java.net.InetSocketAddress;
+import java.nio.channels.SelectionKey;
+
+public final class TransferConfig {
+ public static enum Direction {
+ SOCKET_TO_FILE(SelectionKey.OP_READ),
+ FILE_TO_SOCKET(SelectionKey.OP_WRITE);
+
+ private int accessType;
+
+ private Direction(int accessType) {
+ this.accessType = accessType;
+ }
+
+ public int getSelectionAccessOperation() {
+ return accessType;
+ }
+
+ }
+ private final String fileName;
+ private final InetSocketAddress sourceAddress;
+ private final InetSocketAddress destinationAddress;
+ private final Direction direction;
+ private final int blockCount;
+ private final boolean appendMode;
+
+ public TransferConfig(final String fileName, final InetSocketAddress sourceAddress, final InetSocketAddress destinationAddress, final Direction direction, final int blockCount) {
+ this(fileName, sourceAddress, destinationAddress, direction, blockCount, false);
+ }
+
+ public TransferConfig(final String fileName, final InetSocketAddress sourceAddress, final InetSocketAddress destinationAddress, final Direction direction, final int blockCount, boolean appendMode) {
+ super();
+ this.fileName = fileName;
+ this.sourceAddress = sourceAddress;
+ this.destinationAddress = destinationAddress;
+ this.direction = direction;
+ this.blockCount = blockCount;
+ this.appendMode = appendMode;
+ }
+
+ /**
+ * @return the direction
+ */
+ public Direction getDirection() {
+ return direction;
+ }
+
+ /**
+ * @return the fileChannel
+ */
+ public String getFileName() {
+ return fileName;
+ }
+
+ /**
+ * @return the destination of the data
+ */
+ public InetSocketAddress getDestinationAddress() {
+ return destinationAddress;
+ }
+
+ /**
+ * @return the sourceAddress
+ */
+ public InetSocketAddress getSourceAddress() {
+ return sourceAddress;
+ }
+
+ /**
+ * @return the blockCount
+ */
+ public int getBlockCount() {
+ return blockCount;
+ }
+
+ public boolean isAppendMode() {
+ return appendMode;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/UdpFileTransferHandler.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/UdpFileTransferHandler.java
new file mode 100644
index 000000000..9b6db88c7
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/UdpFileTransferHandler.java
@@ -0,0 +1,284 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.tool;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.net.DatagramSocket;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.UnknownHostException;
+import java.nio.channels.ClosedByInterruptException;
+import java.nio.channels.ClosedChannelException;
+import java.nio.channels.DatagramChannel;
+import java.nio.channels.FileChannel;
+import java.nio.channels.FileLock;
+import java.nio.channels.SelectionKey;
+import java.nio.channels.Selector;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.message.MessageSystemTestEnvironment;
+
+public class UdpFileTransferHandler {
+
+ private final Thread thread;
+ private final Selector selector;
+ private volatile boolean done = false;
+
+ private final HashMap<SelectionKey, Handle> handles = new HashMap<>();
+ private final Object gate = new Object();
+
+ private final class Handle implements IFileTransferHandle {
+ private final CopyOnWriteArrayList<IUdpTransferListener> listeners =
+ new CopyOnWriteArrayList<IUdpTransferListener>();
+ private final SelectionKey key;
+ private final TransferConfig config;
+ private final FileLock lock;
+
+ public Handle(SelectionKey key, TransferConfig config, FileLock lock) {
+ if (key == null) {
+ throw new IllegalArgumentException("The selection key cannot be null");
+ }
+ if (config == null) {
+ throw new IllegalArgumentException("The transfer configuration cannot be null");
+ }
+ if (lock == null) {
+ throw new IllegalArgumentException("The file lock cannot be null");
+ }
+ this.key = key;
+ this.config = config;
+ this.lock = lock;
+ }
+
+ @Override
+ public void addListener(IUdpTransferListener listener) {
+ if (!listeners.contains(listener)) {
+ listeners.add(listener);
+ }
+ }
+
+ @Override
+ public void stop() throws IOException {
+ synchronized (gate) {
+ handles.remove(key);
+ key.cancel();
+ //selector.wakeup();
+ OseeLog.log(MessageSystemTestEnvironment.class, Level.INFO, "stopping transfer for " + config.getFileName());
+ key.channel().close();
+ lock.channel().close();
+ for (IUdpTransferListener listener : listeners) {
+ listener.onTransferComplete(config);
+ }
+ listeners.clear();
+ }
+ }
+
+ }
+
+ public UdpFileTransferHandler() throws IOException {
+ selector = Selector.open();
+ thread = new Thread(new Runnable() {
+
+ @Override
+ public void run() {
+ try {
+ while (!done) {
+ selector.select();
+ processReadySet(selector.selectedKeys());
+ synchronized (gate) {
+ // we do this to prevent entry to the selector.select() when
+ // registering new channels from a different thread. Otherwise
+ // we would deadlock
+ }
+ }
+ } catch (ClosedByInterruptException ex) {
+ if (!done) {
+ // interrupted but we were not stopped
+ OseeLog.log(MessageSystemTestEnvironment.class, Level.SEVERE, ex);
+ }
+ } catch (IOException ex) {
+ OseeLog.log(MessageSystemTestEnvironment.class, Level.SEVERE, ex);
+ }
+ }
+
+ });
+ thread.setName("UDP File Transfer Handler");
+ }
+
+ /**
+ * @return true if successful or false if a lock on the file was not obtained
+ */
+ public IFileTransferHandle registerTransfer(TransferConfig config) throws IOException, FileNotFoundException {
+ synchronized (gate) {
+ selector.wakeup();
+ return addTransfer(config);
+ }
+ }
+
+ private synchronized IFileTransferHandle addTransfer(final TransferConfig config) throws IOException, FileNotFoundException {
+ File file = new File(config.getFileName());
+ final FileChannel fileChannel;
+ final FileLock lock;
+ if (config.getDirection() == TransferConfig.Direction.SOCKET_TO_FILE) {
+ FileOutputStream fos = new FileOutputStream(file, config.isAppendMode());
+ fileChannel = fos.getChannel();
+ lock = fileChannel.tryLock(0l, Long.MAX_VALUE, false);
+ } else {
+ FileInputStream fis = new FileInputStream(file);
+ fileChannel = fis.getChannel();
+ lock = fileChannel.tryLock(0l, Long.MAX_VALUE, true);
+ }
+
+ if (lock == null) {
+ return null;
+ }
+ fileChannel.position(0);
+ final DatagramChannel sourceChannel = DatagramChannel.open();
+ sourceChannel.configureBlocking(false);
+ final DatagramSocket socket = sourceChannel.socket();
+ socket.bind(config.getDestinationAddress());
+ sourceChannel.connect(config.getSourceAddress());
+ System.out.println("file side bind address=" + socket.getLocalAddress() + ":" + socket.getLocalPort());
+ System.out.println("connected socket address=" + config.getSourceAddress());
+
+ if (config.getDirection() == TransferConfig.Direction.SOCKET_TO_FILE && socket.getReceiveBufferSize() < config.getBlockCount()) {
+ socket.setReceiveBufferSize(config.getBlockCount());
+ System.out.println("internal UDP receive buffer size =" + socket.getReceiveBufferSize());
+ }
+ final SelectionKey key = sourceChannel.register(selector, config.getDirection().getSelectionAccessOperation());
+ Handle h = new Handle(key, config, lock);
+ handles.put(key, h);
+ return h;
+ }
+
+ public void start() throws IOException {
+ thread.start();
+ }
+
+ public void stop(int time) throws InterruptedException, IOException {
+ done = true;
+ thread.interrupt();
+ thread.join(time);
+ stopAllTransfers();
+ handles.clear();
+ selector.close();
+ }
+
+ private void processReadySet(final Set<SelectionKey> readySet) throws ClosedByInterruptException, IOException {
+ /* iterate through the set of readable channels */
+ final Iterator<SelectionKey> keys = readySet.iterator();
+ while (keys.hasNext()) {
+ final SelectionKey key = keys.next();
+ if (key.isValid()) {
+ final Handle handle = handles.get(key);
+ final FileChannel fileChannel = handle.lock.channel();
+ final DatagramChannel channel = (DatagramChannel) key.channel();
+ final long pos = fileChannel.position();
+ try {
+ if ((key.interestOps() & SelectionKey.OP_READ) > 0) {
+ final long count = fileChannel.transferFrom(channel, pos, handle.config.getBlockCount());
+ fileChannel.position(pos + count);
+ if (count == 0) {
+ System.out.println("warning! read zero bytes");
+ }
+ } else if ((key.interestOps() & SelectionKey.OP_WRITE) > 0) {
+ final long count = fileChannel.transferTo(pos, handle.config.getBlockCount(), channel);
+ if (count == 0) {
+ System.out.println("warning! wrote zero bytes");
+ }
+ fileChannel.position(pos + count);
+ if (fileChannel.position() >= fileChannel.size()) {
+ synchronized (this) {
+ System.out.println("done transfering file " + handle.config.getFileName());
+ handle.stop();
+ }
+ }
+ }
+ } catch (ClosedChannelException ex) {
+ handle.stop();
+ } catch (Throwable t) {
+ try {
+ handle.key.cancel();
+ handle.key.channel().close();
+ handle.lock.release();
+ handle.lock.channel().close();
+ } finally {
+ for (IUdpTransferListener listener : handle.listeners) {
+ listener.onTransferException(handle.config, t);
+ }
+ handle.listeners.clear();
+ }
+ }
+ }
+ keys.remove();
+ }
+ }
+
+ public static void main(String[] args) {
+ try {
+ final UdpFileTransferHandler rec = new UdpFileTransferHandler();
+ String file = args[0];
+ InetAddress ipAddr = InetAddress.getByName(args[1]);
+ int remotePort = Integer.parseInt(args[2]);
+ int localPort = Integer.parseInt(args[3]);
+ TransferConfig.Direction direction = TransferConfig.Direction.values()[Integer.parseInt(args[4])];
+ InetSocketAddress address = new InetSocketAddress(ipAddr, remotePort);
+ if (direction == TransferConfig.Direction.FILE_TO_SOCKET) {
+ System.out.printf("Transfering %s to %s via local port %d\n", file, address.toString(), localPort);
+ } else {
+ System.out.printf("Writing to %s data recieved from %s via local port %d\n", file, address.toString(),
+ localPort);
+ }
+ TransferConfig config =
+ new TransferConfig(file, address, new InetSocketAddress(InetAddress.getLocalHost(), localPort), direction,
+ 7 * 188);
+ rec.registerTransfer(config);
+ System.in.read();
+ rec.stop(2500);
+ } catch (UnknownHostException ex) {
+ OseeLog.log(MessageSystemTestEnvironment.class, Level.SEVERE, ex);
+ } catch (FileNotFoundException ex) {
+ OseeLog.log(MessageSystemTestEnvironment.class, Level.SEVERE, ex);
+ } catch (IOException ex) {
+ OseeLog.log(MessageSystemTestEnvironment.class, Level.SEVERE, ex);
+ } catch (InterruptedException ex) {
+ OseeLog.log(MessageSystemTestEnvironment.class, Level.SEVERE, ex);
+ }
+ }
+
+ /**
+ * stops all currently running file transfers but does not shutdown the file transfer service
+ */
+ public synchronized void stopAllTransfers() throws IOException {
+ OseeLog.log(MessageSystemTestEnvironment.class, Level.FINE, "stopping all transfers");
+ for (Handle handle : handles.values()) {
+ handle.stop();
+ }
+ handles.clear();
+ }
+
+ public synchronized boolean hasActiveTransfers() {
+ return !handles.isEmpty();
+ }
+
+ public boolean isRunning() {
+ final Thread.State state = thread.getState();
+ return state != Thread.State.NEW && state != Thread.State.TERMINATED && !done;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/ElementEntryFactory.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/ElementEntryFactory.java
new file mode 100644
index 000000000..8d1abc77e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/ElementEntryFactory.java
@@ -0,0 +1,145 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.tool.rec;
+
+import org.eclipse.osee.ote.message.elements.ArrayElement;
+import org.eclipse.osee.ote.message.elements.BooleanElement;
+import org.eclipse.osee.ote.message.elements.CharElement;
+import org.eclipse.osee.ote.message.elements.Element;
+import org.eclipse.osee.ote.message.elements.EmptyEnum_Element;
+import org.eclipse.osee.ote.message.elements.EnumeratedElement;
+import org.eclipse.osee.ote.message.elements.FixedPointElement;
+import org.eclipse.osee.ote.message.elements.Float32Element;
+import org.eclipse.osee.ote.message.elements.Float64Element;
+import org.eclipse.osee.ote.message.elements.IElementVisitor;
+import org.eclipse.osee.ote.message.elements.IntegerElement;
+import org.eclipse.osee.ote.message.elements.LongIntegerElement;
+import org.eclipse.osee.ote.message.elements.RealElement;
+import org.eclipse.osee.ote.message.elements.RecordElement;
+import org.eclipse.osee.ote.message.elements.RecordMap;
+import org.eclipse.osee.ote.message.elements.SignedInteger16Element;
+import org.eclipse.osee.ote.message.elements.StringElement;
+import org.eclipse.osee.ote.message.tool.rec.entry.ArrayElementEntry;
+import org.eclipse.osee.ote.message.tool.rec.entry.BooleanElementEntry;
+import org.eclipse.osee.ote.message.tool.rec.entry.CharElementEntry;
+import org.eclipse.osee.ote.message.tool.rec.entry.EmptyEnumEntry;
+import org.eclipse.osee.ote.message.tool.rec.entry.EnumeratedElementEntry;
+import org.eclipse.osee.ote.message.tool.rec.entry.IElementEntry;
+import org.eclipse.osee.ote.message.tool.rec.entry.IntegerElementEntry;
+import org.eclipse.osee.ote.message.tool.rec.entry.LongIntegerElementEntry;
+import org.eclipse.osee.ote.message.tool.rec.entry.RealElementEntry;
+import org.eclipse.osee.ote.message.tool.rec.entry.RecordElementEntry;
+import org.eclipse.osee.ote.message.tool.rec.entry.RecordMapEntry;
+import org.eclipse.osee.ote.message.tool.rec.entry.SignedInteger16ElementEntry;
+import org.eclipse.osee.ote.message.tool.rec.entry.StringElementEntry;
+
+public class ElementEntryFactory {
+
+ private static final class ElementVisitor implements IElementVisitor {
+
+ private IElementEntry entry = null;
+
+ public IElementEntry getEntry() {
+ return entry;
+ }
+
+ @Override
+ public void asCharElement(CharElement element) {
+ entry = new CharElementEntry(element);
+ }
+
+ @Override
+ public void asEnumeratedElement(EnumeratedElement<?> element) {
+ entry = new EnumeratedElementEntry(element);
+ }
+
+ @Override
+ public void asFixedPointElement(FixedPointElement element) {
+ entry = new RealElementEntry(element);
+ }
+
+ @Override
+ public void asFloat32(Float32Element element) {
+ entry = new RealElementEntry(element);
+ }
+
+ @Override
+ public void asFloat64(Float64Element element) {
+ entry = new RealElementEntry(element);
+ }
+
+ @Override
+ public void asGenericElement(Element element) {
+ }
+
+ @Override
+ public void asIntegerElement(IntegerElement element) {
+ entry = new IntegerElementEntry(element);
+ }
+
+ @Override
+ public void asRealElement(RealElement element) {
+ entry = new RealElementEntry(element);
+ }
+
+ @Override
+ public void asRecordElement(RecordElement element) {
+ entry = new RecordElementEntry(element);
+ }
+
+ @Override
+ public void asStringElement(StringElement element) {
+ entry = new StringElementEntry(element);
+ }
+
+ @Override
+ public void asBooleanElement(BooleanElement element) {
+ entry = new BooleanElementEntry(element);
+ }
+
+ @Override
+ public void asRecordMap(RecordMap<? extends RecordElement> element) {
+ entry = new RecordMapEntry(element);
+ }
+
+ @Override
+ public void asEmptyEnumElement(EmptyEnum_Element element) {
+ entry = new EmptyEnumEntry(element);
+ }
+
+ @Override
+ public void asArrayElement(ArrayElement element) {
+ entry = new ArrayElementEntry(element);
+ }
+
+ @Override
+ public void asLongIntegerElement(LongIntegerElement element) {
+ entry = new LongIntegerElementEntry(element);
+ }
+
+ @Override
+ public void asSignedInteger16Element(SignedInteger16Element element) {
+ entry = new SignedInteger16ElementEntry(element);
+ }
+
+ }
+
+ public static IElementEntry createEntry(Element element) {
+
+ ElementVisitor visitor = new ElementVisitor();
+ element.visit(visitor);
+ IElementEntry entry = visitor.getEntry();
+ if (entry != null) {
+ return entry;
+ }
+ throw new IllegalArgumentException("factory cannot generate an entry for class " + element.getClass().getName());
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/IMessageEntryFactory.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/IMessageEntryFactory.java
new file mode 100644
index 000000000..2676cd6e8
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/IMessageEntryFactory.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.tool.rec;
+
+import org.eclipse.osee.framework.jdk.core.type.OseeCoreException;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.tool.rec.entry.IMessageEntry;
+
+public interface IMessageEntryFactory<T extends Message<?, ?, T>> {
+
+ public IMessageEntry createMessageEntry(MessageRecordConfig config, MessageRecorder recorder) throws OseeCoreException;
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/MessageRecordConfig.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/MessageRecordConfig.java
new file mode 100644
index 000000000..80d0698cf
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/MessageRecordConfig.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.tool.rec;
+
+import java.util.Collection;
+import org.eclipse.osee.ote.message.Message;
+import org.eclipse.osee.ote.message.elements.Element;
+import org.eclipse.osee.ote.message.enums.DataType;
+
+public class MessageRecordConfig {
+ private final Message msg;
+ private final Element[] headerElements;
+ private final Element[] bodyElements;
+ private final DataType type;
+ private final boolean headerDump;
+ private final boolean bodyDump;
+
+ public MessageRecordConfig(final Message msg, final DataType type, final boolean headerDump, final Element[] headerElements, final boolean bodyDump, final Element[] bodyElements) {
+ this.msg = msg;
+ this.headerElements = headerElements;
+ this.bodyElements = bodyElements;
+ this.type = type;
+ this.headerDump = headerDump;
+ this.bodyDump = bodyDump;
+ }
+
+ public MessageRecordConfig(final Message msg, final DataType type, Element[] hdrElements) {
+ this.msg = msg;
+ this.headerElements = hdrElements;
+ Collection<Element> elements = msg.getElements();
+ this.bodyElements = elements.toArray(new Element[elements.size()]);
+ this.type = type;
+ this.headerDump = true;
+ this.bodyDump = true;
+ }
+
+ // public MessageRecordConfig(final Message<?, ? ,?> msg, final MemType type) {
+ // super();
+ // this.msg = msg;
+ // this.headerElements = msg.getActiveDataSource().getMsgHeader().getElements();
+ // Collection<Element> vals = msg.getElementMap().values();
+ // this.bodyElements = vals.toArray(new Element[vals.size()]);
+ // this.type = type;
+ // }
+ //
+ // public MessageRecordConfig(final Message<?, ? ,?> msg, Element[] hdrElements) {
+ // super();
+ // this.msg = msg;
+ // this.headerElements = hdrElements;
+ // Collection<Element> vals = msg.getElementMap().values();
+ // this.bodyElements = vals.toArray(new Element[vals.size()]);
+ // this.type = msg.getMemType();
+ // }
+
+ public Element[] getBodyElements() {
+ return bodyElements;
+ }
+
+ public Element[] getHeaderElements() {
+ return headerElements;
+ }
+
+ public boolean getBodyDump() {
+ return bodyDump;
+ }
+
+ public boolean getHeaderDump() {
+ return headerDump;
+ }
+
+ public Message getMsg() {
+ return msg;
+ }
+
+ public DataType getType() {
+ return type;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/MessageRecorder.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/MessageRecorder.java
new file mode 100644
index 000000000..87e6a25b2
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/MessageRecorder.java
@@ -0,0 +1,115 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.tool.rec;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.channels.WritableByteChannel;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.jdk.core.type.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.environment.TestEnvironmentInterface;
+import org.eclipse.osee.ote.core.internal.Activator;
+import org.eclipse.osee.ote.message.MessageSystemTestEnvironment;
+import org.eclipse.osee.ote.message.tool.rec.entry.IMessageEntry;
+
+public class MessageRecorder {
+ private static final int NUM_BUFFERS = 3;
+ private WritableByteChannel channel;
+
+ private final ArrayList<IMessageEntry> msgsToRecord = new ArrayList<>(64);
+ private final Lock recLock = new ReentrantLock();
+ private volatile boolean isRecording = false;
+ private final IMessageEntryFactory factory;
+
+ private final ExecutorService taskHandler = Executors.newFixedThreadPool(2);
+ private final ArrayBlockingQueue<ByteBuffer> bufferQueue = new ArrayBlockingQueue<>(NUM_BUFFERS);
+
+ public MessageRecorder(IMessageEntryFactory factory) {
+ this.factory = factory;
+ try {
+ for (int i = 0; i < NUM_BUFFERS; i++) {
+ bufferQueue.put(ByteBuffer.allocateDirect(256000));
+ }
+ } catch (InterruptedException e) {
+ // this should be absolutely impossible
+ throw new Error("What on Earth has happened here!", e);
+ }
+ }
+
+ public void startRecording(Collection<MessageRecordConfig> list, WritableByteChannel channel) throws OseeCoreException {
+ if (list == null) {
+ throw new IllegalArgumentException("list cannot be null");
+ }
+ if (channel == null) {
+ throw new IllegalArgumentException("channel cannot be null");
+ }
+ recLock.lock();
+ try {
+ this.channel = channel;
+ for (MessageRecordConfig config : list) {
+ IMessageEntry handler = factory.createMessageEntry(config, this);
+ msgsToRecord.add(handler);
+ handler.enable(true);
+ }
+ OseeLog.log(MessageSystemTestEnvironment.class, Level.INFO, "recording " + list.size() + "messages");
+ isRecording = true;
+ } finally {
+ recLock.unlock();
+ }
+ }
+
+ public ByteBuffer acquireOutputBuffer() throws InterruptedException {
+ return bufferQueue.take();
+ }
+
+ public void releaseOutputBuffer(ByteBuffer buffer) throws InterruptedException {
+ bufferQueue.put(buffer);
+ }
+
+ public WritableByteChannel getChannel() {
+ return channel;
+ }
+
+ public Future<?> submitTask(Runnable task) {
+ return taskHandler.submit(task);
+ }
+
+ public boolean isRecording() {
+ return isRecording;
+ }
+
+ public void stopRecording(boolean closeOutputChannel) throws IOException {
+ OseeLog.log(MessageSystemTestEnvironment.class, Level.INFO, "stopping message recorder...");
+ isRecording = false;
+ recLock.lock();
+ try {
+ for (IMessageEntry handler : msgsToRecord) {
+ handler.enable(false);
+ }
+ msgsToRecord.clear();
+ if (closeOutputChannel) {
+ channel.close();
+ }
+ } finally {
+ recLock.unlock();
+ OseeLog.log(MessageSystemTestEnvironment.class, Level.INFO, "message recorder stopped");
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/RecUtil.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/RecUtil.java
new file mode 100644
index 000000000..9f83a0408
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/RecUtil.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.tool.rec;
+
+import java.nio.ByteBuffer;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class RecUtil {
+ private static final int ASCII_A_ADDITIVE = 'A' - 10;
+ private static final int ASCII_0_ADDITIVE = '0';
+
+ /**
+ * a very fast way of converting a byte into a two digit, zero padded hex value that is written directly into a byte
+ * buffer
+ */
+ public static void byteToAsciiHex(byte byteValue, ByteBuffer buffer) {
+ int value = byteValue & 0xFF;
+ int code = value >>> 4;
+ code += code >= 10 ? ASCII_A_ADDITIVE : ASCII_0_ADDITIVE;
+ buffer.put((byte) code);
+ code = value & 0x0F;
+ code += code >= 10 ? ASCII_A_ADDITIVE : ASCII_0_ADDITIVE;
+ buffer.put((byte) code);
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/ArrayElementEntry.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/ArrayElementEntry.java
new file mode 100644
index 000000000..057bffc67
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/ArrayElementEntry.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.tool.rec.entry;
+
+import java.nio.ByteBuffer;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.elements.ArrayElement;
+import org.eclipse.osee.ote.message.tool.rec.RecUtil;
+
+public class ArrayElementEntry implements IElementEntry {
+
+ private final ArrayElement element;
+ private final byte[] nameAsBytes;
+ private static final byte[] LENGTH_BYTES = ".LENGTH".getBytes();
+
+ public ArrayElementEntry(ArrayElement element) {
+ this.element = element;
+ nameAsBytes = element.getElementPathAsString().getBytes();
+ }
+
+ @Override
+ public ArrayElement getElement() {
+ return element;
+ }
+
+ @Override
+ public void write(ByteBuffer buffer, MemoryResource mem, int limit) {
+ mem.setOffset(element.getMsgData().getMem().getOffset());
+ int msgLimit = limit - element.getArrayStartOffset();
+ int length = element.getArrayEndOffset() - element.getArrayStartOffset();
+ length = msgLimit < length ? msgLimit : length;
+ buffer.put(nameAsBytes).put(LENGTH_BYTES).put(COMMA).put(Integer.toString(length).getBytes()).put(COMMA).put(
+ nameAsBytes).put(COMMA);
+ for (int i = 0; i < length; i++) {
+ RecUtil.byteToAsciiHex(element.getValue(mem, i), buffer);
+ buffer.put((byte) ' ');
+ }
+ buffer.put(COMMA);
+ }
+
+ public static void main(String[] args) {
+ ByteBuffer buffer = ByteBuffer.allocate(100);
+
+ RecUtil.byteToAsciiHex((byte) 21, buffer);
+ buffer.put((byte) ' ');
+ RecUtil.byteToAsciiHex((byte) 255, buffer);
+ buffer.put((byte) ' ');
+ RecUtil.byteToAsciiHex((byte) 1, buffer);
+ buffer.put((byte) ' ');
+ RecUtil.byteToAsciiHex((byte) 254, buffer);
+ buffer.put((byte) ' ');
+ RecUtil.byteToAsciiHex((byte) 128, buffer);
+ buffer.put((byte) ' ');
+ RecUtil.byteToAsciiHex((byte) 16, buffer);
+ buffer.put((byte) ' ');
+ RecUtil.byteToAsciiHex((byte) 17, buffer);
+ buffer.put((byte) ' ');
+ RecUtil.byteToAsciiHex((byte) 0, buffer);
+ buffer.put((byte) ' ');
+ RecUtil.byteToAsciiHex((byte) 12, buffer);
+ buffer.flip();
+ byte[] data = new byte[buffer.remaining()];
+ buffer.get(data);
+ String ascii = new String(data);
+ System.out.println(ascii);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/BooleanElementEntry.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/BooleanElementEntry.java
new file mode 100644
index 000000000..2d0004299
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/BooleanElementEntry.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.tool.rec.entry;
+
+import java.nio.ByteBuffer;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.elements.BooleanElement;
+
+public class BooleanElementEntry implements IElementEntry {
+
+ private final BooleanElement element;
+ private final byte[] nameAsBytes;
+
+ public BooleanElementEntry(BooleanElement element) {
+ this.element = element;
+ StringBuilder sb = new StringBuilder();
+ for (int i = 1; i < element.getElementPath().size(); i++) {
+ sb.append(element.getElementPath().get(i));
+ }
+ nameAsBytes = sb.toString().getBytes();
+ // nameAsBytes = element.getName().getBytes();
+ }
+
+ @Override
+ public BooleanElement getElement() {
+ return element;
+ }
+
+ @Override
+ public void write(ByteBuffer buffer, MemoryResource mem, int limit) {
+ mem.setOffset(element.getMsgData().getMem().getOffset());
+ buffer.put(nameAsBytes).put(COMMA).put(element.valueOf(mem).toString().getBytes()).put(COMMA);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/CharElementEntry.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/CharElementEntry.java
new file mode 100644
index 000000000..6bca2c0c4
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/CharElementEntry.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.tool.rec.entry;
+
+import java.nio.ByteBuffer;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.elements.CharElement;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class CharElementEntry implements IElementEntry {
+
+ private final CharElement element;
+ private final byte[] nameAsBytes;
+
+ public CharElementEntry(CharElement element) {
+ this.element = element;
+ nameAsBytes = element.getName().getBytes();
+ }
+
+ @Override
+ public CharElement getElement() {
+ return element;
+ }
+
+ @Override
+ public void write(ByteBuffer buffer, MemoryResource mem, int limit) {
+ mem.setOffset(element.getMsgData().getMem().getOffset());
+ buffer.put(nameAsBytes).put(COMMA).put((byte) element.valueOf(mem).charValue()).put(COMMA);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/EmptyEnumEntry.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/EmptyEnumEntry.java
new file mode 100644
index 000000000..68d1d3021
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/EmptyEnumEntry.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.tool.rec.entry;
+
+import java.nio.ByteBuffer;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.elements.Element;
+import org.eclipse.osee.ote.message.elements.EmptyEnum_Element;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class EmptyEnumEntry implements IElementEntry {
+
+ private final EmptyEnum_Element element;
+ private final byte[] nameAsBytes;
+
+ public EmptyEnumEntry(final EmptyEnum_Element element) {
+ this.element = element;
+ nameAsBytes = element.getName().getBytes();
+ }
+
+ @Override
+ public Element getElement() {
+ return element;
+ }
+
+ @Override
+ public void write(ByteBuffer buffer, MemoryResource mem, int limit) {
+ mem.setOffset(element.getMsgData().getMem().getOffset());
+ buffer.put(nameAsBytes).put(COMMA).put(element.valueOf(mem).toString().getBytes()).put(COMMA);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/EnumeratedElementEntry.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/EnumeratedElementEntry.java
new file mode 100644
index 000000000..750a3785e
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/EnumeratedElementEntry.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.tool.rec.entry;
+
+import java.nio.ByteBuffer;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.elements.EnumeratedElement;
+import org.eclipse.osee.ote.message.elements.IEnumValue;
+
+public class EnumeratedElementEntry implements IElementEntry {
+
+ private final byte[] nameAsBytes;
+ private final byte[][] valueToBytes;
+ private final EnumeratedElement<?> element;
+ private static final byte[] SPACE_LEFT_PAREN = new byte[] {' ', '('};
+
+ public EnumeratedElementEntry(EnumeratedElement<?> element) {
+ this.element = element;
+ nameAsBytes = element.getElementPathAsString().getBytes();
+ valueToBytes = new byte[element.getEnumValues().length][];
+ for (Enum<?> val : element.getEnumValues()) {
+ valueToBytes[val.ordinal()] = val.name().getBytes();
+ }
+ }
+
+ @Override
+ public EnumeratedElement<?> getElement() {
+ return element;
+ }
+
+ @Override
+ public void write(ByteBuffer buffer, MemoryResource mem, int limit) {
+ mem.setOffset(element.getMsgData().getMem().getOffset());
+ Enum<?> val = element.valueOf(mem);
+ byte[] bytes = Integer.toString(((IEnumValue<?>) val).getIntValue()).getBytes();
+ buffer.put(nameAsBytes).put(COMMA).put(valueToBytes[val.ordinal()]);
+ buffer.put(SPACE_LEFT_PAREN).put(bytes).put(RIGHT_PAREN).put(COMMA);
+
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/IElementEntry.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/IElementEntry.java
new file mode 100644
index 000000000..15f422140
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/IElementEntry.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.tool.rec.entry;
+
+import java.nio.ByteBuffer;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.elements.Element;
+
+public interface IElementEntry {
+ public static final byte COMMA = ',';
+ public static final byte EQUALS = '=';
+ public static final byte LEFT_PAREN = '(';
+ public static final byte RIGHT_PAREN = ')';
+ public static final byte TICK = '\'';
+
+ public Element getElement();
+
+ public void write(ByteBuffer buffer, MemoryResource mem, int limit);
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/IMessageEntry.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/IMessageEntry.java
new file mode 100644
index 000000000..a391ca729
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/IMessageEntry.java
@@ -0,0 +1,17 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.tool.rec.entry;
+
+import org.eclipse.osee.ote.message.listener.IOSEEMessageListener;
+
+public interface IMessageEntry extends IOSEEMessageListener {
+ public void enable(boolean enable);
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/IntegerElementEntry.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/IntegerElementEntry.java
new file mode 100644
index 000000000..213201466
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/IntegerElementEntry.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.tool.rec.entry;
+
+import java.nio.ByteBuffer;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.elements.IntegerElement;
+
+public class IntegerElementEntry implements IElementEntry {
+
+ private final IntegerElement element;
+ private final byte[] nameAsBytes;
+
+ public IntegerElementEntry(IntegerElement element) {
+ this.element = element;
+ nameAsBytes = element.getElementPathAsString().getBytes();
+ }
+
+ @Override
+ public IntegerElement getElement() {
+ return element;
+ }
+
+ @Override
+ public void write(ByteBuffer buffer, MemoryResource mem, int limit) {
+ mem.setOffset(element.getMsgData().getMem().getOffset());
+ buffer.put(nameAsBytes).put(COMMA).put(element.valueOf(mem).toString().getBytes()).put(COMMA);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/LongIntegerElementEntry.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/LongIntegerElementEntry.java
new file mode 100644
index 000000000..c27366812
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/LongIntegerElementEntry.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.tool.rec.entry;
+
+import java.nio.ByteBuffer;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.elements.LongIntegerElement;
+
+public class LongIntegerElementEntry implements IElementEntry {
+
+ private final LongIntegerElement element;
+ private final byte[] nameAsBytes;
+
+ public LongIntegerElementEntry(LongIntegerElement element) {
+ this.element = element;
+ nameAsBytes = element.getElementPathAsString().getBytes();
+ }
+
+ @Override
+ public LongIntegerElement getElement() {
+ return element;
+ }
+
+ @Override
+ public void write(ByteBuffer buffer, MemoryResource mem, int limit) {
+ mem.setOffset(element.getMsgData().getMem().getOffset());
+ buffer.put(nameAsBytes).put(COMMA).put(element.valueOf(mem).toString().getBytes()).put(COMMA);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/RealElementEntry.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/RealElementEntry.java
new file mode 100644
index 000000000..31b61dba3
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/RealElementEntry.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.tool.rec.entry;
+
+import java.nio.ByteBuffer;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.elements.RealElement;
+
+public class RealElementEntry implements IElementEntry {
+
+ private final RealElement element;
+ private final byte[] nameAsBytes;
+
+ public RealElementEntry(RealElement element) {
+ this.element = element;
+ nameAsBytes = element.getElementPathAsString().getBytes();
+ }
+
+ @Override
+ public RealElement getElement() {
+ return element;
+ }
+
+ @Override
+ public void write(ByteBuffer buffer, MemoryResource mem, int limit) {
+ mem.setOffset(element.getMsgData().getMem().getOffset());
+ buffer.put(nameAsBytes).put(COMMA).put(element.valueOf(mem).toString().getBytes()).put(COMMA);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/RecordElementEntry.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/RecordElementEntry.java
new file mode 100644
index 000000000..90bb82667
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/RecordElementEntry.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.tool.rec.entry;
+
+import java.nio.ByteBuffer;
+import java.util.Collection;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.elements.Element;
+import org.eclipse.osee.ote.message.elements.RecordElement;
+import org.eclipse.osee.ote.message.tool.rec.ElementEntryFactory;
+
+public class RecordElementEntry implements IElementEntry {
+
+ private final RecordElement element;
+ private final IElementEntry[] entries;
+ private final byte[] nameAsBytes;
+
+ public RecordElementEntry(RecordElement element) {
+ this.element = element;
+ nameAsBytes = element.getName().getBytes();
+ Collection<Element> elements = element.getElementMap().values();
+ entries = new IElementEntry[elements.size()];
+ int i = 0;
+ for (Element elem : elements) {
+ entries[i] = ElementEntryFactory.createEntry(elem);
+ i++;
+ }
+ }
+
+ @Override
+ public RecordElement getElement() {
+ return element;
+ }
+
+ @Override
+ public void write(ByteBuffer buffer, MemoryResource mem, int limit) {
+ // for (IElementEntry entry : entries) {
+ // if (entry.getElement().getByteOffset() < limit) {
+ // buffer.put(nameAsBytes).put((byte)'.');
+ // entry.write(buffer, mem, limit);
+ // buffer.put(COMMA);
+ // }
+ // }
+ }
+
+ public void write(byte[] prefix, ByteBuffer buffer, MemoryResource mem, int limit) {
+ // for (IElementEntry entry : entries) {
+ // if (entry.getElement().getByteOffset() < limit) {
+ // buffer.put(prefix).put(nameAsBytes).put((byte)'.');
+ // entry.write(buffer, mem, limit);
+ // buffer.put(COMMA);
+ // }
+ // }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/RecordMapEntry.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/RecordMapEntry.java
new file mode 100644
index 000000000..0126519bf
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/RecordMapEntry.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.tool.rec.entry;
+
+import java.nio.ByteBuffer;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.elements.Element;
+import org.eclipse.osee.ote.message.elements.RecordElement;
+import org.eclipse.osee.ote.message.elements.RecordMap;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class RecordMapEntry implements IElementEntry {
+
+ private final RecordMap<? extends RecordElement> element;
+ private final RecordElementEntry[] entries;
+
+ public RecordMapEntry(final RecordMap<? extends RecordElement> element) {
+ this.element = element;
+ entries = new RecordElementEntry[element.length()];
+
+ for (int i = 0; i < element.length(); i++) {
+ entries[i] = new RecordElementEntry(element.get(i));
+ }
+ }
+
+ @Override
+ public Element getElement() {
+ return element;
+ }
+
+ @Override
+ public void write(ByteBuffer buffer, MemoryResource mem, int limit) {
+ // for (int i = 0; i < element.length(); i++) {
+ // if (entries[i].getElement().getByteOffset() < limit) {
+ // final byte[] prefix = String.format("[%d]", i).getBytes();
+ // entries[i].write(prefix, buffer, mem, limit);
+ // buffer.put(COMMA);
+ // }
+ // }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/SignedInteger16ElementEntry.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/SignedInteger16ElementEntry.java
new file mode 100644
index 000000000..85a289b97
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/SignedInteger16ElementEntry.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.tool.rec.entry;
+
+import java.nio.ByteBuffer;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.elements.SignedInteger16Element;
+
+public class SignedInteger16ElementEntry implements IElementEntry {
+
+ private final SignedInteger16Element element;
+ private final byte[] nameAsBytes;
+
+ public SignedInteger16ElementEntry(SignedInteger16Element element) {
+ this.element = element;
+ nameAsBytes = element.getName().getBytes();
+ }
+
+ @Override
+ public SignedInteger16Element getElement() {
+ return element;
+ }
+
+ @Override
+ public void write(ByteBuffer buffer, MemoryResource mem, int limit) {
+ mem.setOffset(element.getMsgData().getMem().getOffset());
+ buffer.put(nameAsBytes).put(COMMA).put(element.valueOf(mem).toString().getBytes()).put(COMMA);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/StringElementEntry.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/StringElementEntry.java
new file mode 100644
index 000000000..a62cb1a89
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/message/tool/rec/entry/StringElementEntry.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.message.tool.rec.entry;
+
+import java.nio.ByteBuffer;
+import org.eclipse.osee.ote.message.data.MemoryResource;
+import org.eclipse.osee.ote.message.elements.StringElement;
+
+public class StringElementEntry implements IElementEntry {
+
+ private final StringElement element;
+ private final byte[] nameAsBytes;
+
+ public StringElementEntry(final StringElement element) {
+ this.element = element;
+ nameAsBytes = element.getName().getBytes();
+ }
+
+ @Override
+ public StringElement getElement() {
+ return element;
+ }
+
+ @Override
+ public void write(ByteBuffer buffer, MemoryResource mem, int limit) {
+ mem.setOffset(element.getMsgData().getMem().getOffset());
+ buffer.put(nameAsBytes).put(COMMA).put(TICK).put(element.valueOf(mem).getBytes()).put(TICK).put(COMMA);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/AVAILABLE_PHYSICAL_TYPES_REQ.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/AVAILABLE_PHYSICAL_TYPES_REQ.java
new file mode 100644
index 000000000..3188e5667
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/AVAILABLE_PHYSICAL_TYPES_REQ.java
@@ -0,0 +1,14 @@
+package org.eclipse.osee.ote.remote.messages;
+
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+
+public class AVAILABLE_PHYSICAL_TYPES_REQ extends OteEventMessage {
+
+ public static String TOPIC = "ote/message/availabletypesreq";
+
+ public AVAILABLE_PHYSICAL_TYPES_REQ() {
+ super("AVAILABLE_PHYSICAL_TYPES_REQ", TOPIC, 0);
+
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/BooleanResponse.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/BooleanResponse.java
new file mode 100644
index 000000000..f9a161f5f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/BooleanResponse.java
@@ -0,0 +1,19 @@
+package org.eclipse.osee.ote.remote.messages;
+
+import org.eclipse.osee.ote.message.elements.BooleanElement;
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+
+public class BooleanResponse extends OteEventMessage {
+
+ public static String TOPIC = "ote/message/boolresponse";
+
+ private static int SIZE = 1;
+
+ public BooleanElement VALUE;
+
+ public BooleanResponse() {
+ super("MESSAGE_META_DATA_STAT", TOPIC, SIZE);
+ VALUE = new BooleanElement(this, "IS_SCHEDULED", getDefaultMessageData(), 0, 0, 7);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/ConfigurationAndResponse.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/ConfigurationAndResponse.java
new file mode 100644
index 000000000..44aa10aab
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/ConfigurationAndResponse.java
@@ -0,0 +1,45 @@
+package org.eclipse.osee.ote.remote.messages;
+
+import java.io.Serializable;
+
+import org.eclipse.osee.ote.Configuration;
+
+public class ConfigurationAndResponse implements Serializable {
+
+ private static final long serialVersionUID = 8496858852630392143L;
+
+ private final String address;
+ private final int port;
+ private final boolean install;
+ private final Configuration configuration;
+ private final String id;
+
+ public ConfigurationAndResponse(String address, int port, Configuration configuration, boolean install, String id){
+ this.address = address;
+ this.port = port;
+ this.configuration = configuration;
+ this.install = install;
+ this.id = id;
+ }
+
+ public String getAddress(){
+ return address;
+ }
+
+ public int getPort(){
+ return port;
+ }
+
+ public Configuration getConfiguration(){
+ return configuration;
+ }
+
+ public boolean install(){
+ return install;
+ }
+
+ public String getId(){
+ return id;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/ConsoleInputMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/ConsoleInputMessage.java
new file mode 100644
index 000000000..7162047b9
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/ConsoleInputMessage.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.remote.messages;
+
+public class ConsoleInputMessage extends ConsoleMessage {
+
+ public static String TOPIC = "ote/message/consoleinput";
+
+ public ConsoleInputMessage() {
+ super(ConsoleInputMessage.class.getSimpleName(), TOPIC);
+ }
+}
+
+
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/ConsoleMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/ConsoleMessage.java
new file mode 100644
index 000000000..9038b7ff7
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/ConsoleMessage.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.remote.messages;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+import org.eclipse.osee.ote.message.elements.ArrayElement;
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+
+
+public class ConsoleMessage extends OteEventMessage {
+
+ public static final int _BYTE_SIZE = 0;
+ public ArrayElement STRINGDATA;
+
+ public ConsoleMessage(String name, String topic) {
+ super(ConsoleMessage.class.getSimpleName(), topic, _BYTE_SIZE);
+ STRINGDATA = new ArrayElement(this, "STRINGDATA", getDefaultMessageData(), 0, 0, 0);
+ addElements(STRINGDATA);
+ }
+
+ public void setString(String str) throws IOException{
+ byte[] data = str.getBytes();
+ int offset = STRINGDATA.getByteOffset() + getHeaderSize();
+ byte[] newData = new byte[data.length + offset];
+ System.arraycopy(getData(), 0, newData, 0, offset);
+ System.arraycopy(data, 0, newData, offset, data.length);
+ getDefaultMessageData().setNewBackingBuffer(newData);
+ }
+
+ public String getString() throws IOException, ClassNotFoundException{
+ int offset = STRINGDATA.getByteOffset() + getHeaderSize();
+ byte[] stringData = new byte[getData().length - offset];
+ System.arraycopy(getData(), offset, stringData, 0, stringData.length);
+ return new String(stringData);
+ }
+
+ public void setStringData(ByteBuffer buffer) {
+ int offset = STRINGDATA.getByteOffset() + getHeaderSize();
+ byte[] newData = new byte[buffer.remaining() + offset];
+ System.arraycopy(getData(), 0, newData, 0, offset);
+ buffer.get(newData, offset, buffer.remaining());
+ getDefaultMessageData().setNewBackingBuffer(newData);
+ }
+}
+
+
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/ConsoleOutputMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/ConsoleOutputMessage.java
new file mode 100644
index 000000000..40cfcea7c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/ConsoleOutputMessage.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.remote.messages;
+
+
+public class ConsoleOutputMessage extends ConsoleMessage {
+
+ public static String TOPIC = "ote/message/consoleoutput";
+
+ public ConsoleOutputMessage() {
+ super(ConsoleOutputMessage.class.getSimpleName(), TOPIC);
+ }
+
+}
+
+
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/DisconnectRemoteTestEnvironment.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/DisconnectRemoteTestEnvironment.java
new file mode 100644
index 000000000..5f02abb23
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/DisconnectRemoteTestEnvironment.java
@@ -0,0 +1,19 @@
+package org.eclipse.osee.ote.remote.messages;
+
+import java.io.Serializable;
+import java.util.UUID;
+
+public class DisconnectRemoteTestEnvironment implements Serializable {
+
+ private static final long serialVersionUID = 1100894850334052780L;
+
+ private UUID id;
+
+ public DisconnectRemoteTestEnvironment(UUID id){
+ this.id = id;
+ }
+
+ public UUID getId() {
+ return id;
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/GET_INET_ADDRESS_REQ.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/GET_INET_ADDRESS_REQ.java
new file mode 100644
index 000000000..3cdb9e96f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/GET_INET_ADDRESS_REQ.java
@@ -0,0 +1,19 @@
+package org.eclipse.osee.ote.remote.messages;
+
+import org.eclipse.osee.ote.message.elements.EnumeratedElement;
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+
+public class GET_INET_ADDRESS_REQ extends OteEventMessage {
+
+ public static String TOPIC = "ote/message/addressreq";
+
+ public final EnumeratedElement<SOCKET_ID> SOCKET_ID;
+
+ public GET_INET_ADDRESS_REQ() {
+ super("GET_INET_ADDRESS_REQ", TOPIC, 1);
+ SOCKET_ID = createEnumeratedElement("SOCKET_ID", 1, SOCKET_ID.class);
+
+ getDefaultMessageData().getMsgHeader().RESPONSE_TOPIC.setValue(GET_INET_ADDRESS_RESP.TOPIC);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/GET_INET_ADDRESS_RESP.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/GET_INET_ADDRESS_RESP.java
new file mode 100644
index 000000000..75c51b457
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/GET_INET_ADDRESS_RESP.java
@@ -0,0 +1,20 @@
+package org.eclipse.osee.ote.remote.messages;
+
+import org.eclipse.osee.ote.message.elements.EnumeratedElement;
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+import org.eclipse.osee.ote.message.event.SOCKET_ADDRESS_RECORD;
+
+public class GET_INET_ADDRESS_RESP extends OteEventMessage {
+
+ public static String TOPIC = "ote/message/addressresp";
+
+ public final EnumeratedElement<SOCKET_ID> SOCKET_ID;
+ public final SOCKET_ADDRESS_RECORD ADDRESS;
+
+ public GET_INET_ADDRESS_RESP() {
+ super("GET_INET_ADDRESS_RESP", TOPIC, 22);
+ SOCKET_ID = createEnumeratedElement("SOCKET_ID", 1, SOCKET_ID.class);
+ ADDRESS = new SOCKET_ADDRESS_RECORD(this, "ADDRESS", getDefaultMessageData(), 1, 0, SOCKET_ADDRESS_RECORD.SIZE*8-1);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/JobStatus.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/JobStatus.java
new file mode 100644
index 000000000..4096e0bab
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/JobStatus.java
@@ -0,0 +1,90 @@
+package org.eclipse.osee.ote.remote.messages;
+
+import java.io.Serializable;
+import java.net.URL;
+
+public class JobStatus implements Serializable {
+
+ private static final long serialVersionUID = -5316721802558614714L;
+ private URL updatedJobStatus;
+ private String jobId;
+
+ private int totalUnitsOfWork;
+ private int unitsWorked;
+ private String errorLog;
+ private boolean jobComplete;
+ private boolean success;
+
+ public JobStatus(){
+ errorLog = "";
+ jobComplete = false;
+ success = true;
+ totalUnitsOfWork = 0;
+ unitsWorked = 0;
+ }
+
+ public int getTotalUnitsOfWork() {
+ return totalUnitsOfWork;
+ }
+
+ public int getUnitsWorked() {
+ return unitsWorked;
+ }
+
+ public String getErrorLog() {
+ return errorLog;
+ }
+
+ public boolean isJobComplete() {
+ return jobComplete;
+ }
+
+ public void setTotalUnitsOfWork(int i) {
+ totalUnitsOfWork = i;
+ }
+
+ public void jobComplete() {
+ jobComplete = true;
+ }
+
+ public void incrememtUnitsWorked() {
+ unitsWorked++;
+ }
+
+ public void setUnitsWorked(int unitsWorked) {
+ this.unitsWorked = unitsWorked;
+ }
+
+ public void setErrorLog(String log) {
+ this.errorLog = log;
+ }
+
+ public void setJobComplete(boolean jobComplete) {
+ this.jobComplete = jobComplete;
+ }
+
+ public boolean isSuccess() {
+ return success;
+ }
+
+ public void setSuccess(boolean success) {
+ this.success = success;
+ }
+
+ public URL getUpdatedJobStatus() {
+ return updatedJobStatus;
+ }
+
+ public void setUpdatedJobStatus(URL updatedJobStatus) {
+ this.updatedJobStatus = updatedJobStatus;
+ }
+
+ public String getJobId() {
+ return jobId;
+ }
+
+ public void setJobId(String jobId) {
+ this.jobId = jobId;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/MESSAGE_META_DATA_STAT.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/MESSAGE_META_DATA_STAT.java
new file mode 100644
index 000000000..8fcde751b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/MESSAGE_META_DATA_STAT.java
@@ -0,0 +1,26 @@
+package org.eclipse.osee.ote.remote.messages;
+
+import org.eclipse.osee.ote.message.elements.BooleanElement;
+import org.eclipse.osee.ote.message.elements.Float64Element;
+import org.eclipse.osee.ote.message.elements.RealElement;
+import org.eclipse.osee.ote.message.elements.StringElement;
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+
+public class MESSAGE_META_DATA_STAT extends OteEventMessage {
+
+ public static String TOPIC = "ote/message/metadatastat";
+
+ private static int SIZE = 256+4+1;
+
+ public StringElement MESSAGE;
+ public BooleanElement IS_SCHEDULED;
+ public RealElement RATE;
+
+ public MESSAGE_META_DATA_STAT() {
+ super("MESSAGE_META_DATA_STAT", TOPIC, SIZE);
+ MESSAGE = new StringElement(this, "MESSAGE", getDefaultMessageData(), 0, 0, OteEventMessage.sizeBytesBits(256));
+ IS_SCHEDULED = new BooleanElement(this, "IS_SCHEDULED", getDefaultMessageData(), MESSAGE.getByteOffset()+MESSAGE.getBitLength()/8, 0, 7);
+ RATE = new Float64Element(this, "IS_WRITER", getDefaultMessageData(), IS_SCHEDULED.getByteOffset()+IS_SCHEDULED.getBitLength()/8, 0, 63);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RECORDING_COMPLETE.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RECORDING_COMPLETE.java
new file mode 100644
index 000000000..cfd525b26
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RECORDING_COMPLETE.java
@@ -0,0 +1,13 @@
+package org.eclipse.osee.ote.remote.messages;
+
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+
+public class RECORDING_COMPLETE extends OteEventMessage {
+
+ public static String TOPIC = "ote/message/recordingComplete";
+
+ public RECORDING_COMPLETE() {
+ super("RECORDING_COMPLETE", TOPIC, 0);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RequestHostEnvironmentProperties.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RequestHostEnvironmentProperties.java
new file mode 100644
index 000000000..052e615ad
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RequestHostEnvironmentProperties.java
@@ -0,0 +1,15 @@
+package org.eclipse.osee.ote.remote.messages;
+
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+
+public class RequestHostEnvironmentProperties extends OteEventMessage {
+
+ public static String TOPIC = "ote/message/propertiesreq";
+
+ public RequestHostEnvironmentProperties() {
+ super("RequestHostEnvironmentProperties", TOPIC, 1);
+
+ getDefaultMessageData().getMsgHeader().RESPONSE_TOPIC.setValue(SerializedEnhancedProperties.EVENT);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RequestRemoteTestEnvironment.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RequestRemoteTestEnvironment.java
new file mode 100644
index 000000000..a3f4a8309
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RequestRemoteTestEnvironment.java
@@ -0,0 +1,35 @@
+package org.eclipse.osee.ote.remote.messages;
+
+import java.io.Serializable;
+import java.util.UUID;
+
+import org.eclipse.osee.ote.core.IRemoteUserSession;
+import org.eclipse.osee.ote.core.environment.TestEnvironmentConfig;
+
+public class RequestRemoteTestEnvironment implements Serializable {
+
+ private static final long serialVersionUID = -6720107128761044291L;
+
+ private IRemoteUserSession session;
+ private UUID id;
+ private TestEnvironmentConfig config;
+
+ public RequestRemoteTestEnvironment(IRemoteUserSession session, UUID id, TestEnvironmentConfig config){
+ this.session = session;
+ this.id = id;
+ this.config = config;
+ }
+
+ public IRemoteUserSession getSession() {
+ return session;
+ }
+
+ public UUID getId() {
+ return id;
+ }
+
+ public TestEnvironmentConfig getConfig() {
+ return config;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RunTestsCancel.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RunTestsCancel.java
new file mode 100644
index 000000000..d4889eab2
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RunTestsCancel.java
@@ -0,0 +1,29 @@
+package org.eclipse.osee.ote.remote.messages;
+
+import org.eclipse.osee.ote.message.elements.BooleanElement;
+import org.eclipse.osee.ote.message.elements.StringElement;
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+
+public class RunTestsCancel extends OteEventMessage {
+
+ public static String TOPIC = "ote/message/runtests/cancel";
+
+ private static int SIZE = 256+1;
+
+ public StringElement GUID;
+ public BooleanElement CANCEL_ALL;
+
+ public RunTestsCancel() {
+ super("MESSAGE_META_DATA_STAT", TOPIC, SIZE);
+ GUID = new StringElement(this, "GUID", getDefaultMessageData(), 0, 0, OteEventMessage.sizeBytesBits(256));
+ CANCEL_ALL = new BooleanElement(this, "CANCEL_ALL", getDefaultMessageData(), GUID.getByteOffset()+GUID.getBitLength()/8, 0, 7);
+
+ getDefaultMessageData().getMsgHeader().RESPONSE_TOPIC.setValue(BooleanResponse.TOPIC);
+ }
+
+ public RunTestsCancel(byte[] bytes) {
+ this();
+ setData(bytes);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RunTestsGetCommandResultReq.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RunTestsGetCommandResultReq.java
new file mode 100644
index 000000000..d5e2f4a4a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RunTestsGetCommandResultReq.java
@@ -0,0 +1,25 @@
+package org.eclipse.osee.ote.remote.messages;
+
+import org.eclipse.osee.ote.message.elements.StringElement;
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+
+public class RunTestsGetCommandResultReq extends OteEventMessage {
+
+ public static String TOPIC = "ote/message/runtests/commandresultreq";
+
+ private static int SIZE = 256;
+
+ public StringElement GUID;
+
+ public RunTestsGetCommandResultReq() {
+ super("MESSAGE_META_DATA_STAT", TOPIC, SIZE);
+ GUID = new StringElement(this, "MESSAGE", getDefaultMessageData(), 0, 0, OteEventMessage.sizeBytesBits(256));
+ getDefaultMessageData().getMsgHeader().RESPONSE_TOPIC.setValue(BooleanResponse.TOPIC);
+ }
+
+ public RunTestsGetCommandResultReq(byte[] bytes) {
+ this();
+ setData(bytes);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RunTestsGetCommandResultResp.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RunTestsGetCommandResultResp.java
new file mode 100644
index 000000000..cfc1c6e54
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RunTestsGetCommandResultResp.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.remote.messages;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.core.framework.command.ITestCommandResult;
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class RunTestsGetCommandResultResp extends SerializedClassMessage<ITestCommandResult> {
+
+ public static final String TOPIC = "ote/message/runtests/commandresultresp";
+
+ public RunTestsGetCommandResultResp() {
+ super(TOPIC);
+ }
+
+ public RunTestsGetCommandResultResp(ITestCommandResult commandAdded) throws IOException {
+ super(TOPIC, commandAdded);
+ }
+
+ public RunTestsGetCommandResultResp(byte[] bytes){
+ super(bytes);
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RunTestsIsCancelled.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RunTestsIsCancelled.java
new file mode 100644
index 000000000..cc8aec621
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RunTestsIsCancelled.java
@@ -0,0 +1,26 @@
+package org.eclipse.osee.ote.remote.messages;
+
+import org.eclipse.osee.ote.message.elements.StringElement;
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+
+public class RunTestsIsCancelled extends OteEventMessage {
+
+ public static String TOPIC = "ote/message/runtests/iscanceled";
+
+ private static int SIZE = 256;
+
+ public StringElement GUID;
+
+ public RunTestsIsCancelled() {
+ super("MESSAGE_META_DATA_STAT", TOPIC, SIZE);
+ GUID = new StringElement(this, "MESSAGE", getDefaultMessageData(), 0, 0, OteEventMessage.sizeBytesBits(256));
+
+ getDefaultMessageData().getMsgHeader().RESPONSE_TOPIC.setValue(BooleanResponse.TOPIC);
+ }
+
+ public RunTestsIsCancelled(byte[] bytes) {
+ this();
+ setData(bytes);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RunTestsIsDone.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RunTestsIsDone.java
new file mode 100644
index 000000000..5ad7b3cfd
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RunTestsIsDone.java
@@ -0,0 +1,26 @@
+package org.eclipse.osee.ote.remote.messages;
+
+import org.eclipse.osee.ote.message.elements.StringElement;
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+
+public class RunTestsIsDone extends OteEventMessage {
+
+ public static String TOPIC = "ote/message/runtests/isdone";
+
+ private static int SIZE = 256;
+
+ public StringElement GUID;
+
+ public RunTestsIsDone() {
+ super("MESSAGE_META_DATA_STAT", TOPIC, SIZE);
+ GUID = new StringElement(this, "MESSAGE", getDefaultMessageData(), 0, 0, OteEventMessage.sizeBytesBits(256));
+
+ getDefaultMessageData().getMsgHeader().RESPONSE_TOPIC.setValue(BooleanResponse.TOPIC);
+ }
+
+ public RunTestsIsDone(byte[] bytes) {
+ this();
+ setData(bytes);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RunTestsSerialized.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RunTestsSerialized.java
new file mode 100644
index 000000000..12c3a6ebe
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/RunTestsSerialized.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ConfigurationAndResponse * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.remote.messages;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.core.framework.command.RunTests;
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class RunTestsSerialized extends SerializedClassMessage<RunTests> {
+
+ public static final String RUNTESTS_NAMESPACE = "ote/message/runtests/";
+ public static final String TOPIC = RUNTESTS_NAMESPACE + "serialized";
+
+ public RunTestsSerialized() {
+ super(TOPIC);
+ }
+
+ public RunTestsSerialized(RunTests commandAdded) throws IOException {
+ super(TOPIC, commandAdded);
+ }
+
+ public RunTestsSerialized(byte[] bytes){
+ super(bytes);
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SOCKET_ID.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SOCKET_ID.java
new file mode 100644
index 000000000..550e93954
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SOCKET_ID.java
@@ -0,0 +1,83 @@
+/*
+ * PLACE_YOUR_DISTRIBUTION_STATEMENT_RIGHT_HERE
+ */
+package org.eclipse.osee.ote.remote.messages;
+
+import org.eclipse.osee.ote.message.elements.IEnumValue;
+
+public enum SOCKET_ID implements IEnumValue<SOCKET_ID> {
+
+ MSG_UPDATES(0),
+ RECORDER(1),
+
+ __UNDEFINED(-99999);
+
+ private int value;
+ private static int maxValue = 0;
+
+ private static SOCKET_ID[] lbaValues;
+ private static SOCKET_ID[] lookup = null;
+
+ static {
+ lbaValues();
+ if(maxValue < 32000){
+ lookup = new SOCKET_ID[maxValue + 1];
+ for(int i = 0; i < lbaValues.length; i++){
+ lookup[lbaValues[i].value] = lbaValues[i];
+ }
+ }
+ }
+
+ private SOCKET_ID(int value) {
+ this.value = value;
+ }
+
+ @Override
+ public int getIntValue(){
+ return value;
+ }
+
+ public static SOCKET_ID toEnum(int value){
+ if(lookup == null){
+ for(SOCKET_ID myEnum: values()){
+ if(myEnum.getIntValue() == value){
+ return myEnum;
+ }
+ }
+ __UNDEFINED.value = value;
+ return __UNDEFINED;
+ } else if(value < 0 || value >= lookup.length ){
+ __UNDEFINED.value = value;
+ return __UNDEFINED;
+ } else {
+ SOCKET_ID enumeration = lookup[value];
+ if(enumeration == null){
+ __UNDEFINED.value = value;
+ return __UNDEFINED;
+ } else {
+ return enumeration;
+ }
+ }
+ }
+
+ @Override
+ public SOCKET_ID getEnum(int value){
+ return toEnum(value);
+ }
+
+ public static SOCKET_ID[] lbaValues(){
+ if(lbaValues == null){
+ int count = 0;
+ lbaValues = new SOCKET_ID[values().length-1];
+ for(SOCKET_ID myEnum: values()){
+ if(!"__UNDEFINED".equals(myEnum.name())){
+ lbaValues[count++] = myEnum;
+ if(myEnum.value > maxValue){
+ maxValue = myEnum.value;
+ }
+ }
+ }
+ }
+ return lbaValues;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/STOP_RECORDING_CMD.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/STOP_RECORDING_CMD.java
new file mode 100644
index 000000000..079a1021b
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/STOP_RECORDING_CMD.java
@@ -0,0 +1,13 @@
+package org.eclipse.osee.ote.remote.messages;
+
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+
+public class STOP_RECORDING_CMD extends OteEventMessage {
+
+ public static String TOPIC = "ote/message/recordstop";
+
+ public STOP_RECORDING_CMD() {
+ super("STOP_RECORDING_CMD", TOPIC, 0);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedAvailablePhysicalTypesMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedAvailablePhysicalTypesMessage.java
new file mode 100644
index 000000000..24b8a1b45
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedAvailablePhysicalTypesMessage.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ConfigurationAndResponse * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.remote.messages;
+
+import java.io.IOException;
+import java.util.HashSet;
+
+import org.eclipse.osee.ote.message.enums.DataType;
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class SerializedAvailablePhysicalTypesMessage extends SerializedClassMessage<HashSet<DataType>> {
+
+ public static final String EVENT = "ote/message/serialavailabletypes";
+
+ public SerializedAvailablePhysicalTypesMessage() {
+ super(EVENT);
+ }
+
+ public SerializedAvailablePhysicalTypesMessage(HashSet<DataType> commandAdded) throws IOException {
+ super(EVENT, commandAdded);
+ }
+
+ public SerializedAvailablePhysicalTypesMessage(byte[] bytes){
+ super(bytes);
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedConfigurationAndResponse.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedConfigurationAndResponse.java
new file mode 100644
index 000000000..c53cb9e79
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedConfigurationAndResponse.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ConfigurationAndResponse * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.remote.messages;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class SerializedConfigurationAndResponse extends SerializedClassMessage<ConfigurationAndResponse> {
+
+ public static final String EVENT = "ote/message/serialconfigandresponse";
+
+ public SerializedConfigurationAndResponse() {
+ super(EVENT);
+ }
+
+ public SerializedConfigurationAndResponse(ConfigurationAndResponse commandAdded) throws IOException {
+ super(EVENT, commandAdded);
+ }
+
+ public SerializedConfigurationAndResponse(byte[] bytes){
+ super(bytes);
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedConnectionRequestResult.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedConnectionRequestResult.java
new file mode 100644
index 000000000..1fed31679
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedConnectionRequestResult.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.remote.messages;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.core.ConnectionRequestResult;
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class SerializedConnectionRequestResult extends SerializedClassMessage<ConnectionRequestResult> {
+
+ public static final String EVENT = "ote/message/connectionrequestresult";
+
+ public SerializedConnectionRequestResult() {
+ super(EVENT);
+ }
+
+ public SerializedConnectionRequestResult(ConnectionRequestResult commandAdded) throws IOException {
+ super(EVENT, commandAdded);
+ }
+
+ public SerializedConnectionRequestResult(byte[] bytes){
+ super(bytes);
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedDisconnectRemoteTestEnvironment.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedDisconnectRemoteTestEnvironment.java
new file mode 100644
index 000000000..c9f0c396c
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedDisconnectRemoteTestEnvironment.java
@@ -0,0 +1,22 @@
+package org.eclipse.osee.ote.remote.messages;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class SerializedDisconnectRemoteTestEnvironment extends SerializedClassMessage<DisconnectRemoteTestEnvironment> {
+
+ public static final String TOPIC = "ote/message/serialdisconnecttestenv";
+
+ public SerializedDisconnectRemoteTestEnvironment() {
+ super(TOPIC);
+ }
+
+ public SerializedDisconnectRemoteTestEnvironment(DisconnectRemoteTestEnvironment commandAdded) throws IOException {
+ super(TOPIC, commandAdded);
+ }
+
+ public SerializedDisconnectRemoteTestEnvironment(byte[] bytes){
+ super(bytes);
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedEnhancedProperties.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedEnhancedProperties.java
new file mode 100644
index 000000000..9552f8f09
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedEnhancedProperties.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ConfigurationAndResponse * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.remote.messages;
+
+import java.io.IOException;
+
+import org.eclipse.osee.framework.jdk.core.util.EnhancedProperties;
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class SerializedEnhancedProperties extends SerializedClassMessage<EnhancedProperties> {
+
+ public static final String EVENT = "ote/message/enhancedproperties";
+
+ public SerializedEnhancedProperties() {
+ super(EVENT);
+ }
+
+ public SerializedEnhancedProperties(EnhancedProperties commandAdded) throws IOException {
+ super(EVENT, commandAdded);
+ }
+
+ public SerializedEnhancedProperties(byte[] bytes){
+ super(bytes);
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedOTEJobStatus.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedOTEJobStatus.java
new file mode 100644
index 000000000..8fbf3de27
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedOTEJobStatus.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.remote.messages;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class SerializedOTEJobStatus extends SerializedClassMessage<JobStatus> {
+
+ public static final String EVENT = "ote/message/otejobstatus";
+
+ public SerializedOTEJobStatus() {
+ super(EVENT);
+ }
+
+ public SerializedOTEJobStatus(JobStatus commandAdded) throws IOException {
+ super(EVENT, commandAdded);
+ }
+
+ public SerializedOTEJobStatus(byte[] bytes){
+ super(bytes);
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedRecordCommandMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedRecordCommandMessage.java
new file mode 100644
index 000000000..90daafc85
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedRecordCommandMessage.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.remote.messages;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.message.commands.RecordCommand;
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class SerializedRecordCommandMessage extends SerializedClassMessage<RecordCommand> {
+
+ public static final String EVENT = "ote/message/recordstart";
+
+ public SerializedRecordCommandMessage() {
+ super(EVENT);
+ }
+
+ public SerializedRecordCommandMessage(RecordCommand commandAdded) throws IOException {
+ super(EVENT, commandAdded);
+ }
+
+ public SerializedRecordCommandMessage(byte[] bytes){
+ super(bytes);
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedRequestRemoteTestEnvironment.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedRequestRemoteTestEnvironment.java
new file mode 100644
index 000000000..b321c2151
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedRequestRemoteTestEnvironment.java
@@ -0,0 +1,24 @@
+package org.eclipse.osee.ote.remote.messages;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class SerializedRequestRemoteTestEnvironment extends SerializedClassMessage<RequestRemoteTestEnvironment> {
+
+ public static final String TOPIC = "ote/message/serialrequesttestenv";
+
+ public SerializedRequestRemoteTestEnvironment() {
+ super(TOPIC);
+
+ getHeader().RESPONSE_TOPIC.setValue(SerializedConnectionRequestResult.EVENT);
+ }
+
+ public SerializedRequestRemoteTestEnvironment(RequestRemoteTestEnvironment commandAdded) throws IOException {
+ super(TOPIC, commandAdded);
+ }
+
+ public SerializedRequestRemoteTestEnvironment(byte[] bytes){
+ super(bytes);
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedSetElementMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedSetElementMessage.java
new file mode 100644
index 000000000..0f6ba5607
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedSetElementMessage.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.remote.messages;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.message.commands.SetElementValue;
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class SerializedSetElementMessage extends SerializedClassMessage<SetElementValue> {
+
+ public static final String EVENT = "ote/message/setelement";
+
+ public SerializedSetElementMessage() {
+ super(EVENT);
+ }
+
+ public SerializedSetElementMessage(SetElementValue commandAdded) throws IOException {
+ super(EVENT, commandAdded);
+ }
+
+ public SerializedSetElementMessage(byte[] bytes){
+ super(bytes);
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedSubscribeToMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedSubscribeToMessage.java
new file mode 100644
index 000000000..ad86df855
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedSubscribeToMessage.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.remote.messages;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.message.commands.SubscribeToMessage;
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class SerializedSubscribeToMessage extends SerializedClassMessage<SubscribeToMessage> {
+
+ public static final String EVENT = "ote/message/subscriptiondetails";
+
+ public SerializedSubscribeToMessage() {
+ super(EVENT);
+ }
+
+ public SerializedSubscribeToMessage(SubscribeToMessage commandAdded) throws IOException {
+ super(EVENT, commandAdded);
+ }
+
+ public SerializedSubscribeToMessage(byte[] bytes){
+ super(bytes);
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedSubscriptionDetailsMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedSubscriptionDetailsMessage.java
new file mode 100644
index 000000000..584587430
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedSubscriptionDetailsMessage.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.remote.messages;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+import org.eclipse.osee.ote.message.tool.SubscriptionDetails;
+
+public class SerializedSubscriptionDetailsMessage extends SerializedClassMessage<SubscriptionDetails> {
+
+ public static final String EVENT = "ote/message/subscribeserial";
+
+ public SerializedSubscriptionDetailsMessage() {
+ super(EVENT);
+ }
+
+ public SerializedSubscriptionDetailsMessage(SubscriptionDetails commandAdded) throws IOException {
+ super(EVENT, commandAdded);
+ }
+
+ public SerializedSubscriptionDetailsMessage(byte[] bytes){
+ super(bytes);
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedUnSubscribeMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedUnSubscribeMessage.java
new file mode 100644
index 000000000..e9665626a
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedUnSubscribeMessage.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.remote.messages;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.message.commands.UnSubscribeToMessage;
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class SerializedUnSubscribeMessage extends SerializedClassMessage<UnSubscribeToMessage> {
+
+ public static final String EVENT = "ote/message/unsubscribeserial";
+
+ public SerializedUnSubscribeMessage() {
+ super(EVENT);
+ }
+
+ public SerializedUnSubscribeMessage(UnSubscribeToMessage commandAdded) throws IOException {
+ super(EVENT, commandAdded);
+ }
+
+ public SerializedUnSubscribeMessage(byte[] bytes){
+ super(bytes);
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedZeroizeElementMessage.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedZeroizeElementMessage.java
new file mode 100644
index 000000000..c2fbe5fcd
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/SerializedZeroizeElementMessage.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.remote.messages;
+
+import java.io.IOException;
+
+import org.eclipse.osee.ote.message.commands.ZeroizeElement;
+import org.eclipse.osee.ote.message.event.SerializedClassMessage;
+
+public class SerializedZeroizeElementMessage extends SerializedClassMessage<ZeroizeElement> {
+
+ public static final String EVENT = "ote/message/zeroizeelement";
+
+ public SerializedZeroizeElementMessage() {
+ super(EVENT);
+ }
+
+ public SerializedZeroizeElementMessage(ZeroizeElement commandAdded) throws IOException {
+ super(EVENT, commandAdded);
+ }
+
+ public SerializedZeroizeElementMessage(byte[] bytes){
+ super(bytes);
+ }
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/TestEnvironmentServerShutdown.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/TestEnvironmentServerShutdown.java
new file mode 100644
index 000000000..83c3fa251
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/TestEnvironmentServerShutdown.java
@@ -0,0 +1,24 @@
+package org.eclipse.osee.ote.remote.messages;
+
+import org.eclipse.osee.ote.message.elements.StringElement;
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+
+public class TestEnvironmentServerShutdown extends OteEventMessage {
+
+ public static String TOPIC = "ote/message/servershutdown";
+
+ private static int SIZE = 512;
+
+ public StringElement SERVER_ID;
+
+ public TestEnvironmentServerShutdown() {
+ super("TestEnvironmentSetBatchMode", TOPIC, SIZE);
+ SERVER_ID = new StringElement(this, "SERVER_ID", getDefaultMessageData(), 0, 0, 512*8-1);
+ }
+
+ public TestEnvironmentServerShutdown(byte[] bytes) {
+ this();
+ setBackingBuffer(bytes);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/TestEnvironmentSetBatchMode.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/TestEnvironmentSetBatchMode.java
new file mode 100644
index 000000000..3a496ee2f
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/TestEnvironmentSetBatchMode.java
@@ -0,0 +1,24 @@
+package org.eclipse.osee.ote.remote.messages;
+
+import org.eclipse.osee.ote.message.elements.BooleanElement;
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+
+public class TestEnvironmentSetBatchMode extends OteEventMessage {
+
+ public static String TOPIC = "ote/message/setbatchmode";
+
+ private static int SIZE = 1;
+
+ public BooleanElement SET_BATCH_MODE;
+
+ public TestEnvironmentSetBatchMode() {
+ super("TestEnvironmentSetBatchMode", TOPIC, SIZE);
+ SET_BATCH_MODE = new BooleanElement(this, "SET_BATCH_MODE", getDefaultMessageData(), 0, 0, 7);
+ }
+
+ public TestEnvironmentSetBatchMode(byte[] bytes) {
+ this();
+ setBackingBuffer(bytes);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/TestEnvironmentTransferFile.java b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/TestEnvironmentTransferFile.java
new file mode 100644
index 000000000..6fb5e9e16
--- /dev/null
+++ b/org.eclipse.osee.ote.core/src/org/eclipse/osee/ote/remote/messages/TestEnvironmentTransferFile.java
@@ -0,0 +1,27 @@
+package org.eclipse.osee.ote.remote.messages;
+
+import org.eclipse.osee.ote.message.elements.StringElement;
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+import org.eclipse.osee.ote.message.event.SOCKET_ADDRESS_RECORD;
+
+public class TestEnvironmentTransferFile extends OteEventMessage {
+
+ public static String TOPIC = "ote/message/transferfile";
+
+ private static int SIZE = SOCKET_ADDRESS_RECORD.SIZE + 1024;
+
+ public SOCKET_ADDRESS_RECORD ADDRESS;
+ public StringElement FILE_PATH;
+
+ public TestEnvironmentTransferFile() {
+ super("TestEnvironmentSetBatchMode", TOPIC, SIZE);
+ ADDRESS = new SOCKET_ADDRESS_RECORD(this, "ADDRESS", getDefaultMessageData(), 0, 0, SOCKET_ADDRESS_RECORD.SIZE*8-1);
+ FILE_PATH = new StringElement(this, "FILE_PATH", getDefaultMessageData(), SOCKET_ADDRESS_RECORD.SIZE, 0, 1024*8-1);
+ }
+
+ public TestEnvironmentTransferFile(byte[] bytes) {
+ this();
+ setBackingBuffer(bytes);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.feature/.project b/org.eclipse.osee.ote.feature/.project
new file mode 100644
index 000000000..2fa1d3523
--- /dev/null
+++ b/org.eclipse.osee.ote.feature/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ote.feature</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.pde.FeatureBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.FeatureNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.feature/build.properties b/org.eclipse.osee.ote.feature/build.properties
new file mode 100644
index 000000000..34dfbf491
--- /dev/null
+++ b/org.eclipse.osee.ote.feature/build.properties
@@ -0,0 +1,4 @@
+bin.includes = feature.xml,\
+ build.properties,\
+ feature.properties,\
+ license.html
diff --git a/org.eclipse.osee.ote.feature/feature.properties b/org.eclipse.osee.ote.feature/feature.properties
new file mode 100644
index 000000000..b1b38f22a
--- /dev/null
+++ b/org.eclipse.osee.ote.feature/feature.properties
@@ -0,0 +1,141 @@
+###############################################################################
+# Copyright (c) 2004, 2007 Boeing and others.
+# 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:
+# Boeing - initial API and implementation
+###############################################################################
+# feature.properties
+# contains externalized strings for feature.xml
+# "%foo" in feature.xml corresponds to the key "foo" in this file
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file should be translated.
+
+# "featureName" property - name of the feature
+featureName=Eclipse OSEE OTE Feature (Incubation)
+
+# "providerName" property - name of the company that provides the feature
+providerName=Eclipse.org
+
+# "description" property - description of the feature
+description=Open System Engineering Environment OTE
+
+# "copyright" property - text of the "Feature Update Copyright"
+copyright=\
+Copyright (c) 2004, 2009 Boeing and others.\n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License v1.0\n\
+which accompanies this distribution, and is available at\n\
+http://www.eclipse.org/legal/epl-v10.html\n\
+\n\
+Contributors:\n\
+ Boeing - initial API and implementation\n
+################ end of copyright property ####################################
+
+# "licenseURL" property - URL of the "Feature License"
+# do not translate value - just change to point to a locale-specific HTML page
+licenseURL=license.html
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+license=\
+ECLIPSE FOUNDATION SOFTWARE USER AGREEMENT\n\
+March 17, 2005\n\
+\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
+OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
+USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
+AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
+NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU\n\
+AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
+AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
+OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE\n\
+TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
+OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
+BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the Eclipse Foundation\n\
+is provided to you under the terms and conditions of the Eclipse Public\n\
+License Version 1.0 ("EPL"). A copy of the EPL is provided with this\n\
+Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code,\n\
+documentation and other files maintained in the Eclipse.org CVS\n\
+repository ("Repository") in CVS modules ("Modules") and made available\n\
+as downloadable archives ("Downloads").\n\
+\n\
+ - Content may be structured and packaged into modules to facilitate delivering,\n\
+ extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
+ plug-in fragments ("Fragments"), and features ("Features").\n\
+ - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java? ARchive)\n\
+ in a directory named "plugins".\n\
+ - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
+ Each Feature may be packaged as a sub-directory in a directory named "features".\n\
+ Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
+ numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+ - Features may also include other Features ("Included Features"). Within a Feature, files\n\
+ named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+Features may also include other Features ("Included Features"). Files named\n\
+"feature.xml" may contain a list of the names and version numbers of\n\
+Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be\n\
+contained in files named "about.html" ("Abouts"). The terms and\n\
+conditions governing Features and Included Features should be contained\n\
+in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
+Licenses may be located in any directory of a Download or Module\n\
+including, but not limited to the following locations:\n\
+\n\
+ - The top-level (root) directory\n\
+ - Plug-in and Fragment directories\n\
+ - Inside Plug-ins and Fragments packaged as JARs\n\
+ - Sub-directories of the directory named "src" of certain Plug-ins\n\
+ - Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
+Eclipse Update Manager, you must agree to a license ("Feature Update\n\
+License") during the installation process. If the Feature contains\n\
+Included Features, the Feature Update License should either provide you\n\
+with the terms and conditions governing the Included Features or inform\n\
+you where you can locate them. Feature Update Licenses may be found in\n\
+the "license" property of files named "feature.properties". Such Abouts,\n\
+Feature Licenses and Feature Update Licenses contain the terms and\n\
+conditions (or references to such terms and conditions) that govern your\n\
+use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES AND FEATURE UPDATE LICENSES MAY REFER\n\
+TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
+SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+ - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+ - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+ - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+ - IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html)\n\
+ - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+ - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
+TO USE OF THE CONTENT. If no About, Feature License or Feature Update License\n\
+is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
+govern that particular Content.\n\
+\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are\n\
+currently may have restrictions on the import, possession, and use,\n\
+and/or re-export to another country, of encryption software. BEFORE\n\
+using any encryption software, please check the country's laws,\n\
+regulations and policies concerning the import, possession, or use,\n\
+and re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.\n
+########### end of license property ##########################################
diff --git a/org.eclipse.osee.ote.feature/feature.xml b/org.eclipse.osee.ote.feature/feature.xml
new file mode 100644
index 000000000..8c765d68a
--- /dev/null
+++ b/org.eclipse.osee.ote.feature/feature.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+ id="org.eclipse.osee.ote.feature"
+ label="%featureName"
+ version="0.25.3.qualifier"
+ provider-name="%providerName">
+
+ <description>
+ %description
+ </description>
+
+ <copyright>
+ %copyright
+ </copyright>
+
+ <license url="%licenseURL">
+ %license
+ </license>
+
+ <plugin
+ id="org.eclipse.osee.ote.rest"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+
+</feature>
diff --git a/org.eclipse.osee.ote.feature/license.html b/org.eclipse.osee.ote.feature/license.html
new file mode 100644
index 000000000..c6af966b6
--- /dev/null
+++ b/org.eclipse.osee.ote.feature/license.html
@@ -0,0 +1,79 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
+<title>Eclipse.org Software User Agreement</title>
+</head>
+
+<body lang="EN-US" link=blue vlink=purple>
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>March 17, 2005</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+ (COLLECTIVELY &quot;CONTENT&quot;). USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+ CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+ OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+ NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+ CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+ (&quot;EPL&quot;). A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+ For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository (&quot;Repository&quot;) in CVS
+ modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
+
+<ul>
+ <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content. Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+ <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
+ <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material. Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;. Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
+ and/or Fragments associated with that Feature.</li>
+ <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
+Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;). Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+ <li>The top-level (root) directory</li>
+ <li>Plug-in and Fragment directories</li>
+ <li>Inside Plug-ins and Fragments packaged as JARs</li>
+ <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
+ <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license (&quot;Feature Update License&quot;) during the
+installation process. If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them. Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS. SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+ <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+ <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+ <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+ <li>IBM Public License 1.0 (available at <a href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</a>)</li>
+ <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+ <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+ another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+ possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<small>Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.</small>
+</body>
+</html>
diff --git a/org.eclipse.osee.ote.feature/pom.xml b/org.eclipse.osee.ote.feature/pom.xml
new file mode 100644
index 000000000..c9098a9b9
--- /dev/null
+++ b/org.eclipse.osee.ote.feature/pom.xml
@@ -0,0 +1,13 @@
+<project
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.eclipse.osee</groupId>
+ <artifactId>org.eclipse.osee.ote.parent</artifactId>
+ <version>0.25.3-SNAPSHOT</version>
+ <relativePath>../org.eclipse.osee.ote.parent</relativePath>
+ </parent>
+ <artifactId>org.eclipse.osee.ote.feature</artifactId>
+ <packaging>eclipse-feature</packaging>
+ <name>OSEE OTEFeature - (Incubation)</name>
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.feature/sourceTemplateFeature/.gitkeep b/org.eclipse.osee.ote.feature/sourceTemplateFeature/.gitkeep
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/org.eclipse.osee.ote.feature/sourceTemplateFeature/.gitkeep
diff --git a/org.eclipse.osee.ote.help.ui.test/.classpath b/org.eclipse.osee.ote.help.ui.test/.classpath
new file mode 100644
index 000000000..1fa3e6803
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui.test/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.ote.help.ui.test/.project b/org.eclipse.osee.ote.help.ui.test/.project
new file mode 100644
index 000000000..6600992d2
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui.test/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ote.help.ui.test</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.help.ui.test/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.help.ui.test/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..862b73702
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui.test/META-INF/MANIFEST.MF
@@ -0,0 +1,12 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OSEE OTE Help UI Test (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.help.ui.test
+Bundle-Version: 0.25.3.qualifier
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Fragment-Host: org.eclipse.osee.ote.help.ui
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Require-Bundle: org.junit,
+ org.eclipse.core.runtime
+Import-Package: org.eclipse.osee.framework.jdk.core.util,
+ org.osgi.framework
diff --git a/org.eclipse.osee.ote.help.ui.test/build.properties b/org.eclipse.osee.ote.help.ui.test/build.properties
new file mode 100644
index 000000000..34d2e4d2d
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui.test/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .
diff --git a/org.eclipse.osee.ote.help.ui.test/pom.xml b/org.eclipse.osee.ote.help.ui.test/pom.xml
new file mode 100644
index 000000000..b8f64a46b
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui.test/pom.xml
@@ -0,0 +1,30 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.osee</groupId>
+ <artifactId>org.eclipse.osee.ote.parent</artifactId>
+ <version>0.25.3-SNAPSHOT</version>
+ <relativePath>../org.eclipse.osee.ote.parent</relativePath>
+ </parent>
+
+ <artifactId>org.eclipse.osee.ote.help.ui.test</artifactId>
+ <packaging>eclipse-test-plugin</packaging>
+ <name>OSEE OTE Help UI Test - (Incubation)</name>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-surefire-plugin</artifactId>
+ <version>${tycho-version}</version>
+ <configuration>
+ <testSuite>org.eclipse.osee.ote.help.ui.test</testSuite>
+ <testClass>org.eclipse.osee.ote.help.ui.OteHelpUiTestSuite</testClass>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/HelpContextTest.java b/org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/HelpContextTest.java
new file mode 100644
index 000000000..509d96ab9
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/HelpContextTest.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.help.ui;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import java.lang.reflect.Field;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.osee.framework.core.data.HelpContext;
+import org.eclipse.osee.framework.jdk.core.util.Compare;
+import org.eclipse.osee.ote.help.ui.util.ContextParser;
+import org.eclipse.osee.ote.help.ui.util.ContextParser.ContextEntry;
+import org.eclipse.osee.ote.help.ui.util.HelpTestUtil;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+
+/**
+ * @author Angel Avila
+ */
+public class HelpContextTest {
+
+ private static final String PLUGIN_ID = "org.eclipse.osee.ote.help.ui";
+
+ private static Map<String, HelpContext> contexts;
+ private static ContextParser parser;
+
+ @BeforeClass
+ public static void setUp() throws Exception {
+ contexts = getContexts(OteHelpContext.class);
+ parser = new ContextParser("contexts/contexts.xml");
+ parser.parse();
+ }
+
+ @Test
+ public void testAdd() throws Exception {
+ assertEquals(12, contexts.size());
+ }
+
+ @Test
+ public void testContextsXml() throws Exception {
+ assertEquals(contexts.size(), parser.getEntries().size());
+
+ Assert.assertFalse(Compare.isDifferent(contexts.keySet(), parser.getIds()));
+ for (HelpContext context : contexts.values()) {
+ assertEquals(PLUGIN_ID, context.getPluginId());
+
+ String id = context.getName();
+ ContextEntry entry = parser.getEntry(id);
+ assertNotNull(entry);
+ }
+ }
+
+ @Ignore
+ @Test
+ public void testHrefFiles() throws Exception {
+ for (ContextEntry entry : parser.getEntries()) {
+ for (String reference : entry.getReferences()) {
+ URL url = HelpTestUtil.getResource(reference);
+ assertNotNull(String.format("[%s] was not valid", reference), url);
+ }
+ }
+ }
+
+ private static Map<String, HelpContext> getContexts(Class<?> clazz) throws IllegalArgumentException, IllegalAccessException {
+ Map<String, HelpContext> contexts = new HashMap<>();
+ for (Field field : clazz.getFields()) {
+ Object object = field.get(null);
+ if (object instanceof HelpContext) {
+ HelpContext context = (HelpContext) object;
+ contexts.put(context.getName(), context);
+ }
+ }
+ return contexts;
+ }
+}
diff --git a/org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/HelpTableOfContentTest.java b/org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/HelpTableOfContentTest.java
new file mode 100644
index 000000000..2e76b6505
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/HelpTableOfContentTest.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.help.ui;
+
+import static org.junit.Assert.assertNotNull;
+import java.net.URL;
+import java.util.Set;
+import org.eclipse.osee.ote.help.ui.util.HelpTestUtil;
+import org.eclipse.osee.ote.help.ui.util.HtmlParser;
+import org.eclipse.osee.ote.help.ui.util.TocParser;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+
+/**
+ * @author Angel Avila
+ */
+public class HelpTableOfContentTest {
+
+ private static final String PLUGIN_ID = "org.eclipse.osee.ote.help.ui";
+
+ private static TocParser parser;
+
+ @BeforeClass
+ public static void setUp() throws Exception {
+ parser = new TocParser("toc.xml");
+ parser.parse();
+ }
+
+ @Ignore
+ @Test
+ public void testAllTocReferencesExist() throws Exception {
+ for (String reference : parser.getEntries()) {
+ URL url = HelpTestUtil.getResource(reference);
+ assertNotNull(String.format("[%s] was not valid", reference), url);
+ }
+ }
+
+ @Ignore
+ @Test
+ public void testTocReferencesValid() throws Exception {
+ HtmlParser htmlParser = new HtmlParser(PLUGIN_ID);
+
+ for (String reference : parser.getEntries()) {
+ URL url = HelpTestUtil.getResource(reference);
+
+ Set<String> entries = htmlParser.parse(url);
+ for (String resource : entries) {
+ URL referencedUrl = HelpTestUtil.getResource(reference);
+ assertNotNull(String.format("[%s] was not valid", resource), referencedUrl);
+ }
+
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/OteHelpUiTestSuite.java b/org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/OteHelpUiTestSuite.java
new file mode 100644
index 000000000..e01b751cd
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/OteHelpUiTestSuite.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.help.ui;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+/**
+ * @author Angel Avila
+ */
+@RunWith(Suite.class)
+@Suite.SuiteClasses({HelpContextTest.class, HelpTableOfContentTest.class})
+public class OteHelpUiTestSuite {
+ // Test Suite
+}
diff --git a/org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/util/ContextParser.java b/org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/util/ContextParser.java
new file mode 100644
index 000000000..72a261049
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/util/ContextParser.java
@@ -0,0 +1,141 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.help.ui.util;
+
+import java.io.BufferedInputStream;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedHashSet;
+import java.util.Map;
+import java.util.Set;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamConstants;
+import javax.xml.stream.XMLStreamReader;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+
+/**
+ * @author Angel Avila
+ */
+public class ContextParser {
+
+ private static final XMLInputFactory xmlInputFactory = XMLInputFactory.newFactory();
+
+ private static final String CONTEXT = "context";
+ private static final String TOPIC = "topic";
+ private static final String HREF = "href";
+ private static final String ID_TAG = "id";
+
+ public Map<String, ContextEntry> entries = new HashMap<>();
+ public String path;
+
+ private String localName;
+ private String uri;
+ private ContextEntry currentEntry;
+
+ public ContextParser(String path) {
+ this.path = path;
+ }
+
+ public void parse() throws Exception {
+ entries.clear();
+ URL url = HelpTestUtil.getResource(path);
+
+ InputStream inputStream = null;
+ try {
+ inputStream = new BufferedInputStream(url.openStream());
+ XMLStreamReader streamReader = xmlInputFactory.createXMLStreamReader(inputStream);
+ while (streamReader.hasNext()) {
+ process(streamReader);
+ streamReader.next();
+ }
+
+ } finally {
+ Lib.close(inputStream);
+ }
+ }
+
+ private void process(XMLStreamReader reader) {
+ int eventType = reader.getEventType();
+ switch (eventType) {
+ case XMLStreamConstants.START_ELEMENT:
+ localName = reader.getLocalName();
+ uri = reader.getNamespaceURI();
+ if (CONTEXT.equals(localName)) {
+
+ String id = reader.getAttributeValue(uri, ID_TAG);
+ if (Strings.isValid(id)) {
+ currentEntry = new ContextEntry(id);
+ }
+
+ } else if (TOPIC.equals(localName) && currentEntry != null) {
+ String reference = reader.getAttributeValue(uri, HREF);
+ if (Strings.isValid(reference)) {
+ String path = normalizePath(reference);
+ currentEntry.getReferences().add(path);
+ }
+ }
+ break;
+ case XMLStreamConstants.END_ELEMENT:
+ localName = reader.getLocalName();
+ uri = reader.getNamespaceURI();
+ if (CONTEXT.equals(localName) && currentEntry != null) {
+ entries.put(currentEntry.getId(), currentEntry);
+ reset();
+ }
+ break;
+ }
+ }
+
+ private String normalizePath(String reference) {
+ return reference.replaceAll("\\.html#.*", ".html");
+ }
+
+ private void reset() {
+ localName = null;
+ uri = null;
+ currentEntry = null;
+ }
+
+ public Collection<ContextEntry> getEntries() {
+ return entries.values();
+ }
+
+ public ContextEntry getEntry(String id) {
+ return entries.get(id);
+ }
+
+ public Set<String> getIds() {
+ return entries.keySet();
+ }
+
+ public final class ContextEntry {
+ private final String id;
+ private final Set<String> references = new LinkedHashSet<>();
+
+ public ContextEntry(String id) {
+ super();
+ this.id = id;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public Set<String> getReferences() {
+ return references;
+ }
+
+ }
+
+}
diff --git a/org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/util/HelpTestUtil.java b/org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/util/HelpTestUtil.java
new file mode 100644
index 000000000..e84b93d7e
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/util/HelpTestUtil.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.help.ui.util;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import java.io.File;
+import java.net.URL;
+import org.eclipse.core.runtime.FileLocator;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.FrameworkUtil;
+
+/**
+ * @author Angel Avila
+ */
+public final class HelpTestUtil {
+
+ private HelpTestUtil() {
+ // Utility Class
+ }
+
+ public static URL getResource(String resource) throws Exception {
+ Bundle bundle = FrameworkUtil.getBundle(HelpTestUtil.class);
+ URL url = bundle.getResource(resource);
+
+ assertNotNull(String.format("Resource not found: [%s]", resource), url);
+
+ url = FileLocator.toFileURL(url);
+ File file = new File(url.toURI());
+ assertEquals(String.format("[%s] does not exist", resource), true, file.exists());
+ assertEquals(String.format("[%s] unreadable", resource), true, file.canRead());
+
+ return url;
+ }
+}
diff --git a/org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/util/HtmlParser.java b/org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/util/HtmlParser.java
new file mode 100644
index 000000000..f912676a8
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/util/HtmlParser.java
@@ -0,0 +1,119 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.help.ui.util;
+
+import java.io.BufferedInputStream;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.HashSet;
+import java.util.Set;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamConstants;
+import javax.xml.stream.XMLStreamReader;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+
+;
+
+/**
+ * @author Angel Avila
+ */
+public class HtmlParser {
+
+ private static final XMLInputFactory xmlInputFactory = XMLInputFactory.newFactory();
+
+ private static final String LINK_NODE = "link";
+ private static final String HREF_TAG = "href";
+ private static final String SRC_TAG = "src";
+
+ private final String pathHint;
+
+ public HtmlParser(String pathHint) {
+ this.pathHint = pathHint;
+ }
+
+ private String getPath(String fullPath) {
+ StringBuilder builder = new StringBuilder();
+
+ String[] parts = fullPath.split("/");
+ boolean found = false;
+ for (String part : parts) {
+ if (found && !part.endsWith(".html")) {
+ builder.append(part);
+ builder.append("/");
+ }
+ if (pathHint.equals(part)) {
+ found = true;
+ }
+ }
+ return builder.toString();
+ }
+
+ public Set<String> parse(URL url) throws Exception {
+ Set<String> entries = new HashSet<>();
+ entries.clear();
+
+ String pathPrefix = getPath(url.toString());
+
+ InputStream inputStream = null;
+ try {
+ inputStream = new BufferedInputStream(url.openStream());
+ XMLStreamReader streamReader = xmlInputFactory.createXMLStreamReader(inputStream);
+ while (streamReader.hasNext()) {
+ process(streamReader, pathPrefix, entries);
+ streamReader.next();
+ }
+
+ } finally {
+ Lib.close(inputStream);
+ }
+
+ return entries;
+ }
+
+ private void process(XMLStreamReader reader, String pathPrefix, Set<String> entries) {
+ int eventType = reader.getEventType();
+ switch (eventType) {
+ case XMLStreamConstants.START_ELEMENT:
+ String localName = reader.getLocalName();
+ for (int index = 0; index < reader.getAttributeCount(); index++) {
+
+ String attributeName = reader.getAttributeLocalName(index);
+ String value = reader.getAttributeValue(index);
+
+ if (Strings.isValid(value)) {
+ if (!LINK_NODE.equals(localName)) {
+ if (HREF_TAG.equals(attributeName) || SRC_TAG.equals(attributeName)) {
+ processResource(pathPrefix, entries, value);
+ }
+ }
+ }
+ }
+ break;
+ }
+ }
+
+ private void processResource(String pathPrefix, Set<String> references, String value) {
+ if (!isExternalLink(value)) {
+ String reference = normalizePath(pathPrefix, value);
+ references.add(reference);
+ }
+ }
+
+ private String normalizePath(String pathPrefix, String reference) {
+ String path = reference.replaceAll("\\.html#.*", ".html");
+ return String.format("%s%s", pathPrefix, path);
+ }
+
+ private boolean isExternalLink(String resource) {
+ return resource.contains("://");
+ }
+}
diff --git a/org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/util/TocParser.java b/org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/util/TocParser.java
new file mode 100644
index 000000000..fed71088b
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui.test/src/org/eclipse/osee/ote/help/ui/util/TocParser.java
@@ -0,0 +1,103 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.help.ui.util;
+import java.io.BufferedInputStream;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.HashSet;
+import java.util.Set;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamConstants;
+import javax.xml.stream.XMLStreamReader;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+
+
+/**
+ * @author Angel Avila
+ */
+public class TocParser {
+
+ private static final XMLInputFactory xmlInputFactory = XMLInputFactory.newFactory();
+
+ private static final String TOC = "toc";
+ private static final String TOPIC = "topic";
+ private static final String HREF = "href";
+
+ public Set<String> entries = new HashSet<>();
+ public String path;
+
+ private String localName;
+ private String uri;
+
+ public TocParser(String path) {
+ this.path = path;
+ }
+
+ public void parse() throws Exception {
+ entries.clear();
+ URL url = HelpTestUtil.getResource(path);
+
+ InputStream inputStream = null;
+ try {
+ inputStream = new BufferedInputStream(url.openStream());
+ XMLStreamReader streamReader = xmlInputFactory.createXMLStreamReader(inputStream);
+ while (streamReader.hasNext()) {
+ process(streamReader);
+ streamReader.next();
+ }
+
+ } finally {
+ Lib.close(inputStream);
+ }
+ }
+
+ private void process(XMLStreamReader reader) {
+ int eventType = reader.getEventType();
+ switch (eventType) {
+ case XMLStreamConstants.START_ELEMENT:
+ localName = reader.getLocalName();
+ uri = reader.getNamespaceURI();
+ if (TOC.equals(localName)) {
+ processReference(reader, TOPIC);
+ } else if (TOPIC.equals(localName)) {
+ processReference(reader, HREF);
+ }
+ break;
+ case XMLStreamConstants.END_ELEMENT:
+ localName = reader.getLocalName();
+ uri = reader.getNamespaceURI();
+ reset();
+ break;
+ }
+ }
+
+ private void processReference(XMLStreamReader reader, String tag) {
+ String reference = reader.getAttributeValue(uri, tag);
+ if (Strings.isValid(reference)) {
+ String path = normalizePath(reference);
+ entries.add(path);
+ }
+ }
+
+ private String normalizePath(String reference) {
+ return reference.replaceAll("\\.html#.*", ".html");
+ }
+
+ private void reset() {
+ localName = null;
+ uri = null;
+ }
+
+ public Set<String> getEntries() {
+ return entries;
+ }
+}
diff --git a/org.eclipse.osee.ote.help.ui/.classpath b/org.eclipse.osee.ote.help.ui/.classpath
new file mode 100644
index 000000000..1fa3e6803
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.ote.help.ui/.gitignore b/org.eclipse.osee.ote.help.ui/.gitignore
new file mode 100644
index 000000000..07cf0fe03
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui/.gitignore
@@ -0,0 +1 @@
+/toc.xml
diff --git a/org.eclipse.osee.ote.help.ui/.project b/org.eclipse.osee.ote.help.ui/.project
new file mode 100644
index 000000000..0c5be6433
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ote.help.ui</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.help.ui/.settings/org.eclipse.pde.prefs b/org.eclipse.osee.ote.help.ui/.settings/org.eclipse.pde.prefs
new file mode 100644
index 000000000..8141126e7
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,32 @@
+compilers.f.unresolved-features=1
+compilers.f.unresolved-plugins=1
+compilers.incompatible-environment=1
+compilers.p.build=1
+compilers.p.build.bin.includes=2
+compilers.p.build.encodings=2
+compilers.p.build.java.compiler=2
+compilers.p.build.java.compliance=1
+compilers.p.build.missing.output=2
+compilers.p.build.output.library=1
+compilers.p.build.source.library=1
+compilers.p.build.src.includes=1
+compilers.p.deprecated=1
+compilers.p.discouraged-class=1
+compilers.p.internal=1
+compilers.p.missing-packages=2
+compilers.p.missing-version-export-package=2
+compilers.p.missing-version-import-package=2
+compilers.p.missing-version-require-bundle=2
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=1
+compilers.p.unknown-class=1
+compilers.p.unknown-element=1
+compilers.p.unknown-identifier=1
+compilers.p.unknown-resource=1
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.s.create-docs=false
+compilers.s.doc-folder=doc
+compilers.s.open-tags=1
+eclipse.preferences.version=1
diff --git a/org.eclipse.osee.ote.help.ui/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.help.ui/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..94b2136fa
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,10 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OSEE OTE Help (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.help.ui;singleton:=true
+Bundle-Version: 0.25.3.qualifier
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.osee.ote.help.ui
+Import-Package: org.eclipse.osee.framework.core.data
diff --git a/org.eclipse.osee.ote.help.ui/about.html b/org.eclipse.osee.ote.help.ui/about.html
new file mode 100644
index 000000000..d774b07c7
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui/about.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 25, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.help.ui/build-helper.xml b/org.eclipse.osee.ote.help.ui/build-helper.xml
new file mode 100644
index 000000000..e7e8f2fc3
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui/build-helper.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="org.eclipse.osee.ote.help.ui" basedir="." default="all">
+ <property name="osee.base.help.plugin" value="../org.eclipse.osee.framework.help.ui" />
+ <property name="ant.file.imported" value="${osee.base.help.plugin}/scripts" />
+ <import file="${ant.file.imported}/help-build-common.xml" />
+
+ <description>Generate Eclipse help content for the OSEE OTE user
+ guide</description>
+
+ <property name="osee.help.doc.url.base" value="http://wiki.eclipse.org" />
+
+ <target name="all" description="Generate Eclipse help content for the OSEE OTE user guide">
+ <sequential>
+ <delete failonerror="false">
+ <fileset dir="OSEE" />
+ <fileset dir="images" />
+ </delete>
+
+ <mediawiki-to-eclipse-help
+ wikiBaseUrl="${osee.help.doc.url.base}"
+ validate="true" failonvalidationerror="true"
+ prependImagePrefix="images"
+ formatoutput="true"
+ defaultAbsoluteLinkTarget="osee_external"
+ dest="${basedir}"
+ navigationimages="true"
+ title="OSEE OTE User's Guide"
+ generateUnifiedToc="true">
+ <path name="OSEE/OTE/Users_Guide/Getting_Started" title="Getting Started" />
+ <path name="OSEE/OTE/Users_Guide/Concepts" title="Concepts" />
+ <path name="OSEE/OTE/Users_Guide/Features" title="Features" />
+ <path name="OSEE/OTE/Users_Guide/Tips" title="Tips and Tricks" />
+ <path name="OSEE/OTE/Users_Guide/New" title="What's New" />
+ <stylesheet url="book.css" />
+ <pageAppendum>
+
+ = Updating This Document =
+
+ This document is maintained in a collaborative wiki. If you wish to
+ update or modify this document please visit
+ {url}</pageAppendum>
+ </mediawiki-to-eclipse-help>
+ <mkdir dir="images" />
+ <copy todir="${basedir}/images" overwrite="true">
+ <fileset dir="${ant.file.imported}/commonImages" />
+ </copy>
+ </sequential>
+ </target>
+</project>
diff --git a/org.eclipse.osee.ote.help.ui/build.properties b/org.eclipse.osee.ote.help.ui/build.properties
new file mode 100644
index 000000000..9c060cbfc
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui/build.properties
@@ -0,0 +1,11 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ plugin.xml,\
+ toc.xml,\
+ contexts/,\
+ intro/,\
+ about.html,\
+ .,\
+ OSEE/,\
+ images/
diff --git a/org.eclipse.osee.ote.help.ui/contexts/contexts.xml b/org.eclipse.osee.ote.help.ui/contexts/contexts.xml
new file mode 100644
index 000000000..91ca7f920
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui/contexts/contexts.xml
@@ -0,0 +1,74 @@
+<contexts>
+ <context id="ote_navigator" title="OTE Navigator">
+ <description>OTE navigator is a view that provides quick navigation to many of the GUI's and features of OTE.</description>
+ <topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#OTE_Navigator" label="OTE Navigator"/>
+ </context>
+
+ <context id="test_manager">
+ <description>The Test Manager is the application that is used to run test programs in OTE.</description>
+ <topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Test_Manager" label="Test Manager"/>
+ <topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Overview_Page" label="Test Manager - Overview Page"/>
+ <topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Hosts_Page" label="Test Manager - Hosts Page"/>
+ <topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Scripts_Page" label="Test Manager - Scripts Page"/>
+ <topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Advanced_Page" label="Test Manager - Advanced Page"/>
+ <topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Source_Page" label="Test Manager - Source Page"/>
+ </context>
+ <context id="test_manager_overview_page" title="Test Manager - Overview Page">
+ <description>The Overview page of Test Manager allows for some brief overview information related to the configuration of the Test Manager.</description>
+ <topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Overview_Page" label="Test Manager - Overview Page"/>
+ <topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Test_Manager" label="Test Manager"/>
+ </context>
+ <context id="test_manager_hosts_page" title="Test Manager - Hosts Page">
+ <description>Displays available test servers, and allows you to connect to them and look at there current status.</description>
+ <topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Hosts_Page" label="Test Manager - Hosts Page"/>
+ <topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Test_Manager" label="Test Manager"/>
+ </context>
+ <context id="test_manager_scripts_page" title="Test Manager - Scripts Page">
+ <description>Controls the execution of test programs.</description>
+ <topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Scripts_Page" label="Test Manager - Scripts Page"/>
+ <topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Test_Manager" label="Test Manager"/>
+ </context>
+ <context id="test_manager_advanced_page" title="Test Manager - Advanced Page">
+ <description>The Advanced Page of the Test Manager is the page where configuration options can be set.</description>
+ <topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Advanced_Page" label="Test Manager - Advanced Page"/>
+ <topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Test_Manager" label="Test Manager"/>
+ </context>
+ <context id="test_manager_source_page" title="Test Manager - Source Page">
+ <description>The Source page of Test Manager allows the user to enter source code location to run against.</description>
+ <topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Source_Page" label="Test Manager - Source Page"/>
+ <topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Test_Manager" label="Test Manager"/>
+ </context>
+
+ <context id="message_view" title="Message View">
+ <description>The Message View tool provides a listing of all messages in the currently checked out Messages.jar file.</description>
+ <topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Message_View" label="Message View"/>
+ <topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Search" label="Message View - Search"/>
+ <topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Watch" label="Message View - Watch"/>
+ </context>
+ <context id="message_view_search" title="Message View - Search">
+ <description>The Message View search text box allows users to search for messages.</description>
+ <topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Search" label="Message View - Search"/>
+ <topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Message_View" label="Message View"/>
+ </context>
+ <context id="message_view_watch" title="Message View - Watch">
+ <description>The Message View Right-Click Menu allows users to select messages and message elements to watch.</description>
+ <topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Watch" label="Message View - Watch"/>
+ <topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Message_View" label="Message View"/>
+ </context>
+
+ <context id="message_watch" title="Message Watch">
+ <description>The Message Watch tool provides capability to monitor and simulate messages and element values.</description>
+ <topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Message_Watch" label="Message Watch"/>
+ <topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Adding Elements" label="Message Watch - Adding Elements"/>
+ <topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Removing Elements" label="Message Watch - Removing Elements"/>
+ <topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Setting Elements" label="Message Watch - Setting Elements"/>
+ <topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Read vs Write Buffer" label="Message Watch - Read vs Write Buffer"/>
+ <topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Sort" label="Message Watch - Sort"/>
+ </context>
+
+ <context id="mux_view" title="Mux View">
+ <description>The mux view allows the user to monitor and simulate mux messages</description>
+ <topic href="OSEE/OTE/Users_Guide/Features/Views-And-Editors.html#Mux_View" label="Mux View"/>
+ </context>
+
+</contexts>
diff --git a/org.eclipse.osee.ote.help.ui/intro/overviewExtensionContent.xml b/org.eclipse.osee.ote.help.ui/intro/overviewExtensionContent.xml
new file mode 100644
index 000000000..61b19caf2
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui/intro/overviewExtensionContent.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<introContent>
+ <extensionContent id="org.eclipse.osee" name="OSEE"
+ style="css/overview.css" path="overview/@">
+ <group id="content-group" style-id="content-group">
+ <link label="OTE"
+ url="http://org.eclipse.ui.intro/runAction?pluginId=org.eclipse.osee.ote.help.ui&amp;class=org.eclipse.mylyn.internal.tasks.ui.actions.ShowTasksUiLegendAction&amp;id=org.eclipse.mylyn.doc.legend.show.action"
+ id="ote-overview" style-id="content-link">
+ <text>See the OSEE OTE Perspective</text>
+ </link>
+ </group>
+ </extensionContent>
+</introContent>
diff --git a/org.eclipse.osee.ote.help.ui/intro/tutorialsExtensionContent.xml b/org.eclipse.osee.ote.help.ui/intro/tutorialsExtensionContent.xml
new file mode 100644
index 000000000..efb325498
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui/intro/tutorialsExtensionContent.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<introContent>
+ <extensionContent id="org.eclipse.osee" name="AST"
+ style="css/tutorials.css" path="tutorials/@">
+<!-- <group label="Task-focused programming" id="AST" style-id="content-group">
+ <link
+ url="http://org.eclipse.ui.intro/showStandby?partId=org.eclipse.platform.cheatsheet&amp;input=org.eclipse.mylyn.cheatsheet.query"
+ label="Use the Task List" id="mylyn-query" style-id="content-link">
+ <text>Learn how to create tasks and task repository queries</text>
+ </link>
+ <link
+ url="http://www.eclipse.org/mylyn/start/"
+ label="Visit the Mylyn homepage" id="mylyn-task" style-id="content-link">
+ <text>Learn about the benefits of task-focused programming with Mylyn</text>
+ </link>
+ </group>-->
+ </extensionContent>
+</introContent>
+
+<!--
+<link
+ url="http://org.eclipse.ui.intro/showStandby?partId=org.eclipse.platform.cheatsheet&amp;input=org.eclipse.mylyn.cheatsheet.taskfocus"
+ label="Focus on Java" id="osee-task" style-id="content-link">
+ <text>Learn how to reduce information overload and multitask with ease.</text>
+</link>
+-->
diff --git a/org.eclipse.osee.ote.help.ui/plugin.xml b/org.eclipse.osee.ote.help.ui/plugin.xml
new file mode 100644
index 000000000..4354da51e
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui/plugin.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+ <extension
+ id="org.eclipse.osee.ote.help.ui.docs"
+ name="OSEE OTE User&apos;s Guide"
+ point="org.eclipse.help.toc">
+ <toc
+ category="OSEE"
+ file="toc.xml"
+ primary="true">
+ </toc>
+ </extension>
+ <extension
+ point="org.eclipse.ui.intro.configExtension">
+ <configExtension
+ configId="org.eclipse.ui.intro.universalConfig"
+ content="$nl$/intro/overviewExtensionContent.xml">
+ </configExtension>
+ <configExtension
+ configId="org.eclipse.ui.intro.universalConfig"
+ content="$nl$/intro/tutorialsExtensionContent.xml">
+ </configExtension>
+ </extension>
+ <extension
+ point="org.eclipse.help.contexts">
+ <contexts
+ file="contexts/contexts.xml">
+ </contexts>
+ </extension>
+</plugin>
diff --git a/org.eclipse.osee.ote.help.ui/pom.xml b/org.eclipse.osee.ote.help.ui/pom.xml
new file mode 100644
index 000000000..6ddd3c9c5
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui/pom.xml
@@ -0,0 +1,106 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.osee</groupId>
+ <artifactId>org.eclipse.osee.ote.parent</artifactId>
+ <version>0.25.3-SNAPSHOT</version>
+ <relativePath>../org.eclipse.osee.ote.parent</relativePath>
+ </parent>
+
+ <artifactId>org.eclipse.osee.ote.help.ui</artifactId>
+ <packaging>eclipse-plugin</packaging>
+ <name>OTE Help (Incubation)</name>
+
+ <build>
+ <!-- workaround for https://issues.sonatype.org/browse/TYCHO-168 -->
+ <resources>
+ <resource>
+ <directory>src</directory>
+ <excludes>
+ <exclude>**/*.java</exclude>
+ </excludes>
+ </resource>
+ </resources>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-source-plugin</artifactId>
+ </plugin>
+ <plugin>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <version>${maven-antrun-version}</version>
+ <executions>
+ <execution>
+ <id>help-clean-up</id>
+ <phase>clean</phase>
+ <configuration>
+ <target>
+ <property name="plugin_classpath" refid="maven.plugin.classpath" />
+ <taskdef resource="net/sf/antcontrib/antlib.xml">
+ <classpath>
+ <pathelement path="${classpath}" />
+ <pathelement path="${plugin_classpath}" />
+ </classpath>
+ </taskdef>
+
+ <if>
+ <equals arg1="${osee-create-help-docs}" arg2="true" />
+ <then>
+ <property name="compile_classpath" refid="maven.compile.classpath" />
+ <delete dir="images" />
+ <delete dir="OSEE" />
+ </then>
+ </if>
+ </target>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+
+ <execution>
+ <id>help-build</id>
+ <phase>generate-sources</phase>
+ <configuration>
+ <target>
+ <property name="plugin_classpath" refid="maven.plugin.classpath" />
+ <taskdef resource="net/sf/antcontrib/antlib.xml">
+ <classpath>
+ <pathelement path="${classpath}" />
+ <pathelement path="${plugin_classpath}" />
+ </classpath>
+ </taskdef>
+
+ <if>
+ <equals arg1="${osee-create-help-docs}" arg2="true" />
+ <then>
+
+ <if>
+ <isset property="http.proxyHost" />
+ <then>
+ <echo message="Set Proxy: [${http.proxyHost}:${http.proxyPort}]" />
+ <echo message="Exclude ProxyHosts: [${http.nonProxyHosts}]" />
+ <setproxy nonproxyhosts="${http.nonProxyHosts}"
+ proxyhost="${http.proxyHost}" proxyport="${http.proxyPort}" />
+ </then>
+ </if>
+
+ <property name="compile_classpath" refid="maven.compile.classpath" />
+ <ant target="all" inheritRefs="true" antfile="build-helper.xml" />
+ </then>
+ </if>
+ </target>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.help.ui/src/org/eclipse/osee/ote/help/ui/OteHelpContext.java b/org.eclipse.osee.ote.help.ui/src/org/eclipse/osee/ote/help/ui/OteHelpContext.java
new file mode 100644
index 000000000..9e9ab4d59
--- /dev/null
+++ b/org.eclipse.osee.ote.help.ui/src/org/eclipse/osee/ote/help/ui/OteHelpContext.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.help.ui;
+
+import static org.eclipse.osee.framework.core.data.HelpContextRegistry.asContext;
+import org.eclipse.osee.framework.core.data.HelpContext;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OteHelpContext {
+
+ private OteHelpContext() {
+ // Private Constructor
+ }
+
+ private static final String PLUGIN_ID = "org.eclipse.osee.ote.help.ui";
+
+ public static final HelpContext OTE_NAVIGATOR = toContext("ote_navigator");
+ public static final HelpContext TEST_MANAGER = toContext("test_manager");
+ public static final HelpContext TEST_MANAGER__OVERVIEW = toContext("test_manager_overview_page");
+ public static final HelpContext TEST_MANAGER__HOSTS = toContext("test_manager_hosts_page");
+ public static final HelpContext TEST_MANAGER__SCRIPTS = toContext("test_manager_scripts_page");
+ public static final HelpContext TEST_MANAGER__ADVANCED = toContext("test_manager_advanced_page");
+ public static final HelpContext TEST_MANAGER__SOURCE = toContext("test_manager_source_page");
+ public static final HelpContext MESSAGE_VIEW = toContext("message_view");
+ public static final HelpContext MESSAGE_VIEW__SEARCH = toContext("message_view_search");
+ public static final HelpContext MESSAGE_VIEW__WATCH = toContext("message_view_watch");
+ public static final HelpContext MESSAGE_WATCH = toContext("message_watch");
+ public static final HelpContext MUX_VIEW = toContext("mux_view");
+
+ private static HelpContext toContext(String id) {
+ return asContext(PLUGIN_ID, id);
+ }
+}
diff --git a/org.eclipse.osee.ote.io/.classpath b/org.eclipse.osee.ote.io/.classpath
new file mode 100644
index 000000000..1fa3e6803
--- /dev/null
+++ b/org.eclipse.osee.ote.io/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.ote.io/.project b/org.eclipse.osee.ote.io/.project
new file mode 100644
index 000000000..4a0145374
--- /dev/null
+++ b/org.eclipse.osee.ote.io/.project
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ote.io</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ds.core.builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.io/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.io/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..945edd463
--- /dev/null
+++ b/org.eclipse.osee.ote.io/META-INF/MANIFEST.MF
@@ -0,0 +1,14 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OTE IO (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.io;singleton:=true
+Bundle-Version: 0.25.3.qualifier
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Import-Package: org.eclipse.osee.framework.logging,
+ org.eclipse.osee.ote.properties,
+ org.osgi.framework
+Export-Package: org.eclipse.osee.ote.io
+Bundle-ActivationPolicy: lazy
+Service-Component: OSGI-INF/*.xml
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Bundle-Activator: org.eclipse.osee.ote.io.internal.EarlyIORedirect
diff --git a/org.eclipse.osee.ote.io/OSGI-INF/org.eclipse.osee.ote.io.xml b/org.eclipse.osee.ote.io/OSGI-INF/org.eclipse.osee.ote.io.xml
new file mode 100644
index 000000000..dc70ecff8
--- /dev/null
+++ b/org.eclipse.osee.ote.io/OSGI-INF/org.eclipse.osee.ote.io.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="start" deactivate="stop" immediate="true" name="org.eclipse.osee.ote.io">
+ <implementation class="org.eclipse.osee.ote.io.internal.SystemOutputImpl"/>
+ <service>
+ <provide interface="org.eclipse.osee.ote.io.SystemOutput"/>
+ </service>
+ <reference bind="bindOTEServerFolder" cardinality="1..1" interface="org.eclipse.osee.ote.io.OTEServerFolder" name="OTEServerFolder" policy="static" unbind="unbindOTEServerFolder"/>
+</scr:component>
diff --git a/org.eclipse.osee.ote.io/OSGI-INF/ote.server.folder.component.xml b/org.eclipse.osee.ote.io/OSGI-INF/ote.server.folder.component.xml
new file mode 100644
index 000000000..53410ca44
--- /dev/null
+++ b/org.eclipse.osee.ote.io/OSGI-INF/ote.server.folder.component.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="start" deactivate="stop" immediate="true" name="org.eclipse.osee.ote.io.server.folder">
+ <implementation class="org.eclipse.osee.ote.io.internal.OTEFolderImpl"/>
+ <service>
+ <provide interface="org.eclipse.osee.ote.io.OTEServerFolder"/>
+ </service>
+</scr:component>
diff --git a/org.eclipse.osee.ote.io/build.properties b/org.eclipse.osee.ote.io/build.properties
new file mode 100644
index 000000000..6210e849b
--- /dev/null
+++ b/org.eclipse.osee.ote.io/build.properties
@@ -0,0 +1,5 @@
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ OSGI-INF/
+source.. = src/
diff --git a/org.eclipse.osee.ote.io/pom.xml b/org.eclipse.osee.ote.io/pom.xml
new file mode 100644
index 000000000..f1cb9d45a
--- /dev/null
+++ b/org.eclipse.osee.ote.io/pom.xml
@@ -0,0 +1,35 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.osee</groupId>
+ <artifactId>org.eclipse.osee.ote.parent</artifactId>
+ <version>0.25.3-SNAPSHOT</version>
+ <relativePath>../org.eclipse.osee.ote.parent</relativePath>
+ </parent>
+
+ <artifactId>org.eclipse.osee.ote.io</artifactId>
+ <packaging>eclipse-plugin</packaging>
+ <name>OTE IO</name>
+
+ <build>
+ <!-- workaround for https://issues.sonatype.org/browse/TYCHO-168 -->
+ <resources>
+ <resource>
+ <directory>src</directory>
+ <excludes>
+ <exclude>**/*.java</exclude>
+ </excludes>
+ </resource>
+ </resources>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-source-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/OTEServerFolder.java b/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/OTEServerFolder.java
new file mode 100644
index 000000000..de4689856
--- /dev/null
+++ b/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/OTEServerFolder.java
@@ -0,0 +1,107 @@
+package org.eclipse.osee.ote.io;
+
+import java.io.File;
+import java.util.List;
+
+/**
+ * This class is used to help manage the OTE Server Folder area. This includes the runtime cache and
+ * the batches area.
+ *
+ * @author Andrew M. Finkbeiner
+ *
+ */
+public interface OTEServerFolder {
+
+ /**
+ * This class will clean out all batch folders that have been marked for delete. It
+ * will not clean out sub-folders so if those exist the folder will not be completely
+ * removed.
+ */
+ public void cleanOldBatchFolders();
+
+ public File getRootFolder();
+
+ public File getServerFolder();
+
+ /**
+ * This is the root folder for all batch folders.
+ *
+ * @return
+ */
+ public File getBatchesFolder();
+
+ public File getCacheFolder();
+
+ /**
+ * This is the root folder for miscellaneous files that might want to be stored.
+ *
+ * @return
+ */
+ public File getMiscFiles();
+
+ /**
+ * This is the batch log file that contains all LEVEL.SEVERE and above log events that happened during
+ * a batch.
+ *
+ * @param batchFolder
+ * @return
+ */
+ public File getBatchLogFile(File batchFolder);
+
+ /**
+ * Generates a new File at the batches root folder with the current time as it's name. This method does
+ * not call mkdirs.
+ *
+ * @return
+ */
+ public File getNewBatchFolder();
+
+ /**
+ * Generates a new File at the batches root folder with the current time as it's name and the suffix appended to it. This method does
+ * not call mkdirs.
+ *
+ * @return
+ */
+ public File getNewBatchFolder(String suffix);
+
+ public File getNewServerFolder();
+
+ public File getCurrentServerFolder();
+
+ public void markFolderForDelete(File folder);
+
+ public void unmarkFolderForDelete(File folder);
+
+ /**
+ * Returns a file that is the results summary of the given outfile. The format of the returned file
+ * if it has content is: <script name>,<results string>,<elapsed time>. There is no guarantee that the
+ * returned file exists or that it has any data, the user must check for existence and validity.
+ *
+ * @param outfile
+ * @return
+ */
+ public File getResultsFile(File outfile);
+
+ /**
+ * Returns a file that specifies the status of a given batch. Possible values in the file are 'in queue',
+ * 'running', and 'complete'. There is no guarantee that the file exists or that it has any content.
+ *
+ * @param batchFolder
+ * @return
+ */
+ public File getBatchStatusFile(File batchFolder);
+
+ /**
+ * Returns a file tht specifies the runlist of a batch. It will be of the format scripts<newline>scripts<newline>...
+ * There is no guarantee that the file exists or that it has any content.
+ *
+ * @param batchFolder
+ * @return
+ */
+ public File getBatchRunList(File batchFolder);
+
+ public List<File> getRunningServerFolders();
+
+ public void removeServerRunningFile(File serverFolder);
+
+}
diff --git a/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/SystemOutput.java b/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/SystemOutput.java
new file mode 100644
index 000000000..2be2268fc
--- /dev/null
+++ b/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/SystemOutput.java
@@ -0,0 +1,7 @@
+package org.eclipse.osee.ote.io;
+
+public interface SystemOutput {
+ public void addListener(SystemOutputListener listener);
+ public void removeListener(SystemOutputListener listener);
+ public void write(String input);
+}
diff --git a/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/SystemOutputListener.java b/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/SystemOutputListener.java
new file mode 100644
index 000000000..f84a633fa
--- /dev/null
+++ b/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/SystemOutputListener.java
@@ -0,0 +1,15 @@
+package org.eclipse.osee.ote.io;
+
+import java.io.IOException;
+
+public interface SystemOutputListener {
+
+ public void close() throws IOException;
+
+ public void flush() throws IOException;
+
+ public void write(byte[] b, int off, int len) throws IOException;
+
+ public void write(byte[] b) throws IOException;
+
+}
diff --git a/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/EarlyIORedirect.java b/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/EarlyIORedirect.java
new file mode 100644
index 000000000..7e020cf9f
--- /dev/null
+++ b/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/EarlyIORedirect.java
@@ -0,0 +1,77 @@
+package org.eclipse.osee.ote.io.internal;
+
+import java.io.InputStream;
+import java.io.PrintStream;
+
+import org.eclipse.osee.ote.io.SystemOutputListener;
+import org.eclipse.osee.ote.properties.OtePropertiesCore;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+public class EarlyIORedirect implements BundleActivator {
+
+ private static EarlyIORedirect instance;
+
+ public static EarlyIORedirect getInstance(){
+ return instance;
+ }
+
+ private PrintStream oldErr;
+ private PrintStream oldOut;
+ private InputStream oldIn;
+ private SpecializedOut out;
+ private SpecializedInputStream in;
+ private String newline;
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ instance = this;
+ oldErr = System.err;
+ oldOut = System.out;
+ oldIn = System.in;
+ if(OtePropertiesCore.ioRedirect.getBooleanValue(false)){
+ out = new SpecializedOut(new SpecializedOutputStream());//outputStream == null ? oldOut : outputStream));
+ newline = OtePropertiesCore.lineSeparator.getValue();
+ in = new SpecializedInputStream(oldIn);
+ if(!OtePropertiesCore.ioRedirectFile.getBooleanValue(false)){
+ out.addListener(new SystemOutputListerImpl(System.out));
+ }
+ System.setIn(in);
+ System.setOut(out);
+ System.setErr(out);
+ }
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ if(out != null){
+ out.flush();
+ }
+ }
+
+ public void addListener(SystemOutputListener listener){
+ if(out != null){
+ out.addListener(listener);
+ }
+ }
+
+ public void removeListener(SystemOutputListener listener){
+ if(out != null){
+ out.removeListener(listener);
+ }
+ }
+
+ public void write(String input){
+ if(in != null){
+// System.out.println(input);
+ in.add(input+newline);
+ }
+ }
+
+ public void resetIO(){
+ System.setIn(oldIn);
+ System.setOut(oldOut);
+ System.setErr(oldErr);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/OTEFolderImpl.java b/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/OTEFolderImpl.java
new file mode 100644
index 000000000..f9e367c28
--- /dev/null
+++ b/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/OTEFolderImpl.java
@@ -0,0 +1,327 @@
+package org.eclipse.osee.ote.io.internal;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream.GetField;
+import java.net.UnknownHostException;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.io.OTEServerFolder;
+import org.eclipse.osee.ote.properties.OtePropertiesCore;
+
+public class OTEFolderImpl implements OTEServerFolder{
+
+ private static int DAYS;
+
+ static {
+ String strDays = OtePropertiesCore.batchFolderDays.getValue();
+ if(strDays!=null){
+ try{
+ DAYS = Integer.parseInt(strDays);
+ } catch (NumberFormatException ex){
+ DAYS = 7;
+ }
+ } else {
+ DAYS = 7;
+ }
+ }
+
+ private static final String DELETE_MARKER = ".delete";
+ private static final String LOG_FILE = ".log";
+ private static final String STATUS_FILE = ".status";
+ private static final String RUNLIST_FILE = ".runlist";
+ private static final String RESULTS_FILE = ".result";
+ private static final String RUNNING_MARKER = ".running";
+
+ private static File OTESERVER = determineOteServerFolder();
+ private static File BATCHES = new File(OTESERVER, "batches");
+ private static File JARCACHE = new File(OTESERVER, "runtimeCache");
+ private static File SERVERS = new File(OTESERVER, "servers");
+ private static File MISCFILES = new File(OTESERVER, "miscFiles");
+
+ private static SimpleDateFormat format = new SimpleDateFormat("yyyy_MM_dd___kk_mm_ss");
+
+ private File currentServerFolder;
+
+ private static File determineOteServerFolder() {
+ String userHome = OtePropertiesCore.userHome.getValue();
+ if (userHome.equals("/root")){
+ userHome = "/home/mptest";
+ }
+ File oteServerFolder = new File(userHome, "/OTESERVER");
+ try {
+ oteServerFolder = new File(oteServerFolder, java.net.InetAddress.getLocalHost().getHostName());
+ } catch (UnknownHostException ex) {
+ OseeLog.log(OTEFolderImpl.class, Level.WARNING, "Unknown host from java.net.InetAddress.getLocalHost() -");
+ }
+ oteServerFolder.setReadable(true);
+ oteServerFolder.setExecutable(true);
+ oteServerFolder.setWritable(true);
+
+ return oteServerFolder;
+
+// File oteStationParent = new File(OtePropertiesCore.oteServerFolder.getValue("undefined"));
+// if (!oteStationParent.exists() || !oteStationParent.isDirectory()) {
+// OseeLog.log(OTEFolderImpl.class, Level.WARNING, "ote server folder parent does not exist folder -" + oteStationParent.getAbsolutePath());
+// oteStationParent = new File(OtePropertiesCore.userHome.getValue(), "OTESERVER");
+// return oteStationParent;
+// }
+// File stationsFolder = new File(oteStationParent, "stations");
+// File stationFolder = new File(stationsFolder, OtePropertiesCore.oteStationName.getValue("unknown-station"));
+// return new File(stationFolder, OtePropertiesCore.userName.getValue());
+ }
+
+ public OTEFolderImpl(){
+ currentServerFolder = getNewServerFolder();
+ String serverIOPath = OtePropertiesCore.ioRedirectPath.getValue(currentServerFolder.getAbsolutePath());
+ currentServerFolder = new File(serverIOPath);
+ }
+
+ /**
+ * ds component method
+ */
+ public void start(){
+ cleanOldBatchFolders();
+ cleanOldServerFolders();
+ }
+
+ /**
+ * ds component method
+ */
+ public void stop(){
+
+ }
+
+ /**
+ * This will not clean sub-folders
+ */
+ @Override
+ public void cleanOldBatchFolders(){
+ Date dateBefore = new Date(new Date().getTime() -(DAYS * 24 * 3600 * 1000));
+ Date dateNoMatterwhat = new Date(new Date().getTime() -(28L * 24L * 3600L * 1000L));//4 weeks
+ if(BATCHES.exists()){
+ File[] files = BATCHES.listFiles();
+ if(files != null){
+ for(File file:files){
+ if(file.isDirectory()){
+ boolean olderFileOrUnknown = true;
+ boolean removeNoMatterWhat = false;
+ try {
+ Date fileDate = format.parse(file.getName());
+ if(fileDate == null){
+ OseeLog.log(getClass(), Level.WARNING, "Failed to parse a date from the Dir name "+ file.getAbsolutePath());
+ } else {
+ olderFileOrUnknown = fileDate.before(dateBefore);
+ removeNoMatterWhat = fileDate.before(dateNoMatterwhat);
+ }
+ } catch (ParseException e) {
+ int index = file.getName().lastIndexOf("__");
+ if(index > 1){
+ try{
+ Date fileDate = format.parse(file.getName().substring(0, index-1));
+ if(fileDate == null){
+ OseeLog.log(getClass(), Level.WARNING, "Failed to parse a date from the Dir name "+ file.getAbsolutePath());
+ } else {
+ olderFileOrUnknown = fileDate.before(dateBefore);
+ removeNoMatterWhat = fileDate.before(dateNoMatterwhat);
+ }
+ } catch (ParseException e2){
+ OseeLog.log(getClass(), Level.SEVERE, e2);
+ }
+ } else {
+ OseeLog.log(getClass(), Level.SEVERE, e);
+ }
+ }
+ File delete = new File(file, DELETE_MARKER);
+ boolean deleteFolder = delete.exists();
+ if((deleteFolder && olderFileOrUnknown) || removeNoMatterWhat){
+ File[] toDelete = file.listFiles();
+ for(File f:toDelete){
+ f.delete();
+ }
+ file.delete();
+ }
+ }
+ }
+ }
+ }
+ }
+
+ public void cleanOldServerFolders(){
+ Date dateBefore = new Date(new Date().getTime() -(DAYS * 24 * 3600 * 1000));
+ Date dateNoMatterwhat = new Date(new Date().getTime() -(28L * 24L * 3600L * 1000L));//4 weeks
+ if(SERVERS.exists()){
+ File[] files = SERVERS.listFiles();
+ if(files != null){
+ for(File file:files){
+ if(file.isDirectory()){
+ boolean olderFileOrUnknown = true;
+ boolean removeNoMatterWhat = false;
+ try {
+ Date fileDate = format.parse(file.getName());
+ if(fileDate == null){
+ OseeLog.log(getClass(), Level.WARNING, "Failed to parse a date from the Dir name "+ file.getAbsolutePath());
+ } else {
+ olderFileOrUnknown = fileDate.before(dateBefore);
+ removeNoMatterWhat = fileDate.before(dateNoMatterwhat);
+ }
+ } catch (ParseException e) {
+ int index = file.getName().lastIndexOf("__");
+ if(index > 1){
+ try{
+ Date fileDate = format.parse(file.getName().substring(0, index-1));
+ if(fileDate == null){
+ OseeLog.log(getClass(), Level.WARNING, "Failed to parse a date from the Dir name "+ file.getAbsolutePath());
+ } else {
+ olderFileOrUnknown = fileDate.before(dateBefore);
+ removeNoMatterWhat = fileDate.before(dateNoMatterwhat);
+ }
+ } catch (ParseException e2){
+ OseeLog.log(getClass(), Level.SEVERE, e2);
+ }
+ } else {
+ OseeLog.log(getClass(), Level.SEVERE, e);
+ }
+ }
+ File running = new File(file, RUNNING_MARKER);
+ boolean deleteFolder = !running.exists();
+ if((deleteFolder && olderFileOrUnknown) || removeNoMatterWhat){
+ File[] toDelete = file.listFiles();
+ for(File f:toDelete){
+ f.delete();
+ }
+ file.delete();
+ }
+ }
+ }
+ }
+ }
+ }
+
+
+
+ @Override
+ public File getRootFolder(){
+ return OTESERVER;
+ }
+
+ @Override
+ public File getServerFolder(){
+ return SERVERS;
+ }
+
+ @Override
+ public File getBatchesFolder(){
+ return BATCHES;
+ }
+
+ @Override
+ public File getCacheFolder(){
+ return JARCACHE;
+ }
+
+ @Override
+ public File getMiscFiles() {
+ return MISCFILES;
+ }
+
+ @Override
+ public File getNewServerFolder() {
+ return new File(getServerFolder(), format.format(new Date()));
+ }
+
+ @Override
+ public File getCurrentServerFolder() {
+ return currentServerFolder;
+ }
+
+ @Override
+ public File getNewBatchFolder() {
+ return new File(getBatchesFolder(), format.format(new Date()));
+ }
+
+ @Override
+ public File getNewBatchFolder(String suffix) {
+ if(suffix != null && suffix.length() > 0){
+ return new File(getBatchesFolder(), format.format(new Date())+"__" + suffix);
+ } else {
+ return getNewBatchFolder();
+ }
+ }
+
+ @Override
+ public File getResultsFile(File outfile){
+ return new File(outfile.getAbsolutePath() + RESULTS_FILE);
+ }
+
+ @Override
+ public void markFolderForDelete(File folder) {
+ FileOutputStream fos = null;
+ try {
+ folder.mkdirs();
+ fos = new FileOutputStream(new File(folder, DELETE_MARKER));
+ } catch (FileNotFoundException e) {
+ OseeLog.log(getClass(), Level.SEVERE, e);
+ } finally {
+ if(fos != null){
+ try {
+ fos.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+
+ @Override
+ public void unmarkFolderForDelete(File folder) {
+ File delete = new File(folder, DELETE_MARKER);
+ if(delete.exists()){
+ delete.delete();
+ }
+ }
+
+ @Override
+ public File getBatchLogFile(File batchFolder) {
+ return new File(batchFolder, LOG_FILE);
+ }
+
+ @Override
+ public File getBatchStatusFile(File batchFolder) {
+ return new File(batchFolder, STATUS_FILE);
+ }
+
+ @Override
+ public File getBatchRunList(File batchFolder) {
+ return new File(batchFolder, RUNLIST_FILE);
+ }
+
+ @Override
+ public List<File> getRunningServerFolders() {
+ List<File> files = new ArrayList<>();
+ for(File serverDir:SERVERS.listFiles()){
+ File running = new File(serverDir, RUNNING_MARKER);
+ if(running.exists()){
+ files.add(serverDir);
+ }
+ }
+ return files;
+ }
+
+ @Override
+ public void removeServerRunningFile(File serverFolder) {
+ File file = new File(serverFolder, RUNNING_MARKER);
+ if(file.exists()){
+ file.delete();
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/SpecializedInputStream.java b/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/SpecializedInputStream.java
new file mode 100644
index 000000000..520ab0a58
--- /dev/null
+++ b/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/SpecializedInputStream.java
@@ -0,0 +1,76 @@
+package org.eclipse.osee.ote.io.internal;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.ReentrantLock;
+
+public class SpecializedInputStream extends InputStream {
+
+ private StringBuffer buffer = new StringBuffer();
+ private ReentrantLock lock;
+ private Condition newData;
+ private InputStream monitorIn;
+ private Thread th;
+
+ public SpecializedInputStream(InputStream in){
+ monitorIn = in;
+ lock = new ReentrantLock();
+ newData = lock.newCondition();
+ th = new Thread(new Runnable(){
+
+ @Override
+ public void run() {
+ InputStreamReader isr=new InputStreamReader(monitorIn);
+ BufferedReader br=new BufferedReader(isr);
+ boolean validSystemIn = true;
+ while(validSystemIn){
+ try{
+ String line = br.readLine();
+ if(line != null){
+ add(line);
+ } else {
+ validSystemIn = false;
+ }
+ } catch (Throwable th){
+
+ }
+ }
+ }
+
+ });
+ th.setDaemon(true);
+ th.setName("OTE System.in monitor");
+ th.start();
+ }
+
+ @Override
+ public int read() throws IOException {
+ int mychar = 0;
+ lock.lock();
+ try{
+ if(buffer.length() == 0){
+ newData.awaitUninterruptibly();
+ }
+ mychar = buffer.charAt(0) & 0xFF;
+ buffer.deleteCharAt(0);
+ } catch (Throwable th){
+ } finally {
+ lock.unlock();
+ }
+ return mychar;
+ }
+
+ public void add(String str){
+ lock.lock();
+ try{
+ buffer.append(str);
+ newData.signalAll();
+ } finally {
+ lock.unlock();
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/SpecializedOut.java b/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/SpecializedOut.java
new file mode 100644
index 000000000..51be19aa9
--- /dev/null
+++ b/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/SpecializedOut.java
@@ -0,0 +1,23 @@
+package org.eclipse.osee.ote.io.internal;
+
+import java.io.PrintStream;
+
+import org.eclipse.osee.ote.io.SystemOutputListener;
+
+public class SpecializedOut extends PrintStream {
+
+ private SpecializedOutputStream specialOut;
+
+ public SpecializedOut(SpecializedOutputStream out) {
+ super(out);
+ this.specialOut = out;
+ }
+
+ public void addListener(SystemOutputListener listener){
+ specialOut.add(listener);
+ }
+
+ public void removeListener(SystemOutputListener listener){
+ specialOut.remove(listener);
+ }
+}
diff --git a/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/SpecializedOutputStream.java b/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/SpecializedOutputStream.java
new file mode 100644
index 000000000..5f4b6ac78
--- /dev/null
+++ b/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/SpecializedOutputStream.java
@@ -0,0 +1,58 @@
+package org.eclipse.osee.ote.io.internal;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.eclipse.osee.ote.io.SystemOutputListener;
+
+public class SpecializedOutputStream extends OutputStream {
+
+ private CopyOnWriteArrayList<SystemOutputListener> listeners;
+
+ public SpecializedOutputStream() {
+ this.listeners = new CopyOnWriteArrayList<>();
+ }
+
+ public void add(SystemOutputListener listener){
+ listeners.add(listener);
+ }
+
+ public void remove(SystemOutputListener listner){
+ listeners.remove(listner);
+ }
+
+ @Override
+ public void write(int arg0) throws IOException {
+
+ }
+
+ @Override
+ public void close() throws IOException {
+ for(SystemOutputListener listner:listeners){
+ listner.close();
+ }
+ }
+
+ @Override
+ public void flush() throws IOException {
+ for(SystemOutputListener listner:listeners){
+ listner.flush();
+ }
+ }
+
+ @Override
+ public void write(byte[] b, int off, int len) throws IOException {
+ for(SystemOutputListener listner:listeners){
+ listner.write(b, off, len);
+ }
+ }
+
+ @Override
+ public void write(byte[] b) throws IOException {
+ for(SystemOutputListener listner:listeners){
+ listner.write(b);
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/SystemOutputImpl.java b/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/SystemOutputImpl.java
new file mode 100644
index 000000000..db65ac42a
--- /dev/null
+++ b/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/SystemOutputImpl.java
@@ -0,0 +1,71 @@
+package org.eclipse.osee.ote.io.internal;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+import org.eclipse.osee.ote.io.OTEServerFolder;
+import org.eclipse.osee.ote.io.SystemOutput;
+import org.eclipse.osee.ote.io.SystemOutputListener;
+import org.eclipse.osee.ote.properties.OtePropertiesCore;
+
+public class SystemOutputImpl implements SystemOutput {
+
+ private static final String SYSTEM_OUT_FILE = "systemout.txt";
+
+ private BufferedOutputStream outputStream;
+
+ private OTEServerFolder serverFolder;
+
+ public void start() {
+ if(OtePropertiesCore.ioRedirect.getBooleanValue(false)){
+ if(OtePropertiesCore.ioRedirectFile.getBooleanValue(false)){
+ File wd = serverFolder.getCurrentServerFolder();
+ wd.mkdirs();
+ if(wd.exists() && wd.isDirectory()){
+ try {
+ outputStream = new BufferedOutputStream(new FileOutputStream(new File(wd, SYSTEM_OUT_FILE)));
+ EarlyIORedirect.getInstance().addListener(new SystemOutputListerImpl(outputStream));
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+ }
+
+ public void stop(){
+ try {
+ if(outputStream != null){
+ outputStream.flush();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void bindOTEServerFolder(OTEServerFolder folder) {
+ this.serverFolder = folder;
+ }
+
+ public void unbindOTEServerFolder(OTEServerFolder folder) {
+ this.serverFolder = null;
+ }
+
+ @Override
+ public void addListener(SystemOutputListener listener){
+ EarlyIORedirect.getInstance().addListener(listener);
+ }
+
+ @Override
+ public void removeListener(SystemOutputListener listener){
+ EarlyIORedirect.getInstance().removeListener(listener);
+ }
+
+ @Override
+ public synchronized void write(String input){
+ EarlyIORedirect.getInstance().write(input);
+ }
+}
diff --git a/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/SystemOutputListerImpl.java b/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/SystemOutputListerImpl.java
new file mode 100644
index 000000000..ccc651fc7
--- /dev/null
+++ b/org.eclipse.osee.ote.io/src/org/eclipse/osee/ote/io/internal/SystemOutputListerImpl.java
@@ -0,0 +1,36 @@
+package org.eclipse.osee.ote.io.internal;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+import org.eclipse.osee.ote.io.SystemOutputListener;
+
+public class SystemOutputListerImpl implements SystemOutputListener {
+
+ private OutputStream outputStream;
+
+ public SystemOutputListerImpl(OutputStream outputStream) {
+ this.outputStream = outputStream;
+ }
+
+ @Override
+ public void close() throws IOException {
+ outputStream.close();
+ }
+
+ @Override
+ public void flush() throws IOException {
+ outputStream.flush();
+ }
+
+ @Override
+ public void write(byte[] b, int off, int len) throws IOException {
+ outputStream.write(b, off, len);
+ }
+
+ @Override
+ public void write(byte[] b) throws IOException {
+ outputStream.write(b);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.jms/.classpath b/org.eclipse.osee.ote.jms/.classpath
new file mode 100644
index 000000000..1fa3e6803
--- /dev/null
+++ b/org.eclipse.osee.ote.jms/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.ote.jms/.project b/org.eclipse.osee.ote.jms/.project
new file mode 100644
index 000000000..a22199795
--- /dev/null
+++ b/org.eclipse.osee.ote.jms/.project
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ote.jms</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ds.core.builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.jms/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.jms/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..caaae9341
--- /dev/null
+++ b/org.eclipse.osee.ote.jms/META-INF/MANIFEST.MF
@@ -0,0 +1,25 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OTE JMS (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.jms
+Bundle-Version: 0.25.3.qualifier
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Import-Package: org.eclipse.osee.connection.service,
+ org.eclipse.osee.framework.core.exception,
+ org.eclipse.osee.framework.jdk.core.type,
+ org.eclipse.osee.framework.jdk.core.util;resolution:=optional,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.osee.ote,
+ org.eclipse.osee.ote.core,
+ org.eclipse.osee.ote.core.environment,
+ org.eclipse.osee.ote.core.environment.interfaces,
+ org.eclipse.osee.ote.endpoint,
+ org.eclipse.osee.ote.message,
+ org.eclipse.osee.ote.message.elements,
+ org.eclipse.osee.ote.message.event,
+ org.eclipse.osee.ote.service;resolution:=optional,
+ org.osgi.service.event;version="1.3.0"
+Require-Bundle: org.eclipse.core.runtime
+Service-Component: OSGI-INF/*.xml
+Bundle-ActivationPolicy: lazy
diff --git a/org.eclipse.osee.ote.jms/OSGI-INF/ote.endpoint.bridge.component.xml b/org.eclipse.osee.ote.jms/OSGI-INF/ote.endpoint.bridge.component.xml
new file mode 100644
index 000000000..8593ec6c1
--- /dev/null
+++ b/org.eclipse.osee.ote.jms/OSGI-INF/ote.endpoint.bridge.component.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" immediate="true" name="org.eclipse.osee.ote.jms.bridge.endpoint">
+ <property name="event.topics" type="String" value="ote/*"/>
+ <implementation class="org.eclipse.osee.ote.jms.bridge.EventToEndpoint"/>
+ <service>
+ <provide interface="org.osgi.service.event.EventHandler"/>
+ </service>
+ <reference bind="bindOteUdpEndpoint" cardinality="1..1" interface="org.eclipse.osee.ote.endpoint.OteUdpEndpoint" name="OteUdpEndpoint" policy="static" unbind="unbindOteUdpEndpoint"/>
+</scr:component>
diff --git a/org.eclipse.osee.ote.jms/build.properties b/org.eclipse.osee.ote.jms/build.properties
new file mode 100644
index 000000000..6210e849b
--- /dev/null
+++ b/org.eclipse.osee.ote.jms/build.properties
@@ -0,0 +1,5 @@
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ OSGI-INF/
+source.. = src/
diff --git a/org.eclipse.osee.ote.jms/pom.xml b/org.eclipse.osee.ote.jms/pom.xml
new file mode 100644
index 000000000..92d1d5d93
--- /dev/null
+++ b/org.eclipse.osee.ote.jms/pom.xml
@@ -0,0 +1,35 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.osee</groupId>
+ <artifactId>org.eclipse.osee.ote.parent</artifactId>
+ <version>0.25.3-SNAPSHOT</version>
+ <relativePath>../org.eclipse.osee.ote.parent</relativePath>
+ </parent>
+
+ <artifactId>org.eclipse.osee.ote.jms</artifactId>
+ <packaging>eclipse-plugin</packaging>
+ <name>OTE JMS</name>
+
+ <build>
+ <!-- workaround for https://issues.sonatype.org/browse/TYCHO-168 -->
+ <resources>
+ <resource>
+ <directory>src</directory>
+ <excludes>
+ <exclude>**/*.java</exclude>
+ </excludes>
+ </resource>
+ </resources>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-source-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.jms/src/org/eclipse/osee/ote/jms/bridge/EventToEndpoint.java b/org.eclipse.osee.ote.jms/src/org/eclipse/osee/ote/jms/bridge/EventToEndpoint.java
new file mode 100644
index 000000000..da4e6f764
--- /dev/null
+++ b/org.eclipse.osee.ote.jms/src/org/eclipse/osee/ote/jms/bridge/EventToEndpoint.java
@@ -0,0 +1,45 @@
+package org.eclipse.osee.ote.jms.bridge;
+
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.OTEException;
+import org.eclipse.osee.ote.core.CopyOnWriteNoIteratorList;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpoint;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpointSender;
+import org.eclipse.osee.ote.message.event.OteEventMessage;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventHandler;
+
+public class EventToEndpoint implements EventHandler {
+
+ private OteUdpEndpoint endpoint;
+
+ public void bindOteUdpEndpoint(OteUdpEndpoint endpoint){
+ this.endpoint = endpoint;
+ }
+
+ public void unbindOteUdpEndpoint(OteUdpEndpoint endpoint){
+ this.endpoint = null;
+ }
+
+ @Override
+ public void handleEvent(Event arg0) {
+ OteEventMessage oteEventMessage = OteEventMessageUtil.getOteEventMessage(arg0);
+ if(oteEventMessage != null && oteEventMessage.getHeader().TTL.getValue().intValue() == 0){
+ oteEventMessage.getHeader().ADDRESS.setAddress(endpoint.getLocalEndpoint().getAddress());
+ oteEventMessage.getHeader().ADDRESS.setPort(endpoint.getLocalEndpoint().getPort());
+ CopyOnWriteNoIteratorList<OteUdpEndpointSender> broadcastSenders = endpoint.getBroadcastSenders();
+ OteUdpEndpointSender[] oteUdpEndpointSenders = broadcastSenders.get();
+ for(int i = 0; i < oteUdpEndpointSenders.length; i++){
+ try{
+ oteUdpEndpointSenders[i].send(oteEventMessage);
+ } catch (OTEException ex){
+ OseeLog.log(getClass(), Level.SEVERE, ex);
+ }
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.master.feature/.project b/org.eclipse.osee.ote.master.feature/.project
new file mode 100644
index 000000000..7c6f69a93
--- /dev/null
+++ b/org.eclipse.osee.ote.master.feature/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ote.master.feature</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.pde.FeatureBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.FeatureNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.master.feature/build.properties b/org.eclipse.osee.ote.master.feature/build.properties
new file mode 100644
index 000000000..64f93a9f0
--- /dev/null
+++ b/org.eclipse.osee.ote.master.feature/build.properties
@@ -0,0 +1 @@
+bin.includes = feature.xml
diff --git a/org.eclipse.osee.ote.master.feature/feature.xml b/org.eclipse.osee.ote.master.feature/feature.xml
new file mode 100644
index 000000000..a6ec3bea6
--- /dev/null
+++ b/org.eclipse.osee.ote.master.feature/feature.xml
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+ id="org.eclipse.osee.ote.master.feature"
+ label="Feature"
+ version="0.25.3.qualifier"
+ provider-name="Eclipse Open System Engineering Environment">
+
+ <description url="http://www.example.com/description">
+ [Enter Feature Description here.]
+ </description>
+
+ <copyright url="http://www.example.com/copyright">
+ [Enter Copyright Description here.]
+ </copyright>
+
+ <license url="http://www.example.com/license">
+ [Enter License Description here.]
+ </license>
+
+ <plugin
+ id="org.eclipse.jetty.continuation"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.jetty.http"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.jetty.io"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.jetty.security"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.jetty.server"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.jetty.servlet"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.jetty.util"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.ote.master"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.ote.master.rest"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.ote.master.rest.client"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.osee.ote.master.rest.model"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.core.net"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.equinox.security"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+</feature>
diff --git a/org.eclipse.osee.ote.master.feature/pom.xml b/org.eclipse.osee.ote.master.feature/pom.xml
new file mode 100644
index 000000000..18bd8bc8c
--- /dev/null
+++ b/org.eclipse.osee.ote.master.feature/pom.xml
@@ -0,0 +1,13 @@
+<project
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.eclipse.osee</groupId>
+ <artifactId>org.eclipse.osee.ote.parent</artifactId>
+ <version>0.25.3-SNAPSHOT</version>
+ <relativePath>../org.eclipse.osee.ote.parent</relativePath>
+ </parent>
+ <artifactId>org.eclipse.osee.ote.master.feature</artifactId>
+ <packaging>eclipse-feature</packaging>
+ <name>OSEE OTE Master Feature - (Incubation)</name>
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.master.feature/sourceTemplateFeature/.gitkeep b/org.eclipse.osee.ote.master.feature/sourceTemplateFeature/.gitkeep
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/org.eclipse.osee.ote.master.feature/sourceTemplateFeature/.gitkeep
diff --git a/org.eclipse.osee.ote.master.product/.project b/org.eclipse.osee.ote.master.product/.project
new file mode 100644
index 000000000..d62b3f90d
--- /dev/null
+++ b/org.eclipse.osee.ote.master.product/.project
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ote.master.product</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ </buildSpec>
+ <natures>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.master.product/customize-product.xml b/org.eclipse.osee.ote.master.product/customize-product.xml
new file mode 100644
index 000000000..5db9f8712
--- /dev/null
+++ b/org.eclipse.osee.ote.master.product/customize-product.xml
@@ -0,0 +1,103 @@
+<project name="Customize OSEE OTE Master Product" default="run">
+
+ <!-- *************************************************************** -->
+ <!-- MAIN RUN -->
+ <!-- *************************************************************** -->
+ <target name="run">
+ <echo>Customize OSEE OTE Master Product</echo>
+ <echo>Product-Name: [${product-name}]</echo>
+ <echo>Archive-Name: [${zip-product-name}]</echo>
+ <echo>Products-Path: [${products-directory}]</echo>
+ <echo>Output-Path: [${output-directory}]</echo>
+ <echo>Resources-Path: [${resources-directory}]</echo>
+ <echo />
+
+ <property name="defaultWorkspaceName" value="workspace" />
+ <property name="additionalExecIniArgs" value=" " />
+
+ <updateProduct os="win32" ws="win32" arch="x86" jreVersion="1.8.0_45" />
+ <updateProduct os="win32" ws="win32" arch="x86_64" jreVersion="1.8.0_45" />
+ <updateProduct os="linux" ws="gtk" arch="x86" jreVersion="1.8.0_45" />
+ <updateProduct os="linux" ws="gtk" arch="x86_64" jreVersion="1.8.0_45" />
+ <updateProduct os="macosx" ws="cocoa" arch="x86_64" jreVersion="_" />
+
+ <!--
+ <updateProduct os="solaris" ws="gtk" arch="sparc" jreVersion="1.6.0_24" />
+ <updateProduct os="macosx" ws="carbon" arch="x86" jreVersion="_" />
+ <updateProduct os="macosx" ws="cocoa" arch="x86" jreVersion="_" />
+ -->
+ </target>
+
+ <!-- *************************************************************** -->
+ <!-- MAIN RUN -->
+ <!-- *************************************************************** -->
+ <macrodef name="updateProduct">
+ <attribute name="os" />
+ <attribute name="ws" />
+ <attribute name="arch" />
+ <attribute name="jreVersion" />
+ <sequential>
+ <var name="productPath" value="${products-directory}/${product-name}/@{os}/@{ws}/@{arch}" />
+ <var name="productConfigPath" value="${productPath}/configuration" />
+ <var name="productPluginPath" value="${productPath}/plugins" />
+ <var name="productEtcPath" value="${productPath}/etc" />
+
+ <mkdir dir="${productEtcPath}" />
+ <copy todir="${productEtcPath}">
+ <fileset dir="${etc-content-directory}" />
+ </copy>
+
+ <!-- Add JRE
+ <if>
+ <equals arg1="@{os}" arg2="macosx" />
+ <then> -->
+ <!-- NO JRE for MACOSX -->
+ <!-- </then>
+ <else>
+ <var name="jreResource" value="${resources-directory}/../jres/jre_@{jreVersion}_@{os}_@{arch}.zip" />
+ <unzip src="${jreResource}" dest="${productPath}" />
+ <chmod perm="ugo+x" dir="${productPath}/jre" includes="**/*" />
+ </else>
+ </if>
+ -->
+
+ <!-- Update Configuration Area
+ <delete dir="${productConfigPath}/.settings" failonerror="false" quiet="true" />
+ <delete dir="${productConfigPath}/org.eclipse.update" failonerror="false" quiet="true" />
+ <mkdir dir="${productConfigPath}/.settings" />
+ <copy file="${resources-directory}/org.eclipse.core.net.prefs" tofile="${productConfigPath}/.settings/org.eclipse.core.net.prefs" overwrite="true" />
+-->
+ <!-- Update Configuration INI
+ <customizeConfigIni configpath="${productConfigPath}" pluginspath="${productPluginPath}" configarch="@{arch}" />
+-->
+ <!-- Extra Launches
+ <generateExecutable os="@{os}" productDir="${productPath}" execName="oseeDebug" eclipseArgs="-console${line.separator}-consoleLog" extravmargs="-Xmx1G${line.separator}-Xdebug${line.separator}-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=9009" additionalVmArgs="-Dosee.default.broker.uri=tcp://osee-installs.msc.az.boeing.com:61616${line.separator}${additionalExecIniArgs}" />
+ <generateExecutable os="@{os}" productDir="${productPath}" execName="oseeBigMemory" eclipseArgs="-console${line.separator}-consoleLog" extravmargs="-Xmx2G${line.separator}" additionalVmArgs="-Dosee.default.broker.uri=tcp://osee-installs.msc.az.boeing.com:61616${line.separator}${additionalExecIniArgs}" />
+-->
+ <!-- Copy Icon if Win32
+ <if>
+ <equals arg1="@{os}" arg2="win32" />
+ <then>
+ <copy file="${resources-directory}/../icons/win32/osee.ico" tofile="${productPath}/OSEE.ico" />
+ </then>
+ </if>
+-->
+ <!-- Zip Product -->
+ <var name="productZipName" value="${products-directory}/${product-name}-@{os}.@{ws}.@{arch}.zip" />
+ <var name="productTarName" value="${products-directory}/${product-name}-@{os}.@{ws}.@{arch}.tar" />
+ <if>
+ <equals arg1="@{os}" arg2="win32" />
+ <then>
+ <zip destfile="${productZipName}" basedir="${productPath}" update="true" />
+ </then>
+ <else>
+ <tar destfile="${productTarName}" basedir="${productPath}" longfile="gnu" />
+ <gzip src="${productTarName}" destfile="${productTarName}.gz" />
+ <delete file="${productTarName}" quiet="true" />
+ </else>
+ </if>
+ </sequential>
+ </macrodef>
+
+
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.master.product/etc/ote.server.config.json b/org.eclipse.osee.ote.master.product/etc/ote.server.config.json
new file mode 100644
index 000000000..1272c6145
--- /dev/null
+++ b/org.eclipse.osee.ote.master.product/etc/ote.server.config.json
@@ -0,0 +1,8 @@
+{
+ "config": [
+ {
+ "service.pid": "org.eclipse.osee.http.jetty.internal.osgi.InMemoryJettyHttpService",
+ "jetty.server.context.session.inactive.interval": 3600
+ }
+ ]
+}
diff --git a/org.eclipse.osee.ote.master.product/org.eclipse.osee.ote.master.product b/org.eclipse.osee.ote.master.product/org.eclipse.osee.ote.master.product
new file mode 100644
index 000000000..3e9b8df9d
--- /dev/null
+++ b/org.eclipse.osee.ote.master.product/org.eclipse.osee.ote.master.product
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?pde version="3.5"?>
+
+<product name="OteMasterProduct" uid="org.eclipse.osee.ote.master.product" id="org.eclipse.osee.ote.master.rest.OTEMasterServerProduct" application="org.eclipse.osee.ote.master.app" version="0.23.2.qualifier" useFeatures="true" includeLaunchers="true">
+
+ <configIni use="default">
+ </configIni>
+
+ <launcherArgs>
+ <programArgs>-console
+ </programArgs>
+ <vmArgs>-Dorg.osgi.service.http.port=8008
+-Ddequinox.ds.debug=true
+-Ddequinox.ds.print=true
+-Dcm.config.uri=&quot;etc/ote.server.config.json&quot;
+ </vmArgs>
+ <vmArgsMac>-XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts
+ </vmArgsMac>
+ </launcherArgs>
+
+ <windowImages/>
+
+ <launcher>
+ <solaris/>
+ <win useIco="false">
+ <bmp/>
+ </win>
+ </launcher>
+
+ <vm>
+ <windows include="false">org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8</windows>
+ </vm>
+
+ <plugins>
+ </plugins>
+
+ <features>
+ <feature id="org.eclipse.osee.x.core.external.feature"/>
+ <feature id="org.eclipse.osee.x.core.feature"/>
+ <feature id="org.eclipse.osee.ote.master.feature"/>
+ <feature id="org.eclipse.osee.ote.server.external.feature"/>
+ <feature id="org.eclipse.osee.core.feature"/>
+ </features>
+
+ <configurations>
+ <plugin id="org.eclipse.core.runtime" autoStart="true" startLevel="4" />
+ <plugin id="org.eclipse.equinox.cm" autoStart="true" startLevel="2" />
+ <plugin id="org.eclipse.equinox.common" autoStart="true" startLevel="2" />
+ <plugin id="org.eclipse.equinox.ds" autoStart="true" startLevel="2" />
+ <plugin id="org.eclipse.equinox.http.jetty" autoStart="true" startLevel="0" />
+ </configurations>
+
+</product>
diff --git a/org.eclipse.osee.ote.master.product/pom.xml b/org.eclipse.osee.ote.master.product/pom.xml
new file mode 100644
index 000000000..ed2ebb4ca
--- /dev/null
+++ b/org.eclipse.osee.ote.master.product/pom.xml
@@ -0,0 +1,72 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.osee</groupId>
+ <artifactId>org.eclipse.osee.ote.parent</artifactId>
+ <version>0.25.3-SNAPSHOT</version>
+ <relativePath>../org.eclipse.osee.ote.parent</relativePath>
+ </parent>
+
+ <artifactId>org.eclipse.osee.ote.master.product</artifactId>
+ <packaging>eclipse-repository</packaging>
+ <name>OSEE Lookup - Product</name>
+ <version>0.25.3-SNAPSHOT</version>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-p2-director-plugin</artifactId>
+ <version>${tycho-version}</version>
+ <executions>
+ <execution>
+ <id>materialize-products</id>
+ <goals>
+ <goal>materialize-products</goal>
+ </goals>
+ </execution>
+ <!-- <execution> <id>archive-products</id> <goals> <goal>archive-products</goal>
+ </goals> </execution> -->
+ </executions>
+ </plugin>
+ <plugin>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <version>${maven-antrun-version}</version>
+ <executions>
+ <execution>
+ <id>customize-osee-ote-master</id>
+ <phase>package</phase>
+ <configuration>
+ <target>
+ <property name="plugin_classpath" refid="maven.plugin.classpath" />
+ <taskdef resource="net/sf/antcontrib/antlib.xml">
+ <classpath>
+ <pathelement path="${classpath}" />
+ <pathelement path="${plugin_classpath}" />
+ </classpath>
+ </taskdef>
+
+ <property name="product-name" value="org.eclipse.osee.ote.master.product" />
+ <property name="zip-product-name" value="${product-name}" />
+ <property name="products-directory" value="${project.build.directory}/products" />
+ <property name="output-directory" value="${project.build.directory}" />
+ <property name="resources-directory" value="${project.basedir}/resources" />
+ <property name="etc-content-directory" value="${project.basedir}/etc" />
+
+ <ant antfile="customize-product.xml" target="run"
+ inheritRefs="true" />
+ </target>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
diff --git a/org.eclipse.osee.ote.master.rest.client/.classpath b/org.eclipse.osee.ote.master.rest.client/.classpath
new file mode 100644
index 000000000..1fa3e6803
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.client/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.ote.master.rest.client/.project b/org.eclipse.osee.ote.master.rest.client/.project
new file mode 100644
index 000000000..e4b3b68af
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.client/.project
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ote.master.rest.client</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ds.core.builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.master.rest.client/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.master.rest.client/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..5541a4999
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.client/META-INF/MANIFEST.MF
@@ -0,0 +1,23 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OTE Master Client Rest (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.master.rest.client
+Bundle-Version: 0.25.3.qualifier
+Require-Bundle: org.eclipse.core.runtime
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Import-Package: com.google.inject,
+ com.google.inject.binder,
+ com.google.inject.matcher,
+ com.google.inject.spi,
+ javax.ws.rs;version="2.0.0",
+ javax.ws.rs.client;version="2.0.0",
+ javax.ws.rs.core;version="2.0.0",
+ org.eclipse.osee.framework.jdk.core.type,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.osee.jaxrs,
+ org.eclipse.osee.jaxrs.client,
+ org.eclipse.osee.ote.master.rest.model
+Export-Package: org.eclipse.osee.ote.master.rest.client
+Service-Component: OSGI-INF/*.xml
+Bundle-Vendor: Eclipse Open System Engineering Environment
diff --git a/org.eclipse.osee.ote.master.rest.client/OSGI-INF/ote.master.rest.client.xml b/org.eclipse.osee.ote.master.rest.client/OSGI-INF/ote.master.rest.client.xml
new file mode 100644
index 000000000..6c2a6e593
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.client/OSGI-INF/ote.master.rest.client.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="start" deactivate="stop" modified="update">
+ <implementation class="org.eclipse.osee.ote.master.rest.client.internal.OTEMasterServerImpl"/>
+ <service>
+ <provide interface="org.eclipse.osee.ote.master.rest.client.OTEMasterServer"/>
+ </service>
+</scr:component>
diff --git a/org.eclipse.osee.ote.master.rest.client/build.properties b/org.eclipse.osee.ote.master.rest.client/build.properties
new file mode 100644
index 000000000..6210e849b
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.client/build.properties
@@ -0,0 +1,5 @@
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ OSGI-INF/
+source.. = src/
diff --git a/org.eclipse.osee.ote.master.rest.client/pom.xml b/org.eclipse.osee.ote.master.rest.client/pom.xml
new file mode 100644
index 000000000..6eaea9373
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.client/pom.xml
@@ -0,0 +1,35 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.osee</groupId>
+ <artifactId>org.eclipse.osee.ote.parent</artifactId>
+ <version>0.25.3-SNAPSHOT</version>
+ <relativePath>../org.eclipse.osee.ote.parent</relativePath>
+ </parent>
+
+ <artifactId>org.eclipse.osee.ote.master.rest.client</artifactId>
+ <packaging>eclipse-plugin</packaging>
+ <name>OTE Master Client Rest</name>
+
+ <build>
+ <!-- workaround for https://issues.sonatype.org/browse/TYCHO-168 -->
+ <resources>
+ <resource>
+ <directory>src</directory>
+ <excludes>
+ <exclude>**/*.java</exclude>
+ </excludes>
+ </resource>
+ </resources>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-source-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/OTEMasterServer.java b/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/OTEMasterServer.java
new file mode 100644
index 000000000..3ef9077bc
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/OTEMasterServer.java
@@ -0,0 +1,12 @@
+package org.eclipse.osee.ote.master.rest.client;
+
+import java.net.URI;
+import java.util.concurrent.Future;
+
+import org.eclipse.osee.ote.master.rest.model.OTEServer;
+
+public interface OTEMasterServer {
+ Future<OTEMasterServerAvailableNodes> getAvailableServers(URI uri);
+ Future<OTEMasterServerResult> addServer(URI uri, OTEServer server);
+ Future<OTEMasterServerResult> removeServer(URI uri, OTEServer server);
+}
diff --git a/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/OTEMasterServerAvailableNodes.java b/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/OTEMasterServerAvailableNodes.java
new file mode 100644
index 000000000..f69f2eea1
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/OTEMasterServerAvailableNodes.java
@@ -0,0 +1,27 @@
+package org.eclipse.osee.ote.master.rest.client;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.osee.ote.master.rest.model.OTEServer;
+
+public class OTEMasterServerAvailableNodes extends OTEMasterServerResult {
+
+ private List<OTEServer> oteServers;
+
+ public OTEMasterServerAvailableNodes(){
+ oteServers = new ArrayList<>();
+ }
+
+ public List<OTEServer> getServers(){
+ return oteServers;
+ }
+
+ public void setServers(OTEServer[] servers) {
+ oteServers.clear();
+ for(OTEServer server:servers){
+ oteServers.add(server);
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/OTEMasterServerResult.java b/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/OTEMasterServerResult.java
new file mode 100644
index 000000000..df14451b7
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/OTEMasterServerResult.java
@@ -0,0 +1,21 @@
+package org.eclipse.osee.ote.master.rest.client;
+
+public class OTEMasterServerResult {
+
+ private Throwable th = null;
+ private boolean success = true;
+
+ public Throwable getThrowable() {
+ return th;
+ }
+ public void setThrowable(Throwable th) {
+ this.th = th;
+ }
+ public boolean isSuccess() {
+ return success;
+ }
+ public void setSuccess(boolean success) {
+ this.success = success;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/internal/AddServer.java b/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/internal/AddServer.java
new file mode 100644
index 000000000..afba07488
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/internal/AddServer.java
@@ -0,0 +1,50 @@
+package org.eclipse.osee.ote.master.rest.client.internal;
+
+import java.net.HttpURLConnection;
+import java.net.URI;
+import java.util.concurrent.Callable;
+import java.util.logging.Level;
+
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.UriBuilder;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.jaxrs.client.JaxRsClient;
+import org.eclipse.osee.jaxrs.client.JaxRsWebTarget;
+import org.eclipse.osee.ote.master.rest.client.OTEMasterServerResult;
+import org.eclipse.osee.ote.master.rest.model.OTEServer;
+
+public class AddServer implements Callable<OTEMasterServerResult> {
+
+ private final JaxRsClient webClientProvider;
+ private final OTEServer server;
+ private final URI uri;
+
+ public AddServer(JaxRsClient webClientProvider, URI uri, OTEServer server) {
+ this.webClientProvider = webClientProvider;
+ this.uri = uri;
+ this.server = server;
+ }
+
+ @Override
+ public OTEMasterServerResult call() throws Exception {
+ OTEMasterServerResult result = new OTEMasterServerResult();
+ try {
+ URI targetUri =
+ UriBuilder.fromUri(uri).path(OTEMasterServerImpl.CONTEXT_NAME).path(OTEMasterServerImpl.CONTEXT_SERVERS).build();
+
+ if(HttpUtil.canConnect(targetUri)){
+ JaxRsWebTarget target = webClientProvider.target(targetUri);
+ javax.ws.rs.client.Invocation.Builder builder = target.request(MediaType.APPLICATION_XML);
+ builder.post(Entity.xml(server));
+ } else {
+ result.setSuccess(false);
+ }
+ } catch (Throwable th) {
+ result.setSuccess(false);
+ // result.setThrowable(th);
+ }
+ return result;
+ }
+}
diff --git a/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/internal/GetAvailableServers.java b/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/internal/GetAvailableServers.java
new file mode 100644
index 000000000..57bc86f23
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/internal/GetAvailableServers.java
@@ -0,0 +1,39 @@
+package org.eclipse.osee.ote.master.rest.client.internal;
+
+import java.net.URI;
+import java.util.concurrent.Callable;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.UriBuilder;
+import org.eclipse.osee.jaxrs.client.JaxRsClient;
+import org.eclipse.osee.ote.master.rest.client.OTEMasterServerAvailableNodes;
+import org.eclipse.osee.ote.master.rest.model.OTEServer;
+
+public class GetAvailableServers implements Callable<OTEMasterServerAvailableNodes> {
+
+ private final JaxRsClient webClientProvider;
+ private final URI uri;
+
+ public GetAvailableServers(JaxRsClient webClientProvider, URI uri) {
+ this.webClientProvider = webClientProvider;
+ this.uri = uri;
+ }
+
+ @Override
+ public OTEMasterServerAvailableNodes call() throws Exception {
+ URI targetUri =
+ UriBuilder.fromUri(uri).path(OTEMasterServerImpl.CONTEXT_NAME).path(OTEMasterServerImpl.CONTEXT_SERVERS).build();
+
+ OTEMasterServerAvailableNodes result = new OTEMasterServerAvailableNodes();
+ try {
+ OTEServer[] servers =
+ webClientProvider.target(targetUri).request(MediaType.APPLICATION_XML).get(OTEServer[].class);
+ result.setServers(servers);
+ result.setSuccess(true);
+ } catch (Throwable th) {
+ result.setSuccess(false);
+ result.setThrowable(th);
+ }
+ return result;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/internal/HttpUtil.java b/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/internal/HttpUtil.java
new file mode 100644
index 000000000..1f7edc382
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/internal/HttpUtil.java
@@ -0,0 +1,24 @@
+package org.eclipse.osee.ote.master.rest.client.internal;
+
+import java.net.HttpURLConnection;
+import java.net.URI;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+
+public class HttpUtil {
+
+ public static boolean canConnect(URI targetUri) {
+ try{
+ HttpURLConnection connection = (HttpURLConnection)targetUri.toURL().openConnection();
+ connection.setRequestMethod("HEAD");
+ int responseCode = connection.getResponseCode();
+ if(responseCode == 200){
+ return true;
+ }
+ } catch (Throwable th){
+ OseeLog.log(HttpUtil.class, Level.INFO, th);
+ }
+ return false;
+ }
+}
diff --git a/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/internal/OTEMasterServerImpl.java b/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/internal/OTEMasterServerImpl.java
new file mode 100644
index 000000000..2a5e334b0
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/internal/OTEMasterServerImpl.java
@@ -0,0 +1,63 @@
+package org.eclipse.osee.ote.master.rest.client.internal;
+
+import java.net.URI;
+import java.util.Map;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.ThreadFactory;
+
+import org.eclipse.osee.jaxrs.client.JaxRsClient;
+import org.eclipse.osee.ote.master.rest.client.OTEMasterServer;
+import org.eclipse.osee.ote.master.rest.client.OTEMasterServerAvailableNodes;
+import org.eclipse.osee.ote.master.rest.client.OTEMasterServerResult;
+import org.eclipse.osee.ote.master.rest.model.OTEServer;
+
+public class OTEMasterServerImpl implements OTEMasterServer {
+
+ static final String CONTEXT_NAME = "otemaster";
+ static final String CONTEXT_SERVERS = "servers";
+
+ private volatile JaxRsClient client;
+ private ExecutorService executor;
+
+ public void start(Map<String, Object> props) {
+ executor = Executors.newCachedThreadPool(new ThreadFactory() {
+ @Override
+ public Thread newThread(Runnable arg0) {
+ Thread th = new Thread(arg0);
+ th.setName("OTE Master Client " + th.getId());
+ th.setDaemon(false);
+ return th;
+ }
+ });
+ update(props);
+ }
+
+ public void stop() {
+ if (executor != null) {
+ executor.shutdown();
+ }
+ client = null;
+ }
+
+ public void update(Map<String, Object> props) {
+ client = JaxRsClient.newBuilder().properties(props).build();
+ }
+
+ @Override
+ public Future<OTEMasterServerAvailableNodes> getAvailableServers(URI uri) {
+ return executor.submit(new GetAvailableServers(client, uri));
+ }
+
+ @Override
+ public Future<OTEMasterServerResult> addServer(URI uri, OTEServer server) {
+ return executor.submit(new AddServer(client, uri, server));
+ }
+
+ @Override
+ public Future<OTEMasterServerResult> removeServer(URI uri, OTEServer server) {
+ return executor.submit(new RemoveServer(client, uri, server));
+ }
+
+}
diff --git a/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/internal/RemoveServer.java b/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/internal/RemoveServer.java
new file mode 100644
index 000000000..b91f43fd1
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.client/src/org/eclipse/osee/ote/master/rest/client/internal/RemoveServer.java
@@ -0,0 +1,46 @@
+package org.eclipse.osee.ote.master.rest.client.internal;
+
+import java.net.HttpURLConnection;
+import java.net.URI;
+import java.util.concurrent.Callable;
+import java.util.logging.Level;
+
+import javax.ws.rs.core.UriBuilder;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.jaxrs.client.JaxRsClient;
+import org.eclipse.osee.ote.master.rest.client.OTEMasterServerResult;
+import org.eclipse.osee.ote.master.rest.model.OTEServer;
+
+public class RemoveServer implements Callable<OTEMasterServerResult> {
+
+ private final JaxRsClient webClientProvider;
+ private final OTEServer server;
+ private final URI uri;
+
+ public RemoveServer(JaxRsClient webClientProvider, URI uri, OTEServer server) {
+ this.webClientProvider = webClientProvider;
+ this.uri = uri;
+ this.server = server;
+ }
+
+ @Override
+ public OTEMasterServerResult call() throws Exception {
+ OTEMasterServerResult result = new OTEMasterServerResult();
+ try {
+ URI mainTarget =
+ UriBuilder.fromUri(uri).path(OTEMasterServerImpl.CONTEXT_NAME).path(OTEMasterServerImpl.CONTEXT_SERVERS).build();
+ URI targetUri =
+ UriBuilder.fromUri(uri).path(OTEMasterServerImpl.CONTEXT_NAME).path(OTEMasterServerImpl.CONTEXT_SERVERS).path(server.getUUID().toString()).build();
+ if(HttpUtil.canConnect(mainTarget)){
+ webClientProvider.target(targetUri).request().delete();
+ } else {
+ result.setSuccess(false);
+ }
+ } catch (Throwable th) {
+ result.setSuccess(false);
+ result.setThrowable(th);
+ }
+ return result;
+ }
+}
diff --git a/org.eclipse.osee.ote.master.rest.model/.classpath b/org.eclipse.osee.ote.master.rest.model/.classpath
new file mode 100644
index 000000000..1fa3e6803
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.model/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.ote.master.rest.model/.project b/org.eclipse.osee.ote.master.rest.model/.project
new file mode 100644
index 000000000..322c3ade2
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.model/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ote.master.rest.model</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.master.rest.model/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.master.rest.model/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..72e99607b
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.model/META-INF/MANIFEST.MF
@@ -0,0 +1,10 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OTE Master Rest Model (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.master.rest.model
+Bundle-Version: 0.25.3.qualifier
+Require-Bundle: org.eclipse.core.runtime
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: org.eclipse.osee.ote.master.rest.model
+Bundle-Vendor: Eclipse Open System Engineering Environment
diff --git a/org.eclipse.osee.ote.master.rest.model/build.properties b/org.eclipse.osee.ote.master.rest.model/build.properties
new file mode 100644
index 000000000..34d2e4d2d
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.model/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .
diff --git a/org.eclipse.osee.ote.master.rest.model/pom.xml b/org.eclipse.osee.ote.master.rest.model/pom.xml
new file mode 100644
index 000000000..2f4ca45c8
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.model/pom.xml
@@ -0,0 +1,35 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.osee</groupId>
+ <artifactId>org.eclipse.osee.ote.parent</artifactId>
+ <version>0.25.3-SNAPSHOT</version>
+ <relativePath>../org.eclipse.osee.ote.parent</relativePath>
+ </parent>
+
+ <artifactId>org.eclipse.osee.ote.master.rest.model</artifactId>
+ <packaging>eclipse-plugin</packaging>
+ <name>OTE Master Rest Model</name>
+
+ <build>
+ <!-- workaround for https://issues.sonatype.org/browse/TYCHO-168 -->
+ <resources>
+ <resource>
+ <directory>src</directory>
+ <excludes>
+ <exclude>**/*.java</exclude>
+ </excludes>
+ </resource>
+ </resources>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-source-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.master.rest.model/src/org/eclipse/osee/ote/master/rest/model/OTEServer.java b/org.eclipse.osee.ote.master.rest.model/src/org/eclipse/osee/ote/master/rest/model/OTEServer.java
new file mode 100644
index 000000000..76fed8720
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.model/src/org/eclipse/osee/ote/master/rest/model/OTEServer.java
@@ -0,0 +1,107 @@
+package org.eclipse.osee.ote.master.rest.model;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement
+public class OTEServer {
+
+ private String uuid;
+ private String type;
+ private String startTime;
+ private String name;
+ private String station;
+ private String version;
+ private String comment;
+ private String owner;
+ private String oteRestServer;
+ private String oteActivemqServer;
+ private String connectedUsers;
+
+ public String getStation() {
+ return station;
+ }
+
+ public void setStation(String station) {
+ this.station = station;
+ }
+
+ public String getVersion() {
+ return version;
+ }
+
+ public void setVersion(String version) {
+ this.version = version;
+ }
+
+ public String getComment() {
+ return comment;
+ }
+
+ public void setComment(String comment) {
+ this.comment = comment;
+ }
+
+ public String getOwner() {
+ return owner;
+ }
+
+ public void setOwner(String owner) {
+ this.owner = owner;
+ }
+
+ public String getOteRestServer() {
+ return oteRestServer;
+ }
+
+ public void setOteRestServer(String oteRestServer) {
+ this.oteRestServer = oteRestServer;
+ }
+
+ public String getOteActivemqServer() {
+ return oteActivemqServer;
+ }
+
+ public void setOteActivemqServer(String oteActivemqServer) {
+ this.oteActivemqServer = oteActivemqServer;
+ }
+
+ public String getConnectedUsers() {
+ return connectedUsers;
+ }
+
+ public void setConnectedUsers(String connectedUsers) {
+ this.connectedUsers = connectedUsers;
+ }
+
+ public void setUUID(String uuid){
+ this.uuid = uuid;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public String getStartTime() {
+ return startTime;
+ }
+
+ public void setStartTime(String startTime) {
+ this.startTime = startTime;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+ public String getUUID() {
+ return uuid;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.master.rest.test/.classpath b/org.eclipse.osee.ote.master.rest.test/.classpath
new file mode 100644
index 000000000..1fa3e6803
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.test/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.ote.master.rest.test/.project b/org.eclipse.osee.ote.master.rest.test/.project
new file mode 100644
index 000000000..fec674e22
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.test/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ote.master.rest.test</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.master.rest.test/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.master.rest.test/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..9a193e2f0
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.test/META-INF/MANIFEST.MF
@@ -0,0 +1,14 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OTE Master Rest Test (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.master.rest.test
+Bundle-Version: 0.25.3.qualifier
+Fragment-Host: org.eclipse.osee.ote.master.rest.client;bundle-version="0.11.1"
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Require-Bundle: org.junit,
+ org.apache.felix.gogo.command,
+ org.apache.felix.gogo.runtime,
+ org.apache.felix.gogo.shell,
+ org.eclipse.equinox.ds,
+ org.eclipse.equinox.console
+Bundle-Vendor: Eclipse Open System Engineering Environment
diff --git a/org.eclipse.osee.ote.master.rest.test/build.properties b/org.eclipse.osee.ote.master.rest.test/build.properties
new file mode 100644
index 000000000..34d2e4d2d
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.test/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .
diff --git a/org.eclipse.osee.ote.master.rest.test/src/org/eclipse/osee/ote/master/rest/test/ClientAPITest.java b/org.eclipse.osee.ote.master.rest.test/src/org/eclipse/osee/ote/master/rest/test/ClientAPITest.java
new file mode 100644
index 000000000..2959aeca3
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest.test/src/org/eclipse/osee/ote/master/rest/test/ClientAPITest.java
@@ -0,0 +1,120 @@
+package org.eclipse.osee.ote.master.rest.test;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Date;
+import java.util.UUID;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+import org.eclipse.osee.ote.master.rest.client.OTEMasterServer;
+import org.eclipse.osee.ote.master.rest.client.OTEMasterServerAvailableNodes;
+import org.eclipse.osee.ote.master.rest.client.OTEMasterServerResult;
+import org.eclipse.osee.ote.master.rest.model.OTEServer;
+import org.junit.Assert;
+import org.junit.Test;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.ServiceReference;
+
+public class ClientAPITest {
+
+ private static final String TEST_URI = "http://localhost:8008/";
+
+ @Test
+ public void testAdd() throws URISyntaxException, InterruptedException, ExecutionException, TimeoutException {
+ OTEMasterServer oteMaster = getService(OTEMasterServer.class);
+ Assert.assertNotNull(oteMaster);
+ OTEServer server = createServer();
+
+ Future<OTEMasterServerResult> addServer = oteMaster.addServer(new URI(TEST_URI), server);
+ OTEMasterServerResult oteMasterServerResult = addServer.get(15, TimeUnit.SECONDS);
+ Assert.assertNotNull(oteMasterServerResult);
+ Assert.assertTrue(oteMasterServerResult.isSuccess());
+
+ Future<OTEMasterServerResult> removeServer = oteMaster.removeServer(new URI(TEST_URI), server);
+ OTEMasterServerResult oteMasterServerResult2 = removeServer.get(15, TimeUnit.SECONDS);
+ Assert.assertNotNull(oteMasterServerResult2);
+ Assert.assertTrue(oteMasterServerResult2.isSuccess());
+
+ Thread.sleep(1000);
+
+ Future<OTEMasterServerAvailableNodes> availableServers = oteMaster.getAvailableServers(new URI(TEST_URI));
+ OTEMasterServerAvailableNodes nodes = availableServers.get(45, TimeUnit.SECONDS);
+ Assert.assertNotNull(nodes);
+ Assert.assertTrue(nodes.isSuccess());
+ Assert.assertEquals(0, nodes.getServers().size());
+ }
+
+ private OTEServer createServer() {
+ OTEServer server = new OTEServer();
+ server.setUUID(UUID.randomUUID().toString());
+ server.setName("test");
+ server.setStartTime(new Date().toString());
+ server.setType("oteserver");
+ server.setOteActivemqServer("tcp://localhost:8998");
+ server.setOteRestServer("http://localhost:8009");
+ return server;
+ }
+
+ @Test
+ public void testGet() throws URISyntaxException, InterruptedException, ExecutionException, TimeoutException {
+ OTEMasterServer oteMaster = getService(OTEMasterServer.class);
+ Assert.assertNotNull(oteMaster);
+
+ Future<OTEMasterServerAvailableNodes> availableServers = oteMaster.getAvailableServers(new URI(TEST_URI));
+ OTEMasterServerAvailableNodes nodes = availableServers.get(45, TimeUnit.SECONDS);
+ Assert.assertNotNull(nodes);
+ Assert.assertTrue(nodes.isSuccess());
+ Assert.assertEquals(0, nodes.getServers().size());
+
+ OTEServer server = createServer();
+ Future<OTEMasterServerResult> addServer = oteMaster.addServer(new URI(TEST_URI), server);
+ OTEMasterServerResult oteMasterServerResult = addServer.get(15, TimeUnit.SECONDS);
+ Assert.assertNotNull(oteMasterServerResult);
+ Assert.assertTrue(oteMasterServerResult.isSuccess());
+
+ Thread.sleep(1000);
+
+ availableServers = oteMaster.getAvailableServers(new URI(TEST_URI));
+ nodes = availableServers.get(45, TimeUnit.SECONDS);
+ Assert.assertNotNull(nodes);
+ Assert.assertTrue(nodes.isSuccess());
+ Assert.assertEquals(1, nodes.getServers().size());
+
+ Future<OTEMasterServerResult> removeServer = oteMaster.removeServer(new URI(TEST_URI), server);
+ OTEMasterServerResult oteMasterServerResult2 = removeServer.get(10, TimeUnit.SECONDS);
+ Assert.assertNotNull(oteMasterServerResult2);
+ Assert.assertTrue(oteMasterServerResult2.isSuccess());
+
+ Thread.sleep(1000);
+
+ availableServers = oteMaster.getAvailableServers(new URI(TEST_URI));
+ nodes = availableServers.get(45, TimeUnit.SECONDS);
+ Assert.assertNotNull(nodes);
+ Assert.assertTrue(nodes.isSuccess());
+ Assert.assertEquals(0, nodes.getServers().size());
+
+ }
+
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ public static <T> T getService(Class<T> clazz){
+ BundleContext context = getContext();
+ if(context == null){
+ return null;
+ }
+ ServiceReference serviceReference = context.getServiceReference(clazz.getName());
+ if(serviceReference == null){
+ return null;
+ }
+ return (T)getContext().getService(serviceReference);
+ }
+
+ public static BundleContext getContext(){
+ return FrameworkUtil.getBundle(ClientAPITest.class).getBundleContext();
+ }
+
+}
diff --git a/org.eclipse.osee.ote.master.rest/.classpath b/org.eclipse.osee.ote.master.rest/.classpath
new file mode 100644
index 000000000..1fa3e6803
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.ote.master.rest/.project b/org.eclipse.osee.ote.master.rest/.project
new file mode 100644
index 000000000..ee8542e45
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest/.project
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ote.master.rest</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ds.core.builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.master.rest/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.master.rest/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..1f9082b1e
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest/META-INF/MANIFEST.MF
@@ -0,0 +1,15 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OTE Master Rest (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.master.rest;singleton:=true
+Bundle-Version: 0.25.3.qualifier
+Require-Bundle: org.eclipse.core.runtime
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Import-Package: javax.ws.rs,
+ javax.ws.rs.core,
+ javax.ws.rs.ext,
+ org.eclipse.osee.ote.master,
+ org.eclipse.osee.ote.master.rest.model
+Service-Component: OSGI-INF/*.xml
+Bundle-Vendor: Eclipse Open System Engineering Environment
diff --git a/org.eclipse.osee.ote.master.rest/OSGI-INF/ote.master.rest.application.xml b/org.eclipse.osee.ote.master.rest/OSGI-INF/ote.master.rest.application.xml
new file mode 100644
index 000000000..e1b24be4a
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest/OSGI-INF/ote.master.rest.application.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="start" deactivate="stop" immediate="true" name="org.eclipse.osee.ote.rest.internal.OTERestApplication">
+ <implementation class="org.eclipse.osee.ote.master.rest.internal.OTERestApplication"/>
+ <service>
+ <provide interface="javax.ws.rs.core.Application"/>
+ </service>
+ <reference bind="bindOTELookup" cardinality="1..1" interface="org.eclipse.osee.ote.master.OTELookup" name="OTELookup" policy="static" unbind="unbindOTELookup"/>
+</scr:component>
diff --git a/org.eclipse.osee.ote.master.rest/build.properties b/org.eclipse.osee.ote.master.rest/build.properties
new file mode 100644
index 000000000..3e5f9ad7d
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest/build.properties
@@ -0,0 +1,6 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ OSGI-INF/
diff --git a/org.eclipse.osee.ote.master.rest/plugin.xml b/org.eclipse.osee.ote.master.rest/plugin.xml
new file mode 100644
index 000000000..b2deffde7
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest/plugin.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+ <extension
+ id="OTEMasterServerProduct"
+ name="OTE Master Server Product"
+ point="org.eclipse.core.runtime.products">
+ <product
+ application="org.eclipse.osee.ote.master.app"
+ description="OTE Master Server"
+ name="OteMasterProduct">
+ <property
+ name="appName"
+ value="OteMasterProduct">
+ </property>
+
+ </product>
+ </extension>
+ <extension
+ id="org.eclipse.osee.ote.master.app"
+ name="OTE Master Server"
+ point="org.eclipse.core.runtime.applications">
+ <application
+ cardinality="singleton-global"
+ thread="main"
+ visible="true">
+ <run
+ class="org.eclipse.osee.ote.master.rest.internal.OTEMasterApplication">
+ </run>
+ </application>
+ </extension>
+
+</plugin>
diff --git a/org.eclipse.osee.ote.master.rest/pom.xml b/org.eclipse.osee.ote.master.rest/pom.xml
new file mode 100644
index 000000000..c21e382ef
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest/pom.xml
@@ -0,0 +1,35 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.osee</groupId>
+ <artifactId>org.eclipse.osee.ote.parent</artifactId>
+ <version>0.25.3-SNAPSHOT</version>
+ <relativePath>../org.eclipse.osee.ote.parent</relativePath>
+ </parent>
+
+ <artifactId>org.eclipse.osee.ote.master.rest</artifactId>
+ <packaging>eclipse-plugin</packaging>
+ <name>OTE Master Rest</name>
+
+ <build>
+ <!-- workaround for https://issues.sonatype.org/browse/TYCHO-168 -->
+ <resources>
+ <resource>
+ <directory>src</directory>
+ <excludes>
+ <exclude>**/*.java</exclude>
+ </excludes>
+ </resource>
+ </resources>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-source-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.master.rest/src/org/eclipse/osee/ote/master/rest/internal/OTEAvailableServersResource.java b/org.eclipse.osee.ote.master.rest/src/org/eclipse/osee/ote/master/rest/internal/OTEAvailableServersResource.java
new file mode 100644
index 000000000..a9777948e
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest/src/org/eclipse/osee/ote/master/rest/internal/OTEAvailableServersResource.java
@@ -0,0 +1,116 @@
+package org.eclipse.osee.ote.master.rest.internal;
+
+import java.net.MalformedURLException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+import java.util.concurrent.ExecutionException;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Request;
+import javax.ws.rs.core.UriBuilderException;
+import javax.ws.rs.core.UriInfo;
+
+import org.eclipse.osee.ote.master.OTELookup;
+import org.eclipse.osee.ote.master.OTELookupServerEntry;
+import org.eclipse.osee.ote.master.rest.model.OTEServer;
+
+@Path("servers")
+public class OTEAvailableServersResource {
+
+ // Allows to insert contextual objects into the class,
+ // e.g. ServletContext, Request, Response, UriInfo
+ @Context
+ UriInfo uriInfo;
+ @Context
+ Request request;
+
+ @GET
+ @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
+ public List<OTEServer> getOTEServers() throws MalformedURLException, IllegalArgumentException, UriBuilderException, InterruptedException, ExecutionException {
+ OTELookup oteLookup = OTERestApplication.getOTELookup();
+ List<OTELookupServerEntry> availableServers = oteLookup.getAvailableServers();
+ List<OTEServer> servers = new ArrayList<>();
+ for (OTELookupServerEntry entry : availableServers) {
+ servers.add(Util.convert(entry));
+ }
+ return servers;
+ }
+
+ @GET
+ @Produces(MediaType.TEXT_HTML)
+ public String getAsHtml() {
+ OTELookup oteLookup = OTERestApplication.getOTELookup();
+ List<OTELookupServerEntry> availableServers = oteLookup.getAvailableServers();
+
+ StringBuilder builder = new StringBuilder();
+ builder.append("<html><body>");
+ builder.append("<table border=\"1\">");
+
+ builder.append("<tr>\n");
+ builder.append("<th>");
+ builder.append("Station");
+ builder.append("</th>");
+ builder.append("<th>");
+ builder.append("Name");
+ builder.append("</th>");
+ builder.append("<th>");
+ builder.append("ConnectedUsers");
+ builder.append("</th>");
+ builder.append("<th>");
+ builder.append("StartTime");
+ builder.append("</th>");
+ builder.append("</tr>\n");
+
+ for (OTELookupServerEntry entry : availableServers) {
+ builder.append("<tr>\n");
+ builder.append("<td>");
+ builder.append(entry.getStation());
+ builder.append("</td>");
+ builder.append("<td>");
+ builder.append(entry.getName());
+ builder.append("</td>");
+ builder.append("<td>");
+ builder.append(entry.getConnectedUsers());
+ builder.append("</td>");
+ builder.append("<td>");
+ builder.append(entry.getStartTime());
+ builder.append("</td>");
+ builder.append("</tr>\n");
+ }
+ builder.append("</table>");
+ builder.append("<br/>");
+ builder.append("</body></html>");
+ return builder.toString();
+ }
+
+ @POST
+ @Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
+ public void updateServer(OTEServer server) throws Exception {
+ OTELookup oteLookup = OTERestApplication.getOTELookup();
+ oteLookup.addServer(Util.convert(server));
+ }
+
+ @DELETE
+ @Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
+ public void removeServer(OTEServer server) throws Exception {
+ OTELookup oteLookup = OTERestApplication.getOTELookup();
+ oteLookup.removeServer(Util.convert(server));
+ }
+
+ @DELETE
+ @Path("{uuid}")
+ public void removeServer(@PathParam("uuid") String uuid) throws Exception {
+ OTELookup oteLookup = OTERestApplication.getOTELookup();
+ oteLookup.removeServer(UUID.fromString(uuid));
+ }
+
+}
diff --git a/org.eclipse.osee.ote.master.rest/src/org/eclipse/osee/ote/master/rest/internal/OTEMasterApplication.java b/org.eclipse.osee.ote.master.rest/src/org/eclipse/osee/ote/master/rest/internal/OTEMasterApplication.java
new file mode 100644
index 000000000..bdf922bd7
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest/src/org/eclipse/osee/ote/master/rest/internal/OTEMasterApplication.java
@@ -0,0 +1,22 @@
+package org.eclipse.osee.ote.master.rest.internal;
+
+import org.eclipse.equinox.app.IApplication;
+import org.eclipse.equinox.app.IApplicationContext;
+
+public class OTEMasterApplication implements IApplication {
+
+ @Override
+ public Object start(IApplicationContext context) throws Exception {
+ Object obj = new Object();
+ synchronized (obj) {
+ obj.wait();
+ }
+ return IApplication.EXIT_OK;
+ }
+
+ @Override
+ public void stop() {
+
+ }
+
+}
diff --git a/org.eclipse.osee.ote.master.rest/src/org/eclipse/osee/ote/master/rest/internal/OTERestApplication.java b/org.eclipse.osee.ote.master.rest/src/org/eclipse/osee/ote/master/rest/internal/OTERestApplication.java
new file mode 100644
index 000000000..2fc7b104e
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest/src/org/eclipse/osee/ote/master/rest/internal/OTERestApplication.java
@@ -0,0 +1,39 @@
+package org.eclipse.osee.ote.master.rest.internal;
+
+import java.util.HashSet;
+import java.util.Set;
+import javax.ws.rs.ApplicationPath;
+import javax.ws.rs.core.Application;
+import org.eclipse.osee.ote.master.OTELookup;
+
+@ApplicationPath("otemaster")
+public class OTERestApplication extends Application {
+
+ private static OTELookup oteLookup;
+
+ @Override
+ public Set<Class<?>> getClasses() {
+ Set<Class<?>> classes = new HashSet<>();
+ classes.add(OTEAvailableServersResource.class);
+ return classes;
+ }
+
+ public void start() {
+ }
+
+ public void stop() {
+ }
+
+ public void bindOTELookup(OTELookup oteLookupSrv) {
+ OTERestApplication.oteLookup = oteLookupSrv;
+ }
+
+ public void unbindOTELookup(OTELookup oteLookupSrv) {
+ OTERestApplication.oteLookup = null;
+ }
+
+ static OTELookup getOTELookup() {
+ return oteLookup;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.master.rest/src/org/eclipse/osee/ote/master/rest/internal/Util.java b/org.eclipse.osee.ote.master.rest/src/org/eclipse/osee/ote/master/rest/internal/Util.java
new file mode 100644
index 000000000..eafaaf6c3
--- /dev/null
+++ b/org.eclipse.osee.ote.master.rest/src/org/eclipse/osee/ote/master/rest/internal/Util.java
@@ -0,0 +1,63 @@
+package org.eclipse.osee.ote.master.rest.internal;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.UUID;
+
+import org.eclipse.osee.ote.master.OTELookupServerEntry;
+import org.eclipse.osee.ote.master.OTEServerType;
+import org.eclipse.osee.ote.master.rest.model.OTEServer;
+
+class Util {
+
+
+ static OTEServer convert(OTELookupServerEntry entry){
+ OTEServer server = new OTEServer();
+ server.setComment(entry.getComment());
+ server.setConnectedUsers(entry.getConnectedUsers());
+ server.setName(entry.getName());
+ server.setOteActivemqServer(entry.getOteActivemqServer().toString());
+ server.setOteRestServer(entry.getOteRestServer().toString());
+ server.setOwner(entry.getOwner());
+ server.setStartTime(entry.getStartTime().toString());
+ server.setType(entry.getType().getName());
+ server.setStation(entry.getStation());
+ server.setUUID(entry.getUUID().toString());
+ server.setVersion(entry.getVersion());
+ return server;
+ }
+
+ public static OTELookupServerEntry convert(OTEServer server) throws ParseException, URISyntaxException {
+ UUID uuid = UUID.fromString(server.getUUID());
+ URI uri = new URI(server.getOteActivemqServer());
+ DateFormat df = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
+ Date date = df.parse(server.getStartTime());
+
+ OTELookupServerEntry entry = new OTELookupServerEntry(uuid, uri, server.getName(), new OTEServerTypeGeneric(server.getType()) ,date);
+ entry.setComment(server.getComment());
+ entry.setConnectedUsers(server.getConnectedUsers());
+ entry.setOteActivemqServer(new URI(server.getOteActivemqServer()));
+ entry.setOteRestServer(new URI(server.getOteRestServer()));
+ entry.setOwner(server.getOwner());
+ entry.setStation(server.getStation());
+ entry.setVersion(server.getVersion());
+ return entry;
+ }
+
+ private static class OTEServerTypeGeneric implements OTEServerType{
+ private final String type;
+
+ public OTEServerTypeGeneric(String type) {
+ this.type = type;
+ }
+
+ @Override
+ public String getName(){
+ return this.type;
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.master.test/.classpath b/org.eclipse.osee.ote.master.test/.classpath
new file mode 100644
index 000000000..1fa3e6803
--- /dev/null
+++ b/org.eclipse.osee.ote.master.test/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.ote.master.test/.project b/org.eclipse.osee.ote.master.test/.project
new file mode 100644
index 000000000..0509b92c9
--- /dev/null
+++ b/org.eclipse.osee.ote.master.test/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ote.master.test</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.master.test/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.master.test/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..2821f4021
--- /dev/null
+++ b/org.eclipse.osee.ote.master.test/META-INF/MANIFEST.MF
@@ -0,0 +1,9 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OTE Master Test (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.master.test
+Bundle-Version: 0.25.3.qualifier
+Fragment-Host: org.eclipse.osee.ote.master;bundle-version="0.11.1"
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Require-Bundle: org.junit;bundle-version="4.10.0"
+Bundle-Vendor: Eclipse Open System Engineering Environment
diff --git a/org.eclipse.osee.ote.master.test/build.properties b/org.eclipse.osee.ote.master.test/build.properties
new file mode 100644
index 000000000..34d2e4d2d
--- /dev/null
+++ b/org.eclipse.osee.ote.master.test/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .
diff --git a/org.eclipse.osee.ote.master.test/pom.xml b/org.eclipse.osee.ote.master.test/pom.xml
new file mode 100644
index 000000000..93e90e9a9
--- /dev/null
+++ b/org.eclipse.osee.ote.master.test/pom.xml
@@ -0,0 +1,35 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.osee</groupId>
+ <artifactId>org.eclipse.osee.ote.parent</artifactId>
+ <version>0.25.3-SNAPSHOT</version>
+ <relativePath>../org.eclipse.osee.ote.parent</relativePath>
+ </parent>
+
+ <artifactId>org.eclipse.osee.ote.master.test</artifactId>
+ <packaging>eclipse-test-plugin</packaging>
+ <name>OTE Master Test</name>
+
+ <build>
+ <!-- workaround for https://issues.sonatype.org/browse/TYCHO-168 -->
+ <resources>
+ <resource>
+ <directory>src</directory>
+ <excludes>
+ <exclude>**/*.java</exclude>
+ </excludes>
+ </resource>
+ </resources>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-source-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.master.test/src/org/eclipse/osee/ote/master/internal/OTELookupImplTest.java b/org.eclipse.osee.ote.master.test/src/org/eclipse/osee/ote/master/internal/OTELookupImplTest.java
new file mode 100644
index 000000000..ef4897c29
--- /dev/null
+++ b/org.eclipse.osee.ote.master.test/src/org/eclipse/osee/ote/master/internal/OTELookupImplTest.java
@@ -0,0 +1,177 @@
+package org.eclipse.osee.ote.master.internal;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+
+import org.eclipse.osee.ote.master.OTELookup;
+import org.eclipse.osee.ote.master.OTELookupServerEntry;
+import org.eclipse.osee.ote.master.OTEServerType;
+import org.junit.Assert;
+import org.junit.Ignore;
+import org.junit.Test;
+
+public class OTELookupImplTest {
+
+ OTEServerType basicType = new OTEServerType() {
+ @Override
+ public String getName() {
+ return "test";
+ }
+ };
+
+ private OTELookupServerEntry create(String name) throws URISyntaxException {
+ UUID uuid = UUID.randomUUID();
+ URI uri = new URI("http://localhost:8085/ote");
+ OTELookupServerEntry entry = new OTELookupServerEntry(uuid, uri, name, basicType, new Date());
+ return entry;
+ }
+
+ @Test
+ public void testAdd() throws URISyntaxException {
+ OTELookup lookup = new OTELookupImpl();
+
+ OTELookupServerEntry entry = create("test1");
+ lookup.addServer(entry);
+ List<OTELookupServerEntry> servers = lookup.getAvailableServers();
+
+ Assert.assertTrue(servers.contains(entry));
+ Assert.assertEquals(1, servers.size());
+ }
+
+ @Test
+ public void testUpdate() throws URISyntaxException {
+ OTELookup lookup = new OTELookupImpl();
+
+ OTELookupServerEntry entry = create("oldname");
+ lookup.addServer(entry);
+
+ Assert.assertEquals(1, lookup.getAvailableServers().size());
+
+ lookup.addServer(entry);
+
+ Assert.assertEquals(1, lookup.getAvailableServers().size());
+
+ }
+
+ @Test
+ public void testRemove() throws URISyntaxException {
+ OTELookup lookup = new OTELookupImpl();
+
+ OTELookupServerEntry entry1 = create("name1");
+ lookup.addServer(entry1);
+
+ OTELookupServerEntry entry2 = create("name2");
+ lookup.addServer(entry2);
+
+ OTELookupServerEntry entry3 = create("name3");
+ lookup.addServer(entry3);
+
+ Assert.assertEquals(3, lookup.getAvailableServers().size());
+
+ lookup.removeServer(entry1);
+
+ Assert.assertEquals(2, lookup.getAvailableServers().size());
+
+ lookup.removeServer(entry1);
+
+ Assert.assertEquals(2, lookup.getAvailableServers().size());
+
+ lookup.removeServer(entry2);
+
+ Assert.assertEquals(1, lookup.getAvailableServers().size());
+
+ lookup.removeServer(entry3);
+
+ Assert.assertEquals(0, lookup.getAvailableServers().size());
+ }
+
+ @Ignore
+ @Test
+ public void testTimeoutRemoval() throws URISyntaxException, InterruptedException {
+ OTELookupImpl lookup = new OTELookupImpl();
+ lookup.setTimeoutSeconds(10);
+ lookup.start();
+
+ OTELookupServerEntry entry1 = create("name1");
+ lookup.addServer(entry1);
+
+ Assert.assertEquals(1, lookup.getAvailableServers().size());
+
+ Thread.sleep(1000*15);
+
+ Assert.assertEquals(0, lookup.getAvailableServers().size());
+
+ }
+
+ @Ignore
+ @Test
+ public void testTimeoutRemovalLong() throws URISyntaxException, InterruptedException {
+ OTELookupImpl lookup = new OTELookupImpl();
+ lookup.setTimeoutSeconds(60*3);
+ lookup.start();
+
+ OTELookupServerEntry entry1 = create("name1");
+ lookup.addServer(entry1);
+
+ Assert.assertEquals(1, lookup.getAvailableServers().size());
+
+ Thread.sleep(1000*60);
+
+ Assert.assertEquals(1, lookup.getAvailableServers().size());
+
+ Thread.sleep(1000*60);
+
+ Assert.assertEquals(1, lookup.getAvailableServers().size());
+
+ Thread.sleep(1000*40);
+
+ Assert.assertEquals(1, lookup.getAvailableServers().size());
+
+ Thread.sleep(1000*40);
+
+ Assert.assertEquals(0, lookup.getAvailableServers().size());
+
+ }
+
+ @Ignore
+ @Test
+ public void testTimeoutRemovalLonger() throws URISyntaxException, InterruptedException {
+ OTELookupImpl lookup = new OTELookupImpl();
+ lookup.setTimeoutSeconds(30);
+ lookup.start();
+
+ OTELookupServerEntry entry1 = create("name1");
+ lookup.addServer(entry1);
+
+ Assert.assertEquals(1, lookup.getAvailableServers().size());
+
+ Thread.sleep((1000*15));
+
+ lookup.addServer(entry1);
+
+ Thread.sleep((1000*15));
+
+ lookup.addServer(entry1);
+
+ Thread.sleep((1000*15));
+
+ lookup.addServer(entry1);
+
+ Thread.sleep((1000*15));
+
+ lookup.addServer(entry1);
+
+ Thread.sleep((1000*15));
+
+ lookup.addServer(entry1);
+
+ Thread.sleep((1000*45));
+
+ Assert.assertEquals(0, lookup.getAvailableServers().size());
+
+ }
+
+}
diff --git a/org.eclipse.osee.ote.master/.classpath b/org.eclipse.osee.ote.master/.classpath
new file mode 100644
index 000000000..1fa3e6803
--- /dev/null
+++ b/org.eclipse.osee.ote.master/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.ote.master/.project b/org.eclipse.osee.ote.master/.project
new file mode 100644
index 000000000..bd8756ae1
--- /dev/null
+++ b/org.eclipse.osee.ote.master/.project
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ote.master</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ds.core.builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.master/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.master/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..9c78db980
--- /dev/null
+++ b/org.eclipse.osee.ote.master/META-INF/MANIFEST.MF
@@ -0,0 +1,11 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OTE Master (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.master
+Bundle-Version: 0.25.3.qualifier
+Require-Bundle: org.eclipse.core.runtime
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: org.eclipse.osee.ote.master
+Service-Component: OSGI-INF/*.xml
+Bundle-Vendor: Eclipse Open System Engineering Environment
diff --git a/org.eclipse.osee.ote.master/OSGI-INF/ote.master.lookup.xml b/org.eclipse.osee.ote.master/OSGI-INF/ote.master.lookup.xml
new file mode 100644
index 000000000..bae9ea3cd
--- /dev/null
+++ b/org.eclipse.osee.ote.master/OSGI-INF/ote.master.lookup.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="start" deactivate="stop" name="org.eclipse.osee.ote.master.lookup">
+ <implementation class="org.eclipse.osee.ote.master.internal.OTELookupImpl"/>
+ <service>
+ <provide interface="org.eclipse.osee.ote.master.OTELookup"/>
+ </service>
+</scr:component>
diff --git a/org.eclipse.osee.ote.master/build.properties b/org.eclipse.osee.ote.master/build.properties
new file mode 100644
index 000000000..6210e849b
--- /dev/null
+++ b/org.eclipse.osee.ote.master/build.properties
@@ -0,0 +1,5 @@
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ OSGI-INF/
+source.. = src/
diff --git a/org.eclipse.osee.ote.master/pom.xml b/org.eclipse.osee.ote.master/pom.xml
new file mode 100644
index 000000000..b4c800d63
--- /dev/null
+++ b/org.eclipse.osee.ote.master/pom.xml
@@ -0,0 +1,35 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.osee</groupId>
+ <artifactId>org.eclipse.osee.ote.parent</artifactId>
+ <version>0.25.3-SNAPSHOT</version>
+ <relativePath>../org.eclipse.osee.ote.parent</relativePath>
+ </parent>
+
+ <artifactId>org.eclipse.osee.ote.master</artifactId>
+ <packaging>eclipse-plugin</packaging>
+ <name>OTE Master</name>
+
+ <build>
+ <!-- workaround for https://issues.sonatype.org/browse/TYCHO-168 -->
+ <resources>
+ <resource>
+ <directory>src</directory>
+ <excludes>
+ <exclude>**/*.java</exclude>
+ </excludes>
+ </resource>
+ </resources>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-source-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.master/src/org/eclipse/osee/ote/master/OTELookup.java b/org.eclipse.osee.ote.master/src/org/eclipse/osee/ote/master/OTELookup.java
new file mode 100644
index 000000000..16037c54b
--- /dev/null
+++ b/org.eclipse.osee.ote.master/src/org/eclipse/osee/ote/master/OTELookup.java
@@ -0,0 +1,14 @@
+package org.eclipse.osee.ote.master;
+
+import java.util.List;
+import java.util.UUID;
+
+public interface OTELookup {
+ List<OTELookupServerEntry> getAvailableServers();
+
+ void addServer(OTELookupServerEntry server);
+
+ void removeServer(OTELookupServerEntry server);
+
+ void removeServer(UUID fromString);
+}
diff --git a/org.eclipse.osee.ote.master/src/org/eclipse/osee/ote/master/OTELookupServerEntry.java b/org.eclipse.osee.ote.master/src/org/eclipse/osee/ote/master/OTELookupServerEntry.java
new file mode 100644
index 000000000..60e32ff81
--- /dev/null
+++ b/org.eclipse.osee.ote.master/src/org/eclipse/osee/ote/master/OTELookupServerEntry.java
@@ -0,0 +1,175 @@
+package org.eclipse.osee.ote.master;
+
+import java.net.URI;
+import java.util.Date;
+import java.util.UUID;
+
+public class OTELookupServerEntry {
+
+ private final UUID uuid;
+ private final OTEServerType type;
+ private final Date startTime;
+ private final String name;
+ private String station;
+ private String version;
+ private String comment;
+ private String owner;
+ private URI oteRestServer;
+ private URI oteActivemqServer;
+ private String connectedUsers;
+
+ private Date lastUpdate;
+
+ public OTELookupServerEntry(UUID uuid, URI oteActivemqServer, String name, OTEServerType type, Date startTime) {
+ this.name = name;
+ this.uuid = uuid;
+ this.startTime = startTime;
+ this.type = type;
+ this.oteActivemqServer = oteActivemqServer;
+ }
+
+ public UUID getUUID() {
+ return uuid;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public Date getStartTime() {
+ return startTime;
+ }
+
+ public OTEServerType getType() {
+ return type;
+ }
+
+ public URI getURI() {
+ return oteActivemqServer;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((name == null) ? 0 : name.hashCode());
+ result = prime * result + ((startTime == null) ? 0 : startTime.hashCode());
+ result = prime * result + ((type == null) ? 0 : type.hashCode());
+ result = prime * result + ((oteActivemqServer == null) ? 0 : oteActivemqServer.hashCode());
+ result = prime * result + ((uuid == null) ? 0 : uuid.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ OTELookupServerEntry other = (OTELookupServerEntry) obj;
+ if (name == null) {
+ if (other.name != null)
+ return false;
+ } else if (!name.equals(other.name))
+ return false;
+ if (startTime == null) {
+ if (other.startTime != null)
+ return false;
+ } else if (!startTime.equals(other.startTime))
+ return false;
+ if (type == null) {
+ if (other.type != null)
+ return false;
+ } else if (!type.getName().equals(other.type.getName()))
+ return false;
+ if (oteActivemqServer == null) {
+ if (other.oteActivemqServer != null)
+ return false;
+ } else if (!oteActivemqServer.equals(other.oteActivemqServer))
+ return false;
+ if (uuid == null) {
+ if (other.uuid != null)
+ return false;
+ } else if (!uuid.equals(other.uuid))
+ return false;
+ return true;
+ }
+
+ synchronized public void setUpdateTime(Date date) {
+ lastUpdate = date;
+ }
+
+ synchronized public Date getUpdateTime() {
+ return lastUpdate;
+ }
+
+ public String getStation() {
+ return station;
+ }
+
+ public void setStation(String station) {
+ this.station = station;
+ }
+
+ public String getVersion() {
+ return version;
+ }
+
+ public void setVersion(String version) {
+ this.version = version;
+ }
+
+ public String getComment() {
+ return comment;
+ }
+
+ public void setComment(String comment) {
+ this.comment = comment;
+ }
+
+ public String getOwner() {
+ return owner;
+ }
+
+ public void setOwner(String owner) {
+ this.owner = owner;
+ }
+
+ public URI getOteRestServer() {
+ return oteRestServer;
+ }
+
+ public void setOteRestServer(URI oteRestServer) {
+ this.oteRestServer = oteRestServer;
+ }
+
+ public URI getOteActivemqServer() {
+ return oteActivemqServer;
+ }
+
+ public void setOteActivemqServer(URI oteActivemqServer) {
+ this.oteActivemqServer = oteActivemqServer;
+ }
+
+ public String getConnectedUsers() {
+ return connectedUsers;
+ }
+
+ public void setConnectedUsers(String connectedUsers) {
+ this.connectedUsers = connectedUsers;
+ }
+
+ public Date getLastUpdate() {
+ return lastUpdate;
+ }
+
+ public void setLastUpdate(Date lastUpdate) {
+ this.lastUpdate = lastUpdate;
+ }
+
+ public UUID getUuid() {
+ return uuid;
+ }
+}
diff --git a/org.eclipse.osee.ote.master/src/org/eclipse/osee/ote/master/OTEServerType.java b/org.eclipse.osee.ote.master/src/org/eclipse/osee/ote/master/OTEServerType.java
new file mode 100644
index 000000000..dfcfb3389
--- /dev/null
+++ b/org.eclipse.osee.ote.master/src/org/eclipse/osee/ote/master/OTEServerType.java
@@ -0,0 +1,5 @@
+package org.eclipse.osee.ote.master;
+
+public interface OTEServerType {
+ String getName();
+}
diff --git a/org.eclipse.osee.ote.master/src/org/eclipse/osee/ote/master/internal/LookupTimeoutMonitor.java b/org.eclipse.osee.ote.master/src/org/eclipse/osee/ote/master/internal/LookupTimeoutMonitor.java
new file mode 100644
index 000000000..17e62f248
--- /dev/null
+++ b/org.eclipse.osee.ote.master/src/org/eclipse/osee/ote/master/internal/LookupTimeoutMonitor.java
@@ -0,0 +1,42 @@
+package org.eclipse.osee.ote.master.internal;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+import org.eclipse.osee.ote.master.OTELookup;
+import org.eclipse.osee.ote.master.OTELookupServerEntry;
+
+class LookupTimeoutMonitor implements Runnable {
+
+ private final OTELookup oteLookup;
+ private int timeoutSeconds;
+
+ public LookupTimeoutMonitor(OTELookup oteLookup, int timeoutSeconds) {
+ this.oteLookup = oteLookup;
+ this.timeoutSeconds = timeoutSeconds;
+ }
+
+ @Override
+ public void run() {
+ try{
+ List<OTELookupServerEntry> availableServers = oteLookup.getAvailableServers();
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(new Date());
+ cal.add(Calendar.SECOND, timeoutSeconds*-1);
+ List<OTELookupServerEntry> toRemove = new ArrayList<>();
+ for(OTELookupServerEntry entry: availableServers){
+ if(entry.getUpdateTime().before(cal.getTime())){
+ toRemove.add(entry);
+ }
+ }
+ for(OTELookupServerEntry entry: toRemove){
+ oteLookup.removeServer(entry);
+ }
+ } catch (Throwable th){
+ th.printStackTrace();
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.master/src/org/eclipse/osee/ote/master/internal/OTELookupImpl.java b/org.eclipse.osee.ote.master/src/org/eclipse/osee/ote/master/internal/OTELookupImpl.java
new file mode 100644
index 000000000..ac7709759
--- /dev/null
+++ b/org.eclipse.osee.ote.master/src/org/eclipse/osee/ote/master/internal/OTELookupImpl.java
@@ -0,0 +1,101 @@
+package org.eclipse.osee.ote.master.internal;
+
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.osee.ote.master.OTELookup;
+import org.eclipse.osee.ote.master.OTELookupServerEntry;
+
+public class OTELookupImpl implements OTELookup {
+
+ private final List<OTELookupServerEntry> servers;
+
+ private ScheduledExecutorService executor;
+ private ScheduledFuture<?> scheduleAtFixedRate;
+ private int timeoutSeconds = 60*3;
+
+ public OTELookupImpl() {
+ servers = new CopyOnWriteArrayList<>();
+ }
+
+ @Override
+ public List<OTELookupServerEntry> getAvailableServers() {
+ return servers;
+ }
+
+ @Override
+ public void addServer(OTELookupServerEntry server) {
+ OTELookupServerEntry oldone = find(server);
+ if (oldone == null) {
+ server.setUpdateTime(new Date());
+ servers.add(server);
+ } else {
+ oldone.setConnectedUsers(server.getConnectedUsers());
+ oldone.setUpdateTime(new Date());
+ }
+ }
+
+ @Override
+ public void removeServer(OTELookupServerEntry server) {
+ OTELookupServerEntry oldone = find(server);
+ if (oldone != null) {
+ servers.remove(oldone);
+ }
+ }
+
+ private OTELookupServerEntry find(OTELookupServerEntry otherEntry) {
+ for (OTELookupServerEntry entry : servers) {
+ if (entry.equals(otherEntry)) {
+ return entry;
+ }
+ }
+ return null;
+ }
+
+ private OTELookupServerEntry find(UUID otherEntry) {
+ for (OTELookupServerEntry entry : servers) {
+ if (entry.getUUID().equals(otherEntry)) {
+ return entry;
+ }
+ }
+ return null;
+ }
+
+ public void start(){
+ executor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
+ @Override
+ public Thread newThread(Runnable arg0) {
+ Thread th = new Thread(arg0);
+ th.setName("OTELookupServerUpdateMonitor");
+ th.setDaemon(true);
+ return th;
+ }
+ });
+ scheduleAtFixedRate = executor.scheduleAtFixedRate(new LookupTimeoutMonitor(this, timeoutSeconds), 0, 5, TimeUnit.SECONDS);
+ }
+
+ public void stop(){
+ scheduleAtFixedRate.cancel(true);
+ executor.shutdown();
+ }
+
+ void setTimeoutSeconds(int timeoutSeconds){
+ this.timeoutSeconds = timeoutSeconds;
+ }
+
+ @Override
+ public void removeServer(UUID serverid) {
+ OTELookupServerEntry oldone = find(serverid);
+ if (oldone != null) {
+ servers.remove(oldone);
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/.classpath b/org.eclipse.osee.ote.messaging.dds/.classpath
new file mode 100644
index 000000000..1fa3e6803
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.ote.messaging.dds/.pmd b/org.eclipse.osee.ote.messaging.dds/.pmd
new file mode 100644
index 000000000..c7b0a9fb3
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/.pmd
@@ -0,0 +1,925 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<pmd>
+ <useProjectRuleSet>false</useProjectRuleSet>
+ <ruleSetFile>.ruleset</ruleSetFile>
+ <rules>
+ <rule>
+ <name>LooseCoupling</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneMethodMustImplementCloneable</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedImports</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SignatureDeclareThrowsException</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IfStmtsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>WhileLoopsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IfElseStmtsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ForLoopsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseSingleton</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanReturns</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanExpressions</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SwitchStmtsShouldHaveDefault</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDeeplyNestedIfStmts</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidReassigningParameters</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SwitchDensity</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConstructorCallsOverridableMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AccessorClassGeneration</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalFieldCouldBeStatic</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloseResource</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonStaticInitializer</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DefaultLabelNotLastInSwitchStmt</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonCaseLabelInSwitchStatement</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>OptimizableToArrayCall</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BadComparison</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EqualsNull</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConfusingTernary</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InstantiationToGetClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IdempotentOperations</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimpleDateFormatNeedsLocale</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ImmutableField</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseLocaleWithCaseConversions</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidProtectedFieldInFinalClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AssignmentToNonFinalStatic</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingStaticMethodInNonInstantiatableClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidSynchronizedAtMethodLevel</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingBreakInSwitch</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseNotifyAllInsteadOfNotify</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidInstanceofChecksInCatchClause</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractClassWithoutAbstractMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyConditional</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CompareObjectsWithEquals</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PositionLiteralsFirstInComparisons</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryLocalBeforeReturn</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonThreadSafeSingleton</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UncommentedEmptyMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UncommentedEmptyConstructor</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidConstantsInterface</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnsynchronizedStaticDateFormatter</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PreserveStackTrace</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseCollectionIsEmpty</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassWithOnlyPrivateConstructorsShouldBeFinal</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyMethodInAbstractClassShouldBeAbstract</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SingularField</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReturnEmptyArrayRatherThanNull</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractClassWithoutAnyMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooFewBranchesForASwitchStatement</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCatchingThrowable</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SignatureDeclareThrowsException</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExceptionAsFlowControl</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCatchingNPE</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingRawExceptionTypes</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingNullPointerException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidRethrowingException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotExtendJavaLangError</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotThrowExceptionInFinally</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingNewInstanceOfSameException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedPrivateField</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedLocalVariable</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedPrivateMethod</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedFormalParameter</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MoreThanOneLogger</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LoggerIsNotStaticFinal</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SystemPrintln</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidPrintStackTrace</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDuplicateLiterals</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringInstantiation</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringToString</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InefficientStringBuffering</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryCaseChange</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseStringBufferLength</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AppendCharacterWithChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConsecutiveLiteralAppends</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseIndexOfChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InefficientEmptyStringCheck</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InsufficientStringBufferDeclaration</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessStringValueOf</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringBufferInstantiationWithChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseEqualsToCompareStrings</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidStringBufferField</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceVectorWithList</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceHashtableWithMap</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceEnumerationWithIterator</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidEnumAsIdentifier</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidAssertAsIdentifier</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IntegerInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ByteInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ShortInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LongInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseBeforeAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseAfterAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseTestAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4SuitesShouldUseSuiteAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitUseExpected</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseProperClassLoader</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MDBAndSessionBeanNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>RemoteSessionInterfaceNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LocalInterfaceSessionNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LocalHomeNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>RemoteInterfaceNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotCallSystemExit</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StaticEJBFieldShouldBeFinal</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotUseThreads</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidInstantiatingObjectsInLoops</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseArrayListInsteadOfVector</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyStartsWith</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseStringBufferForStringAppends</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseArraysAsList</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidArrayLoops</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryWrapperObjectCreation</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AddEmptyString</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyCatchBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyIfStmt</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyWhileStmt</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyTryBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyFinallyBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptySwitchStatements</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JumbledIncrementer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ForLoopShouldBeWhileLoop</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryConversionTemporary</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>OverrideBothEqualsAndHashcode</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoubleCheckedLocking</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReturnFromFinallyBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptySynchronizedBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryReturn</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyStaticInitializer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnconditionalIfStatement</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyStatementNotInLoop</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanInstantiation</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryFinalModifier</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CollapsibleIfStatements</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessOverridingMethod</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassCastExceptionWithToArray</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDecimalLiteralsInBigDecimalConstructor</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessOperationOnImmutable</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MisplacedNullCheck</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedNullCheckInEquals</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThreadGroup</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BrokenNullCheck</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BigIntegerInstantiation</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingOctalValues</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingHardCodedIP</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CheckResultSet</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidMultipleUnaryOperators</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyInitializer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodReturnsInternalArray</name>
+ <ruleset>Security Code Guidelines</ruleset>
+ </rule>
+ <rule>
+ <name>ArrayIsStoredDirectly</name>
+ <ruleset>Security Code Guidelines</ruleset>
+ </rule>
+ <rule>
+ <name>CouplingBetweenObjects</name>
+ <ruleset>Coupling Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveImports</name>
+ <ruleset>Coupling Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LooseCoupling</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DuplicateImports</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DontImportJavaLang</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedImports</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ImportFromSamePackage</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyStaticImports</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitStaticSuite</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitSpelling</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitAssertionsShouldIncludeMessage</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitTestsShouldIncludeAssert</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TestClassWithoutTestCases</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryBooleanAssertion</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertEqualsInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertSameInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertNullInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanAssertion</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NullAssignment</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedModifier</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AssignmentInOperand</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AtLeastOneConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DontImportSun</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousOctalEscape</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CallSuperInConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryParentheses</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DefaultPackage</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanInversion</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DataflowAnomalyAnalysis</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFinalLocalVariable</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingShortType</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingVolatile</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingNativeCode</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidAccessibilityAlteration</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotCallGarbageCollectionExplicitly</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodNamingConventions</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassNamingConventions</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractNaming</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDollarSigns</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodWithSameNameAsEnclosingClass</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousHashcodeMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousConstantFieldName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousEqualsMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFieldNameMatchingTypeName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFieldNameMatchingMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NoPackage</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PackageCase</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MisleadingVariableName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanGetMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NPathComplexity</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveMethodLength</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveParameterList</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveClassLength</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CyclomaticComplexity</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessivePublicCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyFields</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssMethodCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssTypeCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssConstructorCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyMethods</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyFinalizer</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeOnlyCallsSuperFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeOverloaded</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeDoesNotCallSuperFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeShouldBeProtected</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCallingFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseCorrectExceptionLogging</name>
+ <ruleset>Jakarta Commons Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ProperLogger</name>
+ <ruleset>Jakarta Commons Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingSerialVersionUID</name>
+ <ruleset>JavaBean Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ProperCloneImplementation</name>
+ <ruleset>Clone Implementation Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneThrowsCloneNotSupportedException</name>
+ <ruleset>Clone Implementation Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneMethodMustImplementCloneable</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ </rules>
+ <includeDerivedFiles>false</includeDerivedFiles>
+ <violationsAsErrors>true</violationsAsErrors>
+</pmd>
diff --git a/org.eclipse.osee.ote.messaging.dds/.project b/org.eclipse.osee.ote.messaging.dds/.project
new file mode 100644
index 000000000..f1f576b17
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ote.messaging.dds</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.messaging.dds/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.messaging.dds/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..c735fb4a5
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/META-INF/MANIFEST.MF
@@ -0,0 +1,18 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: DDS Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.messaging.dds;singleton:=true
+Bundle-Version: 0.25.3.qualifier
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Export-Package: org.eclipse.osee.ote.messaging.dds,
+ org.eclipse.osee.ote.messaging.dds.condition,
+ org.eclipse.osee.ote.messaging.dds.entity,
+ org.eclipse.osee.ote.messaging.dds.listener,
+ org.eclipse.osee.ote.messaging.dds.qos,
+ org.eclipse.osee.ote.messaging.dds.service,
+ org.eclipse.osee.ote.messaging.dds.status,
+ org.eclipse.osee.ote.messaging.dds.test,
+ org.eclipse.osee.ote.messaging.dds.test.data
+Require-Bundle: org.eclipse.osee.framework.jdk.core
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-ActivationPolicy: lazy
diff --git a/org.eclipse.osee.ote.messaging.dds/build.properties b/org.eclipse.osee.ote.messaging.dds/build.properties
new file mode 100644
index 000000000..34d2e4d2d
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .
diff --git a/org.eclipse.osee.ote.messaging.dds/pom.xml b/org.eclipse.osee.ote.messaging.dds/pom.xml
new file mode 100644
index 000000000..2cee6bd9f
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/pom.xml
@@ -0,0 +1,35 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.osee</groupId>
+ <artifactId>org.eclipse.osee.ote.parent</artifactId>
+ <version>0.25.3-SNAPSHOT</version>
+ <relativePath>../org.eclipse.osee.ote.parent</relativePath>
+ </parent>
+
+ <artifactId>org.eclipse.osee.ote.messaging.dds</artifactId>
+ <packaging>eclipse-plugin</packaging>
+ <name>OTE DDS (Incubation)</name>
+
+ <build>
+ <!-- workaround for https://issues.sonatype.org/browse/TYCHO-168 -->
+ <resources>
+ <resource>
+ <directory>src</directory>
+ <excludes>
+ <exclude>**/*.java</exclude>
+ </excludes>
+ </resource>
+ </resources>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-source-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/Data.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/Data.java
new file mode 100644
index 000000000..926b4dc69
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/Data.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds;
+
+import java.nio.ByteBuffer;
+
+/**
+ * Provides the DDS system with a generic means of handling any data type. Any messages that are sent through the system
+ * must implement this interface so that the DDS system has a means of handling them in a platform independent manner.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public interface Data {
+
+ /**
+ * This method is used to get a byte array representation of the data. This data should be in such a form that it can
+ * be passed to the <code>setFromByteArray</code> method to acquire the "same" object.
+ *
+ * @return A byte array version of the state information for this <code>Data</code>
+ */
+ public byte[] toByteArray();
+
+ public ByteBuffer toByteBuffer();
+
+ /**
+ * This method is used to restore a data item's state from a byte array. This method should work in such a manner
+ * that the array received from a <code>Data</code>'s <code>toByteArray</code> method can be passed to this method to
+ * construct an object that is the "same".
+ *
+ * @param input The byte array to build the state information from.
+ */
+ public void setFromByteArray(byte[] input);
+
+ public void setFromByteBuffer(ByteBuffer buffer);
+
+ public void copyFrom(Data buffer);
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public Object getKeyValue();
+
+ public int getOffset();
+
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/DataSample.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/DataSample.java
new file mode 100644
index 000000000..a80995e27
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/DataSample.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds;
+
+import java.lang.ref.WeakReference;
+import org.eclipse.osee.ote.messaging.dds.entity.SampleInfo;
+
+/**
+ * Provides a coupling mechanism for <code>SampleInfo</code> with <code>Data</code> instances.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class DataSample {
+ private final WeakReference<Data> data;
+ private final SampleInfo sampleInfo;
+
+ /**
+ * Create a data sample that is used for propogating data through the system.
+ */
+ public DataSample(Data data, SampleInfo sampleInfo) {
+ this.data = new WeakReference<>(data);
+ this.sampleInfo = sampleInfo;
+ }
+
+ /**
+ * Create a data sample that can be used for receiving propogated data.
+ */
+ public DataSample(Data data) {
+ super();
+ this.data = new WeakReference<>(data);
+ this.sampleInfo = new SampleInfo();
+ }
+
+ /**
+ * @return Returns the data.
+ */
+ public Data getData() {
+ return data.get();
+ }
+
+ /**
+ * @return Returns the sampleInfo.
+ */
+ public SampleInfo getSampleInfo() {
+ return sampleInfo;
+ }
+
+ /**
+ * @param sourceSampleInfo The sampleInfo to set.
+ */
+ public void setSampleInfo(SampleInfo sourceSampleInfo) {
+ sampleInfo.copyFrom(sourceSampleInfo);
+ }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/DataStoreItem.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/DataStoreItem.java
new file mode 100644
index 000000000..aecdcc49b
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/DataStoreItem.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds;
+
+import org.eclipse.osee.ote.messaging.dds.entity.DataWriter;
+import org.eclipse.osee.ote.messaging.dds.service.TopicDescription;
+
+/**
+ * Provides a coupling of items used for propogating the publication of data.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class DataStoreItem {
+ private final DataSample theDataSample;
+ private final TopicDescription theTopicDescription;
+ private final DataWriter theWriter;
+
+ /**
+ * Create a new <code>DataStoreItem</code> that stores references to all of the necessary information for the system
+ * to propogate the data.
+ */
+ public DataStoreItem(DataSample theData, TopicDescription theTopicDescription, DataWriter theWriter) {
+ super();
+ this.theDataSample = theData;
+ this.theTopicDescription = theTopicDescription;
+ this.theWriter = theWriter;
+ }
+
+ /**
+ * @return Returns the theData.
+ */
+ public DataSample getTheDataSample() {
+ return theDataSample;
+ }
+
+ /**
+ * @return Returns the theTopic.
+ */
+ public TopicDescription getTheTopicDescription() {
+ return theTopicDescription;
+ }
+
+ /**
+ * @return Returns the theWriter.
+ */
+ public DataWriter getTheWriter() {
+ return theWriter;
+ }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/Duration.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/Duration.java
new file mode 100644
index 000000000..9475ac916
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/Duration.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds;
+
+/**
+ * <code>Duration</code> is used to specify a difference in time with nano-second resolution.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class Duration extends Time {
+ public final static Duration ZERO_DURATION = new Duration(0, 0);
+ private Time startTime;
+
+ /**
+ * Construct a new <code>Duration</code> with specific values.
+ *
+ * @param seconds - The number of seconds for the duration.
+ * @param nanoSeconds - The number of nano-seconds for the duration.
+ */
+ public Duration(long seconds, long nanoSeconds) {
+ super(seconds, nanoSeconds);
+ }
+
+ /**
+ * Mark an instant in time as a "start" point. This is used in conjunction with the <code>expired()</code> method.
+ */
+ public void markStart() {
+ startTime = new Time();
+ }
+
+ /**
+ * Check if the time specified by this <code>Duration</code> is less than the amount of time since
+ * <code>markStart()</code> was called.
+ *
+ * @return <b>true</b> iff the time since <code>markStart()</code> is greater than this duration.
+ */
+ public boolean expired() {
+ return new Time().millisSince(startTime) > this.getMilliseconds();
+ }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/IDestination.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/IDestination.java
new file mode 100644
index 000000000..06e53ca11
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/IDestination.java
@@ -0,0 +1,18 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IDestination {
+
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/IOteData.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/IOteData.java
new file mode 100644
index 000000000..8ae62937c
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/IOteData.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds;
+
+import java.nio.ByteBuffer;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface IOteData extends Data {
+ /**
+ * signals the end of processing for this data instance. This will return it to the data cache so that it can be
+ * reused
+ */
+ void finish();
+
+ /**
+ * gets the data buffer associated with this instance.
+ */
+ ByteBuffer getDataBuffer();
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/ISource.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/ISource.java
new file mode 100644
index 000000000..e05c6c091
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/ISource.java
@@ -0,0 +1,18 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public interface ISource {
+
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/InstanceHandle.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/InstanceHandle.java
new file mode 100644
index 000000000..5411e6761
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/InstanceHandle.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds;
+
+/**
+ * This class is here for future functionality that is described in the DDS specification but has not been implemented
+ * or used.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class InstanceHandle {
+ // DONT_NEED this class with the current implemention level of the system
+ public void copyFrom(InstanceHandle instanceHandle) {
+ }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/InstanceStateKind.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/InstanceStateKind.java
new file mode 100644
index 000000000..67a369346
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/InstanceStateKind.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds;
+
+/**
+ * The class which stores all of the available states which an instance can be in. The name of any of the values can be
+ * acquired from the <code>getKindName()</code> method inherited from <code>Kind</code>.
+ *
+ * @see org.eclipse.osee.ote.messaging.dds.Kind
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class InstanceStateKind extends Kind {
+
+ public final static InstanceStateKind ALIVE = new InstanceStateKind("Alive instance state", 1);
+ public final static InstanceStateKind NOT_ALIVE_DISPOSED = new InstanceStateKind(
+ "Not alive disposed instance state", 2);
+ public final static InstanceStateKind NOT_ALIVE_NO_WRITERS = new InstanceStateKind(
+ "Not alive no writers instance state", 3);
+
+ /**
+ * Local constructor for creating <code>InstanceStateKind</code> objects.
+ *
+ * @param kindName The name of the kind
+ * @param kindId The id value of the kind
+ */
+ private InstanceStateKind(String kindName, long kindId) {
+ super(kindName, kindId);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/Kind.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/Kind.java
new file mode 100644
index 000000000..92a067178
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/Kind.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds;
+
+/**
+ * Base class for the various *Kind enumerations specified in the DDS specification. This provides the basic structure
+ * and accessor methods that are common for these enumerations.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public abstract class Kind {
+ private final String kindName;
+ private final long kindId;
+
+ protected Kind(String kindName, long kindId) {
+ super();
+ this.kindName = kindName;
+ this.kindId = kindId;
+ }
+
+ public String getKindName() {
+ return kindName;
+ }
+
+ public long getKindId() {
+ return kindId;
+ }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/NotImplementedException.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/NotImplementedException.java
new file mode 100644
index 000000000..fc0726b60
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/NotImplementedException.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds;
+
+/**
+ * This class is used to mark areas of code that are in the DDS Specification but are not currently implemented.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class NotImplementedException extends RuntimeException {
+
+ private static final long serialVersionUID = 8437766402272756599L;
+
+ /**
+ * Creates a new exception with a message specifying that the given functionality is not implemented.
+ */
+ public NotImplementedException() {
+ super("This functionality has not been implemented");
+ }
+
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/ReturnCode.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/ReturnCode.java
new file mode 100644
index 000000000..00ab888f3
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/ReturnCode.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds;
+
+/**
+ * Provides function status for many of the DDS specification routines. These are used to communicate the result of
+ * function calls, and the usage of them is specified in the DDS specification.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class ReturnCode {
+ public static final ReturnCode OK = new ReturnCode(1, "Successful return");
+ public static final ReturnCode ERROR = new ReturnCode(2, "Generic unspecified error");
+ public static final ReturnCode BAD_PARAMETER = new ReturnCode(3, "Illegal parameter value");
+ public static final ReturnCode UNSUPPORTED = new ReturnCode(4, "Unsupported operation");
+ public static final ReturnCode ALREADY_DELETED = new ReturnCode(5,
+ "The object target of this operation has already been deleted");
+ public static final ReturnCode OUT_OF_RESOURCES = new ReturnCode(6,
+ "Service ran out of resources needed to complete the operation");
+ public static final ReturnCode NOT_ENABLED = new ReturnCode(7, "Operation invoked on an entity not yet enabled");
+ public static final ReturnCode IMMUTABLE_POLICY = new ReturnCode(8,
+ "Application attempted to modify an immutable QoS policy");
+ public static final ReturnCode INCONSISTENT_POLICY = new ReturnCode(9,
+ "Application specified a set of polices that are not consistent with each other");
+ public static final ReturnCode PRECONDITION_NOT_MET = new ReturnCode(10,
+ "A pre-condition for the operation was not met");
+ public static final ReturnCode TIMEOUT = new ReturnCode(11, "The operation timed out");
+ public static final ReturnCode NO_DATA = new ReturnCode(12,
+ "Indicates a transient situation where the operation did not return any data but there is no inherent error");
+
+ private final int value;
+ private final String description;
+
+ /**
+ * Creates a new <code>ReturnCode</code> with a given value and description.
+ */
+ private ReturnCode(int value, String description) {
+ super();
+ this.value = value;
+ this.description = description;
+ }
+
+ /**
+ * @return Returns the description.
+ */
+ public String getDescription() {
+ return description;
+ }
+
+ /**
+ * @return Returns the value.
+ */
+ public int getValue() {
+ return value;
+ }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/SampleStateKind.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/SampleStateKind.java
new file mode 100644
index 000000000..f95a73baf
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/SampleStateKind.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds;
+
+/**
+ * The class which stores all of the available read states for a sample. The name of any of the values can be acquired
+ * from the <code>getKindName()</code> method inherited from <code>Kind</code>.
+ *
+ * @see org.eclipse.osee.ote.messaging.dds.Kind
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class SampleStateKind extends Kind {
+
+ public final static SampleStateKind READ = new SampleStateKind("Read sample state", 1);
+ public final static SampleStateKind NOT_READ = new SampleStateKind("Not read sample state", 2);
+
+ /**
+ * Local constructor for creating <code>SampleStateKind</code> objects.
+ *
+ * @param kindName The name of the kind
+ * @param kindId The id value of the kind
+ */
+ private SampleStateKind(String kindName, long kindId) {
+ super(kindName, kindId);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/StatusKind.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/StatusKind.java
new file mode 100644
index 000000000..77cb886b8
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/StatusKind.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds;
+
+/**
+ * The class which stores all of the available kinds of status. The name of any of the values can be acquired from the
+ * <code>getKindName()</code> method inherited from <code>Kind</code>.
+ *
+ * @see org.eclipse.osee.ote.messaging.dds.Kind
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class StatusKind extends Kind {
+ public final static StatusKind INCONSISTENT_TOPIC_STATUS = new StatusKind("INCONSISTENT_TOPIC_STATUS", 0x0001 << 0);
+ public final static StatusKind OFFERED_DEADLINE_MISSED_STATUS = new StatusKind("OFFERED_DEADLINE_MISSED_STATUS",
+ 0x0001 << 1);
+ public final static StatusKind REQUESTED_DEADLINE_MISSED_STATUS = new StatusKind("REQUESTED_DEADLINE_MISSED_STATUS",
+ 0x0001 << 2);
+ public final static StatusKind OFFERED_INCOMPATIBLE_QOS_STATUS = new StatusKind("OFFERED_INCOMPATIBLE_QOS_STATUS",
+ 0x0001 << 5);
+ public final static StatusKind REQUESTED_INCOMPATIBLE_QOS_STATUS = new StatusKind(
+ "REQUESTED_INCOMPATIBLE_QOS_STATUS", 0x0001 << 6);
+ public final static StatusKind SAMPLE_LOST_STATUS = new StatusKind("SAMPLE_LOST_STATUS", 0x0001 << 7);
+ public final static StatusKind SAMPLE_REJECTED_STATUS = new StatusKind("SAMPLE_REJECTED_STATUS", 0x0001 << 8);
+ public final static StatusKind DATA_ON_READERS_STATUS = new StatusKind("DATA_ON_READERS_STATUS", 0x0001 << 9);
+ public final static StatusKind DATA_AVAILABLE_STATUS = new StatusKind("DATA_AVAILABLE_STATUS", 0x0001 << 10);
+ public final static StatusKind LIVELINESS_LOST_STATUS = new StatusKind("LIVELINESS_LOST_STATUS", 0x0001 << 11);
+ public final static StatusKind LIVELINESS_CHANGED_STATUS = new StatusKind("LIVELINESS_CHANGED_STATUS", 0x0001 << 12);
+ public final static StatusKind PUBLICATION_MATCH_STATUS = new StatusKind("PUBLICATION_MATCH_STATUS", 0x0001 << 13);
+ public final static StatusKind SUBSCRIPTION_MATCH_STATUS = new StatusKind("SUBSCRIPTION_MATCH_STATUS", 0x0001 << 14);
+
+ /**
+ * Local constructor for creating <code>StatusKind</code> objects.
+ *
+ * @param kindName The name of the kind
+ * @param kindId The id value of the kind
+ */
+ private StatusKind(String kindName, long kindId) {
+ super(kindName, kindId);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/Time.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/Time.java
new file mode 100644
index 000000000..2d37714ef
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/Time.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds;
+
+/**
+ * Provides a time class for marking time with nano-second resolution. This class is not fully implemented yet to
+ * provide proper nano-second data, as it is not being used yet.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class Time {
+ protected long seconds;
+ protected long nanoSeconds;
+
+ /**
+ * Creates a <code>Time</code> object with the current time accurate to the second.
+ */
+ public Time() {
+ seconds = System.currentTimeMillis() / 1000;
+ nanoSeconds = 0;
+ }
+
+ public Time(long seconds, long nanoSeconds) {
+ super();
+ this.seconds = seconds;
+ this.nanoSeconds = nanoSeconds;
+ }
+
+ public void copyFrom(Time sourceTime) {
+ this.seconds = sourceTime.seconds;
+ this.nanoSeconds = sourceTime.nanoSeconds;
+ }
+
+ /**
+ * @return Returns the nanoSeconds.
+ */
+ public long getNanoSeconds() {
+ return nanoSeconds;
+ }
+
+ /**
+ * @return Returns the seconds.
+ */
+ public long getSeconds() {
+ return seconds;
+ }
+
+ public long getMilliseconds() {
+ return seconds * 1000 + nanoSeconds / 1000;
+ }
+
+ protected long millisSince(Time time) {
+ return this.getMilliseconds() - time.getMilliseconds();
+ }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/ViewStateKind.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/ViewStateKind.java
new file mode 100644
index 000000000..df9697cd7
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/ViewStateKind.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds;
+
+/**
+ * The class which stores all of the available view states for a sample. The name of any of the values can be acquired
+ * from the <code>getKindName()</code> method inherited from <code>Kind</code>.
+ *
+ * @see org.eclipse.osee.ote.messaging.dds.Kind
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class ViewStateKind extends Kind {
+
+ public final static ViewStateKind NEW = new ViewStateKind("New view state", 1);
+ public final static ViewStateKind NOT_NEW = new ViewStateKind("Not new view state", 2);
+
+ /**
+ * Local constructor for creating <code>ViewStateKind</code> objects.
+ *
+ * @param kindName The name of the kind
+ * @param kindId The id value of the kind
+ */
+ private ViewStateKind(String kindName, long kindId) {
+ super(kindName, kindId);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/Condition.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/Condition.java
new file mode 100644
index 000000000..6c3259582
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/Condition.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.condition;
+
+import org.eclipse.osee.ote.messaging.dds.NotImplementedException;
+
+/**
+ * This class is here for future functionality that is described in the DDS specification but has not been implemented
+ * or used.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class Condition {
+ protected boolean trigger;
+
+ public Condition() {
+ this.trigger = false;
+
+ // This class, and the use of it has not been implemented
+ throw new NotImplementedException();
+ }
+
+ public boolean getTrigger() {
+ return trigger;
+ }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/GuardCondition.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/GuardCondition.java
new file mode 100644
index 000000000..1237d73af
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/GuardCondition.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.condition;
+
+import org.eclipse.osee.ote.messaging.dds.NotImplementedException;
+
+/**
+ * This class is here for future functionality that is described in the DDS specification but has not been implemented
+ * or used.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class GuardCondition extends Condition {
+
+ public GuardCondition() {
+
+ // This class, and the use of it has not been implemented
+ throw new NotImplementedException();
+ }
+
+ public void setTrigger(boolean trigger) {
+ this.trigger = trigger;
+ }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/QueryCondition.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/QueryCondition.java
new file mode 100644
index 000000000..b8211ab73
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/QueryCondition.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.condition;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import org.eclipse.osee.ote.messaging.dds.NotImplementedException;
+import org.eclipse.osee.ote.messaging.dds.ReturnCode;
+
+/**
+ * This class is here for future functionality that is described in the DDS specification but has not been implemented
+ * or used.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class QueryCondition {
+ private final String queryExpression;
+ private Collection<String> queryArguments;
+
+ public QueryCondition(String queryExpression, Collection<String> queryArguments) {
+ super();
+ this.queryExpression = queryExpression;
+ this.queryArguments = Collections.synchronizedList(new ArrayList<String>(queryArguments));
+
+ // This class, and the use of it has not been implemented
+ throw new NotImplementedException();
+ }
+
+ /**
+ * @return Returns the queryArguments.
+ */
+ public Collection<String> getQueryArguments() {
+ return queryArguments;
+ }
+
+ /**
+ * @param queryArguments The queryArguments to set.
+ */
+ public ReturnCode setQueryArguments(Collection<String> queryArguments) {
+ this.queryArguments = Collections.synchronizedList(new ArrayList<String>(queryArguments));
+ return ReturnCode.OK;
+ }
+
+ /**
+ * @return Returns the queryExpression.
+ */
+ public String getQueryExpression() {
+ return queryExpression;
+ }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/ReadCondition.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/ReadCondition.java
new file mode 100644
index 000000000..5ca0d60e4
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/ReadCondition.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.condition;
+
+import java.util.Collection;
+import org.eclipse.osee.ote.messaging.dds.NotImplementedException;
+import org.eclipse.osee.ote.messaging.dds.entity.DataReader;
+
+/**
+ * This class is here for future functionality that is described in the DDS specification but has not been implemented
+ * or used.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class ReadCondition {
+ private final DataReader dataReader;
+ private final Collection<?> sampleStateKinds;
+ private final Collection<?> viewStateKinds;
+ private final Collection<?> instanceStateKinds;
+
+ public ReadCondition(DataReader dataReader, Collection<?> sampleStateKinds, Collection<?> viewStateKinds, Collection<?> instanceStateKinds) {
+ super();
+ this.dataReader = dataReader;
+ this.sampleStateKinds = sampleStateKinds;
+ this.viewStateKinds = viewStateKinds;
+ this.instanceStateKinds = instanceStateKinds;
+
+ // This class, and the use of it has not been implemented
+ throw new NotImplementedException();
+ }
+
+ /**
+ * @return Returns the dataReader.
+ */
+ public DataReader getDataReader() {
+ return dataReader;
+ }
+
+ /**
+ * @return Returns the instanceStateKinds.
+ */
+ public Collection<?> getInstanceStateKinds() {
+ return instanceStateKinds;
+ }
+
+ /**
+ * @return Returns the sampleStateKinds.
+ */
+ public Collection<?> getSampleStateKinds() {
+ return sampleStateKinds;
+ }
+
+ /**
+ * @return Returns the viewStateKinds.
+ */
+ public Collection<?> getViewStateKinds() {
+ return viewStateKinds;
+ }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/StatusCondition.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/StatusCondition.java
new file mode 100644
index 000000000..26130052d
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/StatusCondition.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.condition;
+
+import java.util.Collection;
+import org.eclipse.osee.ote.messaging.dds.NotImplementedException;
+import org.eclipse.osee.ote.messaging.dds.ReturnCode;
+import org.eclipse.osee.ote.messaging.dds.entity.Entity;
+
+/**
+ * This class is here for future functionality that is described in the DDS specification but has not been implemented
+ * or used.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class StatusCondition extends Condition {
+
+ private final Collection<?> enabledStatuses;
+ private final Entity parentEntity;
+
+ public StatusCondition(Entity parentEntity) {
+
+ this.parentEntity = parentEntity;
+ enabledStatuses = null; // UNSURE find out if this should be something else?
+
+ // This class, and the use of it has not been implemented
+ throw new NotImplementedException();
+ }
+
+ public ReturnCode setEnabledStatuses(Collection<?> mask) {
+ return ReturnCode.ERROR;
+ }
+
+ public Collection<?> getEnabledStatuses() {
+ return enabledStatuses;
+ }
+
+ /**
+ * @return Returns the entity.
+ */
+ public Entity getParentEntity() {
+ return parentEntity;
+ }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/WaitSet.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/WaitSet.java
new file mode 100644
index 000000000..384e8d47c
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/WaitSet.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.condition;
+
+import java.util.Collection;
+import java.util.concurrent.locks.Condition;
+import org.eclipse.osee.ote.messaging.dds.Duration;
+import org.eclipse.osee.ote.messaging.dds.NotImplementedException;
+import org.eclipse.osee.ote.messaging.dds.ReturnCode;
+
+/**
+ * This class is here for future functionality that is described in the DDS specification but has not been implemented
+ * or used.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class WaitSet {
+ public WaitSet() {
+
+ // This class, and the use of it has not been implemented
+ throw new NotImplementedException();
+ }
+
+ /**
+ * Not Implemented. Attach a condition to this <code>WaitSet</code>.
+ *
+ * @param condition The condition to attach
+ * @return ERROR - This method is not implemented
+ */
+ public ReturnCode attachCondition(Condition condition) {
+ // UNSURE This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+ return ReturnCode.ERROR;
+
+ }
+
+ /**
+ * Not Implemented. Detach a condition from this <code>WaitSet</code>.
+ *
+ * @param condition The condition to detach
+ * @return ERROR - This method is not implemented
+ */
+ public ReturnCode detachCondition(Condition condition) {
+ // UNSURE This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+ return ReturnCode.ERROR;
+
+ }
+
+ /**
+ * Not Implemented. Block execution until a <code>Condition</code> in this <code>WaitSet</code> is triggered. The
+ * provided collection will be used to return a list of the triggered conditions when then call unblocks. The timeout
+ * parameter is used to specify a maximum amount of time that should be consumed by this call, allowing the block to
+ * release with out any of the conditions being met.
+ *
+ * @param conditions A collection to place the triggered conditions in.
+ * @param timeout A max amount of time to wait on this <code>WaitSet</code>
+ * @return ERROR - This method is not implemented
+ */
+ public ReturnCode wait(Collection<?> conditions, Duration timeout) {
+ // UNSURE This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+ return ReturnCode.ERROR;
+
+ }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/package.html b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/package.html
new file mode 100644
index 000000000..826f4e0ac
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/condition/package.html
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+</head>
+<body bgcolor="white">
+
+
+Provides classes that support waiting on conditions generated within the DDS system.
+
+<!-- Put @see and @since tags down here. -->
+
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DataReader.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DataReader.java
new file mode 100644
index 000000000..e81cd8558
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DataReader.java
@@ -0,0 +1,625 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.entity;
+
+import java.nio.ByteBuffer;
+import java.util.Collection;
+
+import org.eclipse.osee.ote.messaging.dds.Data;
+import org.eclipse.osee.ote.messaging.dds.DataSample;
+import org.eclipse.osee.ote.messaging.dds.DataStoreItem;
+import org.eclipse.osee.ote.messaging.dds.Duration;
+import org.eclipse.osee.ote.messaging.dds.InstanceHandle;
+import org.eclipse.osee.ote.messaging.dds.NotImplementedException;
+import org.eclipse.osee.ote.messaging.dds.ReturnCode;
+import org.eclipse.osee.ote.messaging.dds.SampleStateKind;
+import org.eclipse.osee.ote.messaging.dds.StatusKind;
+import org.eclipse.osee.ote.messaging.dds.ViewStateKind;
+import org.eclipse.osee.ote.messaging.dds.condition.QueryCondition;
+import org.eclipse.osee.ote.messaging.dds.condition.ReadCondition;
+import org.eclipse.osee.ote.messaging.dds.listener.DataReaderListener;
+import org.eclipse.osee.ote.messaging.dds.listener.TopicListener;
+import org.eclipse.osee.ote.messaging.dds.service.TopicDescription;
+import org.eclipse.osee.ote.messaging.dds.status.LivelinessChangedStatus;
+import org.eclipse.osee.ote.messaging.dds.status.RequestedDeadlineMissedStatus;
+import org.eclipse.osee.ote.messaging.dds.status.RequestedIncompatibleQosStatus;
+import org.eclipse.osee.ote.messaging.dds.status.SampleRejectedStatus;
+import org.eclipse.osee.ote.messaging.dds.status.SubscriptionMatchStatus;
+
+/**
+ * The base class which all application specific data readers must extend. Access to read information in the DDS system
+ * is all made possible by this class. This class is partially implemented.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class DataReader extends DomainEntity {
+ private TopicDescription topicDescription;
+ private Subscriber subscriber;
+ private ByteBuffer dataBuffer;
+ private boolean deleted;
+ private DataStoreItem item;
+
+ /**
+ * Creates a reader with all of the necessary information. This constructor is only visible to the DDS system,
+ * applications should use {@link DomainParticipant#createTopic(String, String, TopicListener)} to create a Topic.
+ */
+ public DataReader(TopicDescription topicDescription, Subscriber subscriber, Boolean enabled, DataReaderListener listener, EntityFactory parentFactory) {
+ super(enabled.booleanValue(), listener, parentFactory);
+ this.topicDescription = topicDescription;
+ this.subscriber = subscriber;
+ this.dataBuffer = ByteBuffer.wrap(new byte[0]);
+ this.deleted = false;
+ }
+
+ /**
+ * Provides access to the deletion flag for this <code>DataReader</code>.
+ *
+ * @return <b>true</b> iff this has been marked as deleted.
+ */
+ boolean isDeleted() { // package scope since this is system-level code
+ return deleted;
+ }
+
+ /**
+ * Set this item as deleted. This should only be called on the item by the factory which created this reader, and
+ * when the <code>deleteReader()</code> method is called.
+ */
+ void markAsDeleted() { // package scope so that factories of this item can mark it as deleted
+ deleted = true;
+ }
+
+ /**
+ * Retrieve access to the listener assigned to this <code>DataReader</code>. The reader is not guaranteed to have a
+ * listener, so this method may return <b>null</b>, and the user of this method should handle that appropriately.
+ */
+ public DataReaderListener getListener() {
+ return (DataReaderListener) super.getBaseListener();
+ }
+
+ /**
+ * Set the listener for this <code>DataReader</code>. If another listener was already assigned then it will be
+ * overridden with out any error. Additionally, <b>null</b> may be passed as the listener to remove the current
+ * listener from this reader.
+ *
+ * @param listener - The listener to invoke when events occur.
+ * @param mask - Not implemented, <b>null</b> is acceptable.
+ * @return {@link ReturnCode#OK}
+ */
+ public ReturnCode setListener(DataReaderListener listener, StatusKind mask) {
+ return super.setBaseListener(listener, mask);
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public ReturnCode read(Collection<?> dataSamples, long maxSamples, Collection<?> sampleStates, Collection<?> viewStates, Collection<?> instanceStates) {
+
+ // UNSURE This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ // Check that the Entity is enabled before proceeding (See description of enable on the Entity
+ // object in the DDS spec)
+ if (!isEnabled()) {
+ return ReturnCode.NOT_ENABLED;
+ }
+
+ return ReturnCode.ERROR;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public ReturnCode take(Collection<?> dataSamples, long maxSamples, Collection<?> sampleStates, Collection<?> viewStates, Collection<?> instanceStates) {
+
+ // UNSURE This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ // Check that the Entity is enabled before proceeding (See description of enable on the Entity
+ // object in the DDS spec)
+ if (!isEnabled()) {
+ return ReturnCode.NOT_ENABLED;
+ }
+
+ return ReturnCode.ERROR;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public ReturnCode readWithCondition(Collection<?> dataSamples, long maxSamples, ReadCondition readCondition) {
+
+ // UNSURE This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ // Check that the Entity is enabled before proceeding (See description of enable on the Entity
+ // object in the DDS spec)
+ if (!isEnabled()) {
+ return ReturnCode.NOT_ENABLED;
+ }
+
+ return ReturnCode.ERROR;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public ReturnCode takeWithCondition(Collection<?> dataSamples, long maxSamples, ReadCondition readCondition) {
+
+ // UNSURE This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ // Check that the Entity is enabled before proceeding (See description of enable on the Entity
+ // object in the DDS spec)
+ if (!isEnabled()) {
+ return ReturnCode.NOT_ENABLED;
+ }
+
+ return ReturnCode.ERROR;
+ }
+
+ /**
+ * Method for reading or taking the next available <code>DataSample</code> for this reader.
+ *
+ * @param dataSample - A <code>DataSample</code> which the information will be placed in.
+ * @param isTake - a <code>boolean</code> stating whether the data should be taken by this call. <li>
+ * {@link ReturnCode#NOT_ENABLED} if this reader is not enabled. <li>{@link ReturnCode#NO_DATA} if no data is
+ * available to read or take. <li>{@link ReturnCode#OK} otherwise. </ul>
+ */
+ private ReturnCode readOrTakeNextSample(DataSample dataSample, boolean isTake) {
+
+ // Check that the Entity is enabled before proceeding (See description of enable on the Entity
+ // object in the DDS spec)
+ if (!isEnabled()) {
+ return ReturnCode.NOT_ENABLED;
+ }
+
+ DataSample retDataSample = item.getTheDataSample();
+
+ if (retDataSample == null) {
+ return ReturnCode.NO_DATA;
+ }
+
+ // Copy our information in to the supplied buffers
+ //dataSample.getData().setFromByteArray(retDataSample.getData().toByteArray());
+ dataSample.getData().copyFrom(retDataSample.getData());
+ dataSample.setSampleInfo(retDataSample.getSampleInfo());
+
+ // update the local references sample info accordingly
+ dataSample.getSampleInfo().setSampleStateKind(SampleStateKind.READ);
+ dataSample.getSampleInfo().setViewStateKind(ViewStateKind.NOT_NEW);
+ if (isTake) {
+ item = null;
+ }
+ return ReturnCode.OK;
+
+ }
+
+ /**
+ * Method for reading the next available <code>DataSample</code> for this reader.
+ *
+ * @param dataSample - A <code>DataSample</code> which the information will be placed in. <li>
+ * {@link ReturnCode#NOT_ENABLED} if this reader is not enabled. <li>{@link ReturnCode#NO_DATA} if no data is
+ * available to read or take. <li>{@link ReturnCode#OK} otherwise. </ul>
+ */
+ public ReturnCode readNextSample(DataSample dataSample) {
+ return readOrTakeNextSample(dataSample, false);
+ }
+
+ /**
+ * Method for taking the next available <code>DataSample</code> for this reader.
+ *
+ * @param dataSample - A <code>DataSample</code> which the information will be placed in. <li>
+ * {@link ReturnCode#NOT_ENABLED} if this reader is not enabled. <li>{@link ReturnCode#NO_DATA} if no data is
+ * available to read or take. <li>{@link ReturnCode#OK} otherwise. </ul>
+ */
+ public ReturnCode takeNextSample(DataSample dataSample) {
+ return readOrTakeNextSample(dataSample, true);
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public ReturnCode readInstance(Collection<?> dataSamples, long maxSamples, InstanceHandle instanceHandle, Collection<?> sampleStates, Collection<?> viewStates, Collection<?> instanceStates) {
+
+ // UNSURE This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ // Check that the Entity is enabled before proceeding (See description of enable on the Entity
+ // object in the DDS spec)
+ if (!isEnabled()) {
+ return ReturnCode.NOT_ENABLED;
+ }
+
+ return ReturnCode.ERROR;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public ReturnCode takeInstance(Collection<?> dataSamples, long maxSamples, InstanceHandle instanceHandle, Collection<?> sampleStates, Collection<?> viewStates, Collection<?> instanceStates) {
+
+ // UNSURE This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ // Check that the Entity is enabled before proceeding (See description of enable on the Entity
+ // object in the DDS spec)
+ if (!isEnabled()) {
+ return ReturnCode.NOT_ENABLED;
+ }
+
+ return ReturnCode.ERROR;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public ReturnCode readNextInstance(Collection<?> dataSamples, long maxSamples, InstanceHandle instanceHandle, Collection<?> sampleStates, Collection<?> viewStates, Collection<?> instanceStates) {
+
+ // UNSURE This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ // Check that the Entity is enabled before proceeding (See description of enable on the Entity
+ // object in the DDS spec)
+ if (!isEnabled()) {
+ return ReturnCode.NOT_ENABLED;
+ }
+
+ return ReturnCode.ERROR;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public ReturnCode takeNextInstance(Collection<?> dataSamples, long maxSamples, InstanceHandle instanceHandle, Collection<?> sampleStates, Collection<?> viewStates, Collection<?> instanceStates) {
+
+ // UNSURE This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ // Check that the Entity is enabled before proceeding (See description of enable on the Entity
+ // object in the DDS spec)
+ if (!isEnabled()) {
+ return ReturnCode.NOT_ENABLED;
+ }
+
+ return ReturnCode.ERROR;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public ReturnCode readNextInstance(Collection<?> dataSamples, long maxSamples, InstanceHandle instanceHandle, ReadCondition readCondition) {
+
+ // UNSURE This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ // Check that the Entity is enabled before proceeding (See description of enable on the Entity
+ // object in the DDS spec)
+ if (!isEnabled()) {
+ return ReturnCode.NOT_ENABLED;
+ }
+
+ return ReturnCode.ERROR;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public ReturnCode takeNextInstance(Collection<?> dataSamples, long maxSamples, InstanceHandle instanceHandle, ReadCondition readCondition) {
+
+ // UNSURE This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ // Check that the Entity is enabled before proceeding (See description of enable on the Entity
+ // object in the DDS spec)
+ if (!isEnabled()) {
+ return ReturnCode.NOT_ENABLED;
+ }
+
+ return ReturnCode.ERROR;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public ReturnCode returnLoan(Collection<?> dataSamples) {
+
+ // UNSURE This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ // Check that the Entity is enabled before proceeding (See description of enable on the Entity
+ // object in the DDS spec)
+ if (!isEnabled()) {
+ return ReturnCode.NOT_ENABLED;
+ }
+
+ return ReturnCode.ERROR;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public ReturnCode getKeyValue(Data keyHolder, InstanceHandle instanceHandle) {
+
+ // UNSURE This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ // Check that the Entity is enabled before proceeding (See description of enable on the Entity
+ // object in the DDS spec)
+ if (!isEnabled()) {
+ return ReturnCode.NOT_ENABLED;
+ }
+
+ return ReturnCode.ERROR;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public ReadCondition createReadCondition(Collection<?> sampleStates, Collection<?> viewStates, Collection<?> instanceStates) {
+
+ // UNSURE This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ return null;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public QueryCondition createQueryCondition(Collection<?> sampleStates, Collection<?> viewStates, Collection<?> instanceStates, String queryExpression, Collection<?> queryParameters) {
+
+ // UNSURE This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ return null;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public ReturnCode deleteReadCondition(ReadCondition readCondition) {
+
+ // UNSURE This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ // Check that the Entity is enabled before proceeding (See description of enable on the Entity
+ // object in the DDS spec)
+ if (!isEnabled()) {
+ return ReturnCode.NOT_ENABLED;
+ }
+
+ return ReturnCode.ERROR;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public LivelinessChangedStatus getLivelinessChangedStatus() {
+
+ // UNSURE This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ return null;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public RequestedDeadlineMissedStatus getRequestedDeadlineMissedStatus() {
+
+ // UNSURE This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ return null;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public RequestedIncompatibleQosStatus getRequestedIncompatibleQosStatus() {
+
+ // UNSURE This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ return null;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public SampleRejectedStatus getSampleRejectedStatus() {
+
+ // UNSURE This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ return null;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public SubscriptionMatchStatus getSubscriptionMatchStatus() {
+
+ // UNSURE This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ return null;
+ }
+
+ /**
+ * @return Returns the topicDescription.
+ */
+ public TopicDescription getTopicDescription() {
+ return topicDescription;
+ }
+
+ /**
+ * @return Returns the subscriber.
+ */
+ public Subscriber getSubscriber() {
+ return subscriber;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public ReturnCode waitForHistoricalData(Duration duration) {
+
+ // UNSURE This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ // Check that the Entity is enabled before proceeding (See description of enable on the Entity
+ // object in the DDS spec)
+ if (!isEnabled()) {
+ return ReturnCode.NOT_ENABLED;
+ }
+
+ return ReturnCode.ERROR;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public ReturnCode getMatchedPublicationData(PublicationBuiltinTopicData publicationData, InstanceHandle instanceHandle) {
+
+ // UNSURE This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ // Check that the Entity is enabled before proceeding (See description of enable on the Entity
+ // object in the DDS spec)
+ if (!isEnabled()) {
+ return ReturnCode.NOT_ENABLED;
+ }
+
+ return ReturnCode.ERROR;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public ReturnCode getMatchedPublications(Collection<?> instanceHandles) {
+
+ // UNSURE This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ // Check that the Entity is enabled before proceeding (See description of enable on the Entity
+ // object in the DDS spec)
+ if (!isEnabled()) {
+ return ReturnCode.NOT_ENABLED;
+ }
+
+ return ReturnCode.ERROR;
+ }
+
+ public void dispose(){
+ topicDescription = null;
+ subscriber = null;
+ super.dispose();
+ }
+
+ /**
+ * This is intended to be called whenever new data is "published" to the Service. Calls onDataAvailable on the
+ * attached <code>DataReaderListener</code> as appropriate.
+ */
+ void store(Data theData) { // package scope
+ // Get the data portion from theData
+ ByteBuffer incomingBuffer = theData.toByteBuffer();
+
+ // Check the size, increase the size of dataBuffer only if needed
+ if (incomingBuffer.remaining() != dataBuffer.remaining()) {
+ dataBuffer = ByteBuffer.wrap(new byte[incomingBuffer.remaining()]);
+ }
+
+ incomingBuffer.mark();
+ dataBuffer.put(incomingBuffer);
+ incomingBuffer.reset();
+ dataBuffer.rewind();
+ getListener().onDataAvailable(this);
+ }
+
+ public synchronized void processNewData(DataStoreItem item) {
+ this.item = item;
+ DataReaderListener listener = getListener();
+ if (listener != null) {
+ listener.onDataAvailable(this);
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DataWriter.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DataWriter.java
new file mode 100644
index 000000000..2dea7f173
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DataWriter.java
@@ -0,0 +1,376 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.entity;
+
+import java.util.Collection;
+
+import org.eclipse.osee.ote.messaging.dds.Data;
+import org.eclipse.osee.ote.messaging.dds.DataSample;
+import org.eclipse.osee.ote.messaging.dds.DataStoreItem;
+import org.eclipse.osee.ote.messaging.dds.IDestination;
+import org.eclipse.osee.ote.messaging.dds.ISource;
+import org.eclipse.osee.ote.messaging.dds.InstanceHandle;
+import org.eclipse.osee.ote.messaging.dds.NotImplementedException;
+import org.eclipse.osee.ote.messaging.dds.ReturnCode;
+import org.eclipse.osee.ote.messaging.dds.StatusKind;
+import org.eclipse.osee.ote.messaging.dds.Time;
+import org.eclipse.osee.ote.messaging.dds.listener.DataWriterListener;
+import org.eclipse.osee.ote.messaging.dds.listener.TopicListener;
+import org.eclipse.osee.ote.messaging.dds.status.LivelinessLostStatus;
+import org.eclipse.osee.ote.messaging.dds.status.OfferedDeadlineMissedStatus;
+import org.eclipse.osee.ote.messaging.dds.status.OfferedIncompatibleQosStatus;
+import org.eclipse.osee.ote.messaging.dds.status.PublicationMatchStatus;
+
+/**
+ * The base class which all application specific data writers must extend. Access to write information in the DDS system
+ * is all made possible by this class. This class is partially implemented.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class DataWriter extends DomainEntity {
+ private Topic topic;
+ private Publisher publisher;
+ private boolean deleted;
+ private boolean publishBackToLocalDDSReaders = true;
+
+ /**
+ * Creates a reader with all of the necessary information. This constructor is only visible to the DDS system,
+ * applications should use {@link DomainParticipant#createTopic(String, String, TopicListener)} to create a Topic.
+ */
+ public DataWriter(Topic topic, Publisher publisher, Boolean enabled, DataWriterListener listener, EntityFactory parentFactory) {
+ super(enabled.booleanValue(), listener, parentFactory);
+ this.topic = topic;
+ this.publisher = publisher;
+ this.deleted = false;
+
+ topic.addDataWriter(this);
+ }
+
+ public DataWriter(){
+ super(true, null, null);
+ topic = null;
+ publisher = null;
+ }
+
+ /**
+ * Provides access to the deletion flag for this <code>DataReader</code>.
+ *
+ * @return <b>true</b> iff this has been marked as deleted.
+ */
+ boolean isDeleted() { // package scope since this is system-level code
+ return deleted;
+ }
+
+ /**
+ * Set this item as deleted. This should only be called on the item by the factory which created this reader, and
+ * when the <code>deleteWriter()</code> method is called.
+ */
+ void markAsDeleted() { // package scope so that factories of this item can mark it as deleted
+ topic.removeDataWriter(this);
+ deleted = true;
+ }
+
+ /**
+ * Retrieve access to the listener assigned to this <code>DataWriter</code>. The writer is not guaranteed to have a
+ * listener, so this method may return <b>null</b>, and the user of this method should handle that appropriately.
+ */
+ public DataWriterListener getListener() {
+ return (DataWriterListener) super.getBaseListener();
+ }
+
+ /**
+ * Set the listener for this <code>DataWriter</code>. If another listener was already assigned then it will be
+ * overridden with out any error. Additionally, <b>null</b> may be passed as the listener to remove the current
+ * listener from this writer.
+ *
+ * @param listener - The listener to invoke when events occur.
+ * @param mask - Not implemented, <b>null</b> is acceptable.
+ * @return {@link ReturnCode#OK}
+ */
+ public ReturnCode setListener(DataWriterListener listener, StatusKind mask) {
+ return super.setBaseListener(listener, mask);
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public InstanceHandle register(Data data) {
+
+ // DONT_NEED This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ return null;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public InstanceHandle registerWithTimestamp(Data data, Time timestamp) {
+
+ // DONT_NEED This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ return null;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public InstanceHandle unregister(Data data, InstanceHandle handle) {
+
+ // DONT_NEED This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ return null;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public InstanceHandle unregisterWithTimestamp(Data data, InstanceHandle handle, Time timestamp) {
+
+ // DONT_NEED This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ return null;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public ReturnCode getKeyValue(Data keyHolder, InstanceHandle handle) {
+
+ // UNSURE This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+ if (!isEnabled()) {
+ return ReturnCode.NOT_ENABLED;
+ }
+
+ return ReturnCode.ERROR;
+ }
+
+ // PARTIAL InstanceHandle is not used
+ /**
+ * Method for writing data to the DDS system. This should be overridden to provide type-specific methods for writing
+ * data to the system.
+ *
+ * @param destination TODO
+ * @param source TODO <li>{@link ReturnCode#NOT_ENABLED} if this writer is not enabled. <li>{@link ReturnCode#OK}
+ * otherwise. </ul>
+ */
+ public ReturnCode write(IDestination destination, ISource source, Data data, InstanceHandle handle) {
+ // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+ if (!isEnabled()) {
+ return ReturnCode.NOT_ENABLED;
+ }
+ //TUNE find a way to reuse the DataSample and DataStoreItem objects instead new'ing them everytime
+ DataSample dataSample = new DataSample(data, new SampleInfo());
+ publisher.publishData(destination, source, new DataStoreItem(dataSample, topic, this));
+
+ return ReturnCode.OK;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public ReturnCode writeWithTimestamp(Data data, InstanceHandle handle, Time timestamp) {
+
+ // DONT_NEED This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+ if (!isEnabled()) {
+ return ReturnCode.NOT_ENABLED;
+ }
+
+ return ReturnCode.ERROR;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public ReturnCode dispose(Data data, InstanceHandle handle) {
+ dispose();
+ return ReturnCode.UNSUPPORTED;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public ReturnCode diposeWithTimestamp(Data data, InstanceHandle handle, Time timestamp) {
+ dispose();
+ return ReturnCode.UNSUPPORTED;
+ }
+
+ public void dispose(){
+ topic = null;
+ publisher = null;
+ super.dispose();
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public LivelinessLostStatus getLivelinessLostStatus() {
+
+ // DONT_NEED This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ return null;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public OfferedDeadlineMissedStatus getOfferedDeadlineMissedStatus() {
+
+ // DONT_NEED This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ return null;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public OfferedIncompatibleQosStatus getOfferedIncompatibleQosStatus() {
+
+ // DONT_NEED This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ return null;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public PublicationMatchStatus getPublicationMatchStatus() {
+
+ // DONT_NEED This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ return null;
+ }
+
+ /**
+ * @return Returns the topic.
+ */
+ public Topic getTopic() {
+ return topic;
+ }
+
+ /**
+ * @return Returns the publisher.
+ */
+ public Publisher getPublisher() {
+ return publisher;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public void assertLiveliness() {
+
+ // UNSURE This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public ReturnCode getMatchedSubscriptionData(SubscriptionBuiltinTopicData subscriptionData, InstanceHandle subscriptionHandle) {
+
+ // UNSURE This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+ if (!isEnabled()) {
+ return ReturnCode.NOT_ENABLED;
+ }
+
+ return ReturnCode.ERROR;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public ReturnCode getMatchedSubscriptions(Collection<?> subscriptionHandles) {
+
+ // UNSURE This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+ if (!isEnabled()) {
+ return ReturnCode.NOT_ENABLED;
+ }
+
+ return ReturnCode.ERROR;
+ }
+
+ /**
+ * @return the publishBackToLocalDDSReaders
+ */
+ public boolean isPublishBackToLocalDDSReaders() {
+ return publishBackToLocalDDSReaders;
+ }
+
+ /**
+ * @param publishBackToLocalDDSReaders the publishBackToLocalDDSReaders to set
+ */
+ public void setPublishBackToLocalDDSReaders(boolean publishBackToLocalDDSReaders) {
+ this.publishBackToLocalDDSReaders = publishBackToLocalDDSReaders;
+ }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DomainEntity.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DomainEntity.java
new file mode 100644
index 000000000..97425a631
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DomainEntity.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.entity;
+
+import org.eclipse.osee.ote.messaging.dds.listener.Listener;
+
+/**
+ * The base class which all of the entity classes in the DDS system extend, except for the
+ * <code>DomainParticipant</code>. This intermediate class is in place simply to clarify that a
+ * <code>DomainParticipant</code> can contain any other type of entity, except another <code>DomainParticipant</code>.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public abstract class DomainEntity extends Entity {
+
+ public DomainEntity(boolean enabled, Listener listener, EntityFactory parentFactory) {
+ super(enabled, listener, parentFactory);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DomainParticipant.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DomainParticipant.java
new file mode 100644
index 000000000..4968e9515
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DomainParticipant.java
@@ -0,0 +1,619 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.entity;
+
+import java.util.Collection;
+import java.util.concurrent.CopyOnWriteArrayList;
+import org.eclipse.osee.framework.jdk.core.type.CompositeKeyHashMap;
+import org.eclipse.osee.ote.messaging.dds.DataStoreItem;
+import org.eclipse.osee.ote.messaging.dds.IDestination;
+import org.eclipse.osee.ote.messaging.dds.ISource;
+import org.eclipse.osee.ote.messaging.dds.NotImplementedException;
+import org.eclipse.osee.ote.messaging.dds.ReturnCode;
+import org.eclipse.osee.ote.messaging.dds.StatusKind;
+import org.eclipse.osee.ote.messaging.dds.listener.DataWriterListener;
+import org.eclipse.osee.ote.messaging.dds.listener.DomainParticipantListener;
+import org.eclipse.osee.ote.messaging.dds.listener.Listener;
+import org.eclipse.osee.ote.messaging.dds.listener.PublisherListener;
+import org.eclipse.osee.ote.messaging.dds.listener.SubscriberListener;
+import org.eclipse.osee.ote.messaging.dds.listener.TopicListener;
+import org.eclipse.osee.ote.messaging.dds.service.DomainId;
+import org.eclipse.osee.ote.messaging.dds.service.TopicDescription;
+import org.eclipse.osee.ote.messaging.dds.service.TypeRegistry;
+import org.eclipse.osee.ote.messaging.dds.service.TypeSignature;
+import org.eclipse.osee.ote.messaging.dds.service.TypeSupport;
+
+/**
+ * Provides functionality for applications to participate within a domain as described in the DDS specification. The
+ * DomainParticipant is a factory used by the application to create {@link Publisher}'s and {@link Subscriber}'s to
+ * interact with the system.
+ * <p>
+ * In addition to the functionality described in the DDS specification, this class provides particular functionality to
+ * interact with middleware which could be used to link this with another data system. The middleware is provided a
+ * special publisher to inject data into this system, and receives data from all other publishers by means of the
+ * {@link DomainParticipantListener}.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class DomainParticipant extends Entity implements EntityFactory {
+ private final DomainId domainId;
+ // These collections REALLY need to be thread safe!!!
+ private final CopyOnWriteArrayList<Publisher> publishers;
+ private final CopyOnWriteArrayList<Subscriber> subscribers;
+ private final CompositeKeyHashMap<String, String, Topic> topics;
+
+ private final TypeRegistry typeRegistry;
+ private Publisher middlewarePublisher; // Publisher who can send anything
+
+ // DONT_NEED The builtinSubscriber is here for future functionality that is described in the DDS specification but has not been implemented or used.
+ private final Subscriber builtinSubscriber;
+
+ /**
+ * @param domainId The domain this participant will belong to
+ * @param domain A reference to the collection of all participants in this domain.
+ * @param enabled Flag which indicates if this is enabled.
+ * @param listener The listener attached to this.
+ * @param parentFactory A reference to the factory that is creating this.
+ * @param threadedPublishing <code>True</code> if we should create a separate thread for processing published data.
+ * If <code>False</code>, the published data will be processed within the thread which makes the call to write data
+ * into the system (or resume publications).
+ * @param typeCapacity The initial capacity to use when creating the <code>Map</code> for the {@link TypeRegistry}.
+ * @param typeFactor The load factor to use when creating the <code>Map</code> for the {@link TypeRegistry}.
+ */
+ DomainParticipant(DomainId domainId, Collection<DomainParticipant> domain, boolean enabled, DomainParticipantListener listener, EntityFactory parentFactory, boolean threadedPublishing, int typeCapacity, float typeFactor) {
+ super(enabled, listener, parentFactory);
+
+ this.domainId = domainId;
+ this.publishers = new CopyOnWriteArrayList<>(); // Thread Safe
+ this.subscribers = new CopyOnWriteArrayList<>(); // Thread Safe
+ this.topics = new CompositeKeyHashMap<>(512, true);
+ this.middlewarePublisher = null;
+ this.typeRegistry = new TypeRegistry(typeCapacity, typeFactor);
+
+ this.builtinSubscriber = null;
+ }
+
+ /**
+ * Creates the DomainParticipant with default settings for typeCapacity and typeFactor.
+ *
+ * @see DomainParticipant#DomainParticipant(DomainId, Collection, boolean, DomainParticipantListener, EntityFactory,
+ * boolean, int, float)
+ */
+ DomainParticipant(DomainId domainId, Collection<DomainParticipant> domain, boolean enabled, DomainParticipantListener listener, EntityFactory parentFactory, boolean threadedPublishing) {
+ this(domainId, domain, enabled, listener, parentFactory, threadedPublishing, 256, .75f);
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ *
+ * @return Returns the builtinSubscriber.
+ */
+ public Subscriber getBuiltinSubscriber() {
+ // DONT_NEED This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+ return builtinSubscriber;
+ }
+
+ /**
+ * Gets the listener attached to this <code>DomainParticipant</code>.
+ */
+ public DomainParticipantListener getListener() {
+ return (DomainParticipantListener) super.getBaseListener();
+ }
+
+ /**
+ * Sets the listener attached to this <code>DomainParticipant</code>. This replaces the existing listener.
+ *
+ * @param listener The listener to attach.
+ * @param mask A mask identifying which communication statuses the listener should be invoked.
+ * @return The {@link ReturnCode}returned by {@link Entity#setBaseListener(Listener, StatusKind)}.
+ * @see Entity#setBaseListener(Listener, StatusKind)
+ */
+ public ReturnCode setListener(DomainParticipantListener listener, StatusKind mask) {
+ return super.setBaseListener(listener, mask);
+ }
+
+ /**
+ * Creates a publisher with the passed listener attached.
+ *
+ * @param publisherListener The listener to attach to the newly created Publisher.
+ * @return The newly created publisher, or null if an error occurred in creation.
+ */
+ private Publisher createAPublisher(PublisherListener publisherListener) {
+ Publisher publisher = null;
+ try {
+ publisher = new Publisher(this, this.isEnabled(), publisherListener);
+ publishers.add(publisher);
+ } catch (OutOfMemoryError er) {
+ er.printStackTrace();
+ publisher = null;
+ }
+
+ return publisher;
+ }
+
+ /**
+ * Creates a middlewarePublisher. If a middlewarePublisher has already been created this will return a reference to
+ * the existing middlewarePublisher. The middlewarePublisher is provided as a link for an outside system to be able
+ * to inject data into this system.
+ *
+ * @param publisherListener The listener to attach to the newly created <code>Publisher</code>. Note that this can be
+ * null.
+ * @return A <code>Publisher</code> with the passed in listener assigned to it, or null if an error occurred in
+ * creation.
+ */
+ public Publisher getMiddlewarePublisherInstance(PublisherListener publisherListener) {
+ if (middlewarePublisher == null) {
+ middlewarePublisher = createAPublisher(publisherListener);
+ }
+ return middlewarePublisher;
+ }
+
+ /**
+ * Creates a new <code>Publisher</code> with a particular listener assigned to it. The publisher will be created
+ * enabled iff this <code>DomainParticipant</code> is enabled. If an OutOfMemoryError is thrown while attempting get
+ * the new publisher, <b>null </b> will be returned.
+ *
+ * @param publisherListener The listener to be attached.
+ * @return The newly created <code>Publisher</code>, or null if an error occurred in creation.
+ */
+ public Publisher createPublisher(PublisherListener publisherListener) {
+ Publisher publisher = createAPublisher(publisherListener);
+ if (publisher != null) {
+ publishers.add(publisher);
+ }
+ return publisher;
+ }
+
+ /**
+ * Removes the passed <code>Publisher</code> iff the publisher was created by this <code>DomainParticipant</code> and
+ * does not have any attached <code>DataWriter</code> 's.
+ *
+ * @param publisher The publisher to be removed.
+ * @return {@link ReturnCode#OK}if the publisher was successfully removed, {@link ReturnCode#PRECONDITION_NOT_MET}if
+ * the publisher had writers or was not created by this DomainParticipant, or {@link ReturnCode#ERROR}.
+ */
+ public ReturnCode deletePublisher(Publisher publisher) {
+
+ // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+ if (!isEnabled()) {
+ return ReturnCode.NOT_ENABLED;
+ }
+
+ // Check that a publisher was supplied
+ if (publisher == null) {
+ return ReturnCode.ERROR;
+ }
+
+ // Check the pre-condition
+ if (publisher.hasDataWriters()) {
+ return ReturnCode.PRECONDITION_NOT_MET;
+ }
+
+ // Attempt to remove, if it did not exist in our list then return an error,
+ // since it can only be removed from the <code>DomainParticipant</code> which created it.
+ if (publishers.remove(publisher)) {
+ return ReturnCode.OK;
+ } else {
+ return ReturnCode.PRECONDITION_NOT_MET;
+ }
+ }
+
+ /**
+ * Creates a <code>Subscriber</code> with the provided listener attached.
+ *
+ * @param subscriberListener The listener to be attached.
+ * @return The newly created <code>Subscriber</code>, or null if an error occurred in creation.
+ */
+ public Subscriber createSubscriber(SubscriberListener subscriberListener) {
+ Subscriber subscriber = null;
+ try {
+ subscriber = new Subscriber(this, this.isEnabled(), subscriberListener);
+ subscribers.add(subscriber);
+ } catch (OutOfMemoryError er) {
+ er.printStackTrace();
+ subscriber = null;
+ }
+ return subscriber;
+ }
+
+ /**
+ * Removes the passed <code>Subscriber</code> iff the subscriber was created by this <code>DomainParticipant</code>
+ * and does not have any attached <code>DataReader</code> 's.
+ *
+ * @param subscriber The subscriber to be removed.
+ * @return {@link ReturnCode#OK}if the subscriber was successfully removed, {@link ReturnCode#PRECONDITION_NOT_MET}if
+ * the subscriber had readers or was not created by this DomainParticipant, or {@link ReturnCode#ERROR}.
+ */
+ public ReturnCode deleteSubscriber(Subscriber subscriber) {
+
+ // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+ if (!isEnabled()) {
+ return ReturnCode.NOT_ENABLED;
+ }
+
+ // Check that a subscriber was supplied
+ if (subscriber == null) {
+ return ReturnCode.ERROR;
+ }
+
+ // Check the pre-condition
+ if (subscriber.hasDataReaders()) {
+ return ReturnCode.PRECONDITION_NOT_MET;
+ }
+
+ // Attempt to remove, if it did not exist in our list then return an error,
+ // since it can only be removed from the <code>DomainParticipant</code> which created it.
+ if (subscribers.remove(subscriber)) {
+ return ReturnCode.OK;
+ } else {
+ return ReturnCode.PRECONDITION_NOT_MET;
+ }
+ }
+
+ /**
+ * Creates a <code>Topic</code> on this <code>DomainParticipant</code> with the give name. If a <code>Topic</code>
+ * already exists with the given name, then the existing topic will be returned IF the typeName matches that of the
+ * existing <code>Topic</code>. If the type's do not match, <b>null </b> is returned.
+ *
+ * @param name The name of the topic to create.
+ * @param typeName The name of the type associated with the topic.
+ * @param topicListener The listener to be attached to the created topic if it is newly created. If the topic already
+ * exists, the provided listener is ignored.
+ * @return A new <code>Topic</code> if one does not already exist, or an existing topic with the same
+ * <code>name</code> and <code>typeName</code>, otherwise <b>null </b>
+ */
+ public Topic createTopic(String name, String namespace, String typeName, TopicListener topicListener) {
+
+ Topic topic = null;
+
+ // Even before that, check that the type was registered
+ TypeSignature typeSignature = typeRegistry.lookupSignature(typeName);
+ if (typeSignature == null) {
+ throw new RuntimeException(String.format("No type signature with name [%s] was found.", typeName));
+ } else {
+
+ // First check to see if the topic already exists
+ TopicDescription topicDescription = lookupTopicDescription(namespace, name);
+ if (topicDescription != null && topicDescription instanceof Topic) {
+
+ topic = (Topic) topicDescription;
+
+ // Make sure that the type name is the same, otherwise it is failure
+ if (topic.getTypeName().equals(typeName)) {
+ // Track that another create has been called for this topic
+ topic.incrementCount();
+ } else {
+ // There is a violation, and no topic will be returned since a topic
+ // with this name already exists, but the types do not match
+ throw new RuntimeException(
+ String.format(
+ "found topic name:[%s] namespace:[%s] but there was a type incompatibility between [%s] (from topic [%s]) and [%s].",
+ name, namespace, topic.getTypeName(), topic.getName(), typeName));
+ }
+ } else { // Otherwise, the topic did not already exist
+ topic = new Topic(this, typeSignature, name, namespace, this.isEnabled(), topicListener, this);
+ topics.put(namespace, name, topic);
+ }
+ }
+ return topic;
+ }
+
+ /**
+ * This method deletes a <code>Topic</code> previously created by this <code>DomainParticipant</code>. No action will
+ * be taken if the topic still has data readers/writers attached to it, or if it was not created by this
+ * <code>DomainParticipant</code>.
+ *
+ * @param topic The topic to delete.
+ * @return {@link ReturnCode#OK}if the topic was successfully removed, {@link ReturnCode#PRECONDITION_NOT_MET}if the
+ * topic has readers/writers or was not created by this DomainParticipant, {@link ReturnCode#NOT_ENABLED}if this
+ * DomainParticipant is not enabled, or {@link ReturnCode#ERROR}.
+ */
+ public ReturnCode deleteTopic(Topic topic) {
+
+ // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+ if (!isEnabled()) {
+ return ReturnCode.NOT_ENABLED;
+ }
+
+ // Check the pre-condition
+ if (topic.hasDataReaders()) {
+ return ReturnCode.PRECONDITION_NOT_MET;
+ }
+ // Check the pre-condition
+ if (topic.hasDataWriters()) {
+ return ReturnCode.PRECONDITION_NOT_MET;
+ }
+
+ // Check that a topic was supplied
+ if (topic == null) {
+ return ReturnCode.ERROR;
+ }
+
+ // Attempt to remove, if it did not exist in our list then return an error,
+ // since it can only be removed from the <code>DomainParticipant</code> which created it.
+ if (topics.containsKey(topic.getNamespace() + topic.getName())) {
+ // Reduce the count of creations by 1
+ topic.decrementCount();
+
+ // If the creation count is zero, then remove it from the list
+ if (topic.getCount() <= 0) {
+ topics.removeValues(topic.getNamespace() + topic.getName());
+ }
+
+ return ReturnCode.OK;
+ } else {
+ return ReturnCode.PRECONDITION_NOT_MET;
+ }
+ }
+
+ /**
+ * Get a <code>TopicDescription</code> that matches a particular name. PARTIAL: Since the
+ * <code>ContentFilteredTopic</code> and <code>MultiTopic</code> classes are not implemented, this method simply
+ * searches the list of <code>Topic</code> classes.
+ *
+ * @param namespace The name to match against the <code>TopicDescription</code>.
+ * @return The <code>TopicDescription</code> that has the specified name, <b>null </b> if no such one exists.
+ */
+ public TopicDescription lookupTopicDescription(String namespace, String topic) {
+ //PARTIAL ContentFilteredTopic and MultiTopic are not implemented, so this only searches Topic.
+ return findTopicByName(namespace, topic);
+ }
+
+ /**
+ * Searches the current list of Topics for this DomainParticipant for a topic whose name matches the provided
+ * topicName
+ *
+ * @param topicName The topic name to match
+ * @return A reference to the existing topic whose name matches topicName, or null if no such topic exists.
+ */
+ private Topic findTopicByName(String namespace, String topicName) {
+ return topics.get(namespace, topicName);
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ *
+ * @return {@link ReturnCode#OK}if the participant was successfully set to be ignored, {@link ReturnCode#NOT_ENABLED}
+ * if this DomainParticipant is not enabled, or {@link ReturnCode#ERROR}.
+ */
+ public ReturnCode ignoreParticipant() {
+ // UNSURE this is stubbed for now, until we determine it's necessity
+
+ // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+ if (!isEnabled()) {
+ return ReturnCode.NOT_ENABLED;
+ }
+
+ return ReturnCode.ERROR;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ *
+ * @return {@link ReturnCode#OK}if the topic was successfully set to be ignored, {@link ReturnCode#NOT_ENABLED}if
+ * this DomainParticipant is not enabled, or {@link ReturnCode#ERROR}.
+ */
+ public ReturnCode ignoreTopic() {
+ // UNSURE This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+ if (!isEnabled()) {
+ return ReturnCode.NOT_ENABLED;
+ }
+
+ return ReturnCode.ERROR;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ *
+ * @return {@link ReturnCode#OK}if the publication was successfully set to be ignored, {@link ReturnCode#NOT_ENABLED}
+ * if this DomainParticipant is not enabled, or {@link ReturnCode#ERROR}.
+ */
+ public ReturnCode ignorePublication() {
+ // UNSURE This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+ if (!isEnabled()) {
+ return ReturnCode.NOT_ENABLED;
+ }
+
+ return ReturnCode.ERROR;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ *
+ * @return {@link ReturnCode#OK}if the subscription was successfully set to be ignored,
+ * {@link ReturnCode#NOT_ENABLED}if this DomainParticipant is not enabled, or {@link ReturnCode#ERROR}.
+ */
+ public ReturnCode ignoreSubscription() {
+ // UNSURE This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+ if (!isEnabled()) {
+ return ReturnCode.NOT_ENABLED;
+ }
+
+ return ReturnCode.ERROR;
+ }
+
+ /**
+ * Gets the <code>DomainId</code> that this <code>DomainParticipant</code> belongs to.
+ *
+ * @return The <code>DomainId</code> of this participant.
+ */
+ public DomainId getDomainId() {
+ return domainId;
+ }
+
+ /**
+ * Performs a deep deletion of contained entities (Publishers, Subscribers, Topics). This will cause a recursive call
+ * of <code>deleteContainedEntities</code> through out all of the contained entities. This can only be performed if
+ * the <code>DomainParticipant</code> is enabled.
+ *
+ * @return {@link ReturnCode#OK}if the all entities were successfully deleted, or {@link ReturnCode#NOT_ENABLED}if
+ * this DomainParticipant is not enabled.
+ */
+ public ReturnCode deleteContainedEntities() {
+
+ // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+ if (!isEnabled()) {
+ return ReturnCode.NOT_ENABLED;
+ }
+
+ for (Publisher publisher : publishers) {
+ publisher.deleteContainedEntities();
+ }
+ publishers.clear();
+
+ for (Subscriber subscriber : subscribers) {
+ subscriber.deleteContainedEntities();
+ }
+
+ subscribers.clear();
+
+ this.middlewarePublisher = null;
+
+ // Topics do not contain anything else
+ topics.clear();
+
+ return ReturnCode.OK;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public void assertLiveliness() {
+ // UNSURE This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+ }
+
+ /**
+ * Returns true iff this <code>DomainParticipant</code> contains at least one publisher, subscriber or topic.
+ *
+ * @return <b>true </b> if this contains an entity, <b>false </b> otherwise.
+ */
+ public boolean hasEntities() {
+ return !(publishers.isEmpty() && subscribers.isEmpty() && topics.isEmpty());
+ }
+
+ /**
+ * Propagates the published data to each <code>Subscriber</code> of this <code>DomainParticipant</code>. Notifies the
+ * middleware (by means of the {@link DomainParticipantListener}of the new data unless it originated from the
+ * middlewarePublisher. The middleware is only notified of data originating from this <code>DomainPariticipant</code>
+ * , that is, data published from other participants in the domain will not be sent to the middleware.
+ *
+ * @param destination TODO
+ * @param source TODO
+ * @param dataStoreItem The <code>DataStoreItem</code> that was published.
+ */
+ void processPublishedData(IDestination destination, ISource source, DataStoreItem dataStoreItem) { // package scope since it is a
+ // system-level call
+
+ // Notify the middleware of new data, unless it was published by the middlewarePublisher
+ // When data is published by the middlewarePublisher it does not have an associated DataWriter
+
+ DataWriter writer = dataStoreItem.getTheWriter();
+ if (writer != null) {
+ // Invoke the DomainParticipantListener if available
+ DomainParticipantListener domainParticipantListener = getListener();
+ if (domainParticipantListener != null) {
+ domainParticipantListener.onPublishNotifyMiddleware(destination, source, dataStoreItem);
+ }
+
+ // If the writer has a listener, then invoke it
+ DataWriterListener writerListener = writer.getListener();
+ if (writerListener != null) {
+ writerListener.onDataSentToMiddleware(writer);
+ }
+
+ }
+
+ if (writer == null || writer != null && writer.isPublishBackToLocalDDSReaders()) {
+ // Notify all of the subscribers in our domain
+ for (Subscriber domainSubscribers : subscribers) {
+ domainSubscribers.processNewData(dataStoreItem);
+ }
+ }
+ }
+
+ /**
+ * Gets the <code>TypeRegistry</code> used by {@link TypeSupport}to store the types registered for this
+ * <code>DomainParticipant</code>.
+ *
+ * @return Returns the typeRegistry.
+ */
+ public TypeRegistry getTypeRegistry() {
+ return typeRegistry;
+ }
+
+ /**
+ * Gets the Middleware <code>Publisher</code> if one has been created.
+ *
+ * @return Returns the <code>Publisher</code> for the middleware, or null if it has not been created.
+ * @see DomainParticipant
+ */
+ public Publisher getMiddlewarePublisher() {
+ return middlewarePublisher;
+ }
+
+ /**
+ * Gets the current <code>Collection</code> of <code>Publisher</code>'s for this <code>DomainPariticpant</code>.
+ *
+ * @return Returns the <code>Collection</code> of <code>Publisher</code> 's.
+ */
+ public CopyOnWriteArrayList<Publisher> getPublishers() {
+ return publishers;
+ }
+
+ public void dispose() {
+ for (Topic topic : topics.values()) {
+ topic.clearDataReaders();
+ topic.clearDataWriters();
+ }
+ topics.clear();
+ for (Subscriber subscriber : subscribers) {
+ if (subscriber.deleteContainedEntities() == ReturnCode.NOT_ENABLED) {
+ System.err.println("failed to delete subscriber because it was not enabled");
+ }
+ }
+ subscribers.clear();
+
+ for (Publisher publisher : publishers) {
+ publisher.dispose();
+ }
+ publishers.clear();
+
+ typeRegistry.clear();
+ }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DomainParticipantFactory.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DomainParticipantFactory.java
new file mode 100644
index 000000000..24d4dfed5
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DomainParticipantFactory.java
@@ -0,0 +1,151 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.entity;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.osee.ote.messaging.dds.ReturnCode;
+import org.eclipse.osee.ote.messaging.dds.listener.DomainParticipantListener;
+import org.eclipse.osee.ote.messaging.dds.service.DomainId;
+
+/**
+ * This is the entry point of the DDS system. This is a singleton factory class used by the application to create
+ * <code>DomainParticipant</code> 's.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class DomainParticipantFactory implements EntityFactory {
+ private static DomainParticipantFactory factory = null;
+ private final Map<DomainId, Collection<DomainParticipant>> domainMap;
+
+ private DomainParticipantFactory() {
+ // This map is very important since data must be sent to all
+ domainMap = Collections.synchronizedMap(new HashMap<DomainId, Collection<DomainParticipant>>(10, .75f));
+ }
+
+ /**
+ * This is a singleton class so this will always return the same DomainParticipantFactory.
+ *
+ * @return The instance of the <code>DomainParticipantFactory</code>
+ */
+ public static DomainParticipantFactory getInstance() {
+ if (factory == null) {
+ factory = new DomainParticipantFactory();
+ }
+
+ return factory;
+ }
+
+ /**
+ * Creates a <code>DomainParticipant</code> that belongs to this <code>DomainParticipantFactory</code>
+ *
+ * @param domainId The ID of the domain that the <code>DomainParticipant</code> should belong to. All participants
+ * will receive publications from any publisher in the domain.
+ * @param listener The listener to attach to the <code>DomainParticipant</code>.
+ * @param threadedPublishing <b>true </b> if the participant should use a separate thread for processing
+ * publications.
+ * @return A DomainParticipant in the domainId with provided listener attached.
+ */
+ public DomainParticipant createParticipant(DomainId domainId, DomainParticipantListener listener, boolean threadedPublishing) {
+
+ Collection<DomainParticipant> domain = domainMap.get(domainId);
+
+ // If there is not a collection for this ID yet, then make one and add it to the hash
+ if (domain == null) {
+ domain = Collections.synchronizedList(new ArrayList<DomainParticipant>(1));
+ domainMap.put(domainId, domain);
+ }
+
+ // Get a new DomainParticipant
+ DomainParticipant participant =
+ new DomainParticipant(domainId, domain, this.isEnabled(), listener, this, threadedPublishing);
+
+ // Add the participant to that domain collection
+ domain.add(participant);
+
+ return participant;
+ }
+
+ /**
+ * Removes a <code>DomainParticipant</code> from the <code>DomainParticipantFactory</code>. If the participant
+ * contains entities the method will fail. This can be satisfied by calling
+ * {@link DomainParticipant#deleteContainedEntities()}on the participant.
+ *
+ * @param participant The participant to be removed.
+ * @return {@link ReturnCode#OK}if successful, otherwise {@link ReturnCode#PRECONDITION_NOT_MET}.
+ */
+ public ReturnCode deleteParticipant(DomainParticipant participant) {
+ // Check the pre-conditions
+ // NOTE: This can be satisfied by calling deleteContainedEntities() on the participant
+ if (participant.hasEntities()) {
+ return ReturnCode.PRECONDITION_NOT_MET;
+ }
+
+ // Remove the participant and return OK status
+ Collection<DomainParticipant> domain = domainMap.get(participant.getDomainId());
+
+ // If the domain doesn't exist, return ALREADY_DELETED
+ if (domain == null) {
+ return ReturnCode.ALREADY_DELETED;
+ }
+
+ // Remove the participant from the domain
+ domain.remove(participant);
+
+ // If the domain is empty now, then remove it from the map
+ if (domain.isEmpty()) {
+ domainMap.remove(participant.getDomainId());
+ }
+
+ return ReturnCode.OK;
+ }
+
+ /**
+ * Finds a <code>DomainParticipant</code> that belongs to the domain passed. If multiple
+ * <code>DomainPariticpant</code>'s are in the domain, any one of them may be returned.
+ *
+ * @param domainId The domain to find a <code>DomainParticipant</code> in.
+ * @return A <code>DomainParticipant</code> whose domainId matches the id provided, or NULL if the factory does not
+ * contain a participant in the provided domain.
+ */
+ public DomainParticipant lookupParticipant(DomainId domainId) {
+
+ // Attempt to find a matching participant
+ Collection<DomainParticipant> domain = domainMap.get(domainId);
+
+ // If the domain exists, then get the first participant from the domain
+ if (domain != null) {
+ return domain.iterator().next();
+ // Otherwise, no such participant exists
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public boolean isEnabled() {
+ // This is always true because DomainParticipantFactory is never disabled nor disableable.
+ return true;
+ }
+
+ public static void dispose() {
+ for (Collection<DomainParticipant> collection : factory.domainMap.values()) {
+ for (DomainParticipant p : collection) {
+ p.dispose();
+ }
+ }
+ factory.domainMap.clear();
+ }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/Entity.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/Entity.java
new file mode 100644
index 000000000..c414fc2d7
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/Entity.java
@@ -0,0 +1,148 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.entity;
+
+import org.eclipse.osee.ote.messaging.dds.NotImplementedException;
+import org.eclipse.osee.ote.messaging.dds.ReturnCode;
+import org.eclipse.osee.ote.messaging.dds.StatusKind;
+import org.eclipse.osee.ote.messaging.dds.condition.StatusCondition;
+import org.eclipse.osee.ote.messaging.dds.listener.Listener;
+
+/**
+ * Base class for all <code>Entity</code> objects. Provides common functionality needed for all Entities such as
+ * listeners, enabled, etc.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public abstract class Entity {
+
+ private EntityFactory parentFactory;
+ private Listener listener;
+
+ @SuppressWarnings("unused")
+ private StatusKind statusMask; // DONT_NEED This has not been implemented, but is called out in the spec
+ private final StatusCondition statusCondition; //DONT_NEED This has not been implemented, but is called out in the spec
+ private final StatusKind[] statusChanges; //DONT_NEED This has not been implemented, but is called out in the spec
+ private boolean enabled;
+
+ /**
+ * Creates a default <code>Entity</code> with enabled set as passed, the listener attached, and a reference to the
+ * parent creating this.
+ *
+ * @param enabled The value to set for enabled. If true, <code>enabled()</code> is run.
+ * @param listener The listener to be attached to this.
+ * @param parentFactory The parent which is creating this.
+ */
+ public Entity(boolean enabled, Listener listener, EntityFactory parentFactory) {
+ super();
+
+ this.parentFactory = parentFactory;
+ this.listener = listener;
+
+ // DONT_NEED This has not been implemented, but is called out in the spec
+ this.statusMask = null;
+ this.statusCondition = null;
+ this.statusChanges = null;
+
+ // Default enabled to false, if it is passed as true then call enable() to set this as enabled.
+ this.enabled = false; // This is correct
+ if (enabled) {
+ this.enable();
+ }
+ }
+
+ /**
+ * Sets the <code>Listener</code> attached to this <code>Entity</code>. If a listener is already set, this will
+ * replace it.
+ * <p>
+ * PARTIAL - The statusMask is not currently being used.
+ *
+ * @param listener The listener to attach to this.
+ * @param statusMask The mask for this listener
+ * @return {@link ReturnCode#OK}
+ */
+ protected ReturnCode setBaseListener(Listener listener, StatusKind statusMask) {
+ this.listener = listener;
+ this.statusMask = statusMask;
+
+ return ReturnCode.OK;
+ }
+
+ /**
+ * Gets the attached listener
+ *
+ * @return The <code>Listener</code> attached to this <code>Entity</code>.
+ */
+ protected Listener getBaseListener() {
+ return listener;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public StatusCondition getStatusCondition() {
+ // DONT_NEED This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+ return statusCondition;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public StatusKind[] getStatusChanges() {
+ // DONT_NEED This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+ return statusChanges;
+ }
+
+ /**
+ * Gets the enabled status.
+ *
+ * @return Returns <b>true </b> if this <code>Entity</code> has been enabled, otherwise <b>false </b>.
+ */
+ public boolean isEnabled() {
+ return enabled;
+ }
+
+ /**
+ * Enables this entity. This method is idempotent. Note that the creating factory for this entity must be enabled.
+ *
+ * @return {@link ReturnCode#OK}if successful, or if this was previously enabled.
+ * {@link ReturnCode#PRECONDITION_NOT_MET}if the creating factory is not enabled.
+ */
+ public ReturnCode enable() {
+
+ // Check pre-conditions
+ if (parentFactory != null && !parentFactory.isEnabled()) {
+ return ReturnCode.PRECONDITION_NOT_MET;
+ }
+
+ // If the entity is already enabled, then do nothing and return
+ if (enabled) {
+ return ReturnCode.OK;
+ }
+
+ enabled = true;
+ return ReturnCode.OK;
+ }
+
+ protected void dispose() {
+ parentFactory = null;
+ listener = null;
+ }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/EntityFactory.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/EntityFactory.java
new file mode 100644
index 000000000..41ae149b8
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/EntityFactory.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.entity;
+
+/**
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public interface EntityFactory {
+
+ /**
+ * Gets the enabled status.
+ *
+ * @return Returns <b>true </b> if this has been enabled, otherwise <b>false </b>.
+ */
+ public boolean isEnabled();
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/PublicationBuiltinTopicData.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/PublicationBuiltinTopicData.java
new file mode 100644
index 000000000..f42529229
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/PublicationBuiltinTopicData.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.entity;
+
+import org.eclipse.osee.ote.messaging.dds.listener.TopicListener;
+import org.eclipse.osee.ote.messaging.dds.service.TypeSignature;
+
+//UNSURE This class has not been implemented, but is called out in the spec
+
+/**
+ * This class is here for future functionality that is described in the DDS specification but has not been implemented
+ * or used.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class PublicationBuiltinTopicData extends Topic {
+
+ PublicationBuiltinTopicData(DomainParticipant participant, TypeSignature typeName, String name, String namespace, boolean enabled, TopicListener listener, EntityFactory parentFactory) {
+ super(participant, typeName, name, namespace, enabled, listener, parentFactory);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/Publisher.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/Publisher.java
new file mode 100644
index 000000000..16fee90aa
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/Publisher.java
@@ -0,0 +1,388 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.entity;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.eclipse.osee.ote.messaging.dds.Data;
+import org.eclipse.osee.ote.messaging.dds.DataSample;
+import org.eclipse.osee.ote.messaging.dds.DataStoreItem;
+import org.eclipse.osee.ote.messaging.dds.IDestination;
+import org.eclipse.osee.ote.messaging.dds.ISource;
+import org.eclipse.osee.ote.messaging.dds.NotImplementedException;
+import org.eclipse.osee.ote.messaging.dds.ReturnCode;
+import org.eclipse.osee.ote.messaging.dds.StatusKind;
+import org.eclipse.osee.ote.messaging.dds.listener.DataWriterListener;
+import org.eclipse.osee.ote.messaging.dds.listener.Listener;
+import org.eclipse.osee.ote.messaging.dds.listener.PublisherListener;
+import org.eclipse.osee.ote.messaging.dds.service.TopicDescription;
+
+/**
+ * Provides functionality for applications to create <code>DataWriter</code> 's, and control when data written from the
+ * writers is published.
+ * <p>
+ * This class also provides the middleware the ability to publish data directly (i.e. without a <code>DataWriter</code>
+ * ).
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class Publisher extends DomainEntity implements EntityFactory {
+
+ private final DomainParticipant participant;
+ private boolean publicationsAllowed;
+ private final CopyOnWriteArrayList<DataWriter> dataWriters;
+ private final Collection<DataStoreItem> publicationQueue; // Stores pending publications to be processed, possibly be a seperate thread
+ private final Collection<DataStoreItem> pendingQueue; // Stores publications while publications are suspended
+
+ /**
+ * Constructor for <code>Publisher</code> with the provided listener attached, and enabled status set as passed. This
+ * constructor is only visible to the DDS system, applications should use
+ * {@link DomainParticipant#createPublisher(PublisherListener)}to create a <code>Publisher</code>..
+ *
+ * @param participant The participant creating this <code>Publisher</code>. This is also used as the parentEntity for
+ * enabling purposes.
+ * @param enabled If <b>true </b>, the created <code>Publisher</code> will be enabled iff the parentEntity is
+ * enabled.
+ * @param listener The listener to attach to the created publisher.
+ */
+ Publisher(DomainParticipant participant, boolean enabled, PublisherListener listener) {
+ super(enabled, listener, participant);
+
+ this.participant = participant;
+ publicationsAllowed = true;
+ dataWriters = new CopyOnWriteArrayList<>();
+ publicationQueue = new ArrayList<>();
+ pendingQueue = new ArrayList<>();
+ }
+
+ /**
+ * Gets the attached listener.
+ *
+ * @return The <code>PublisherListener</code> attached to this.
+ * @see Entity#getBaseListener()
+ */
+ public PublisherListener getListener() {
+ return (PublisherListener) super.getBaseListener();
+ }
+
+ /**
+ * Sets the <code>PublisherListener</code> attached to this. If a listener is already set, this will replace it.
+ *
+ * @see Entity#setBaseListener(Listener, StatusKind)
+ */
+ public ReturnCode setListener(PublisherListener listener, StatusKind mask) {
+ return super.setBaseListener(listener, mask);
+ }
+
+ /**
+ * Creates a <code>DataWriter</code> for the given <code>Topic</code> and adds it to this <code>Publisher</code>.
+ *
+ * @param topic The <code>Topic</code> associated with the <code>DataWriter</code> to be created.
+ * @param listener The <code>DataWriterListener</code> to be attached to created <code>DataWriter</code>.
+ * @return The <code>DataWriter</code> created, or null if it could not be created.
+ */
+ public DataWriter createDataWriter(Topic topic, DataWriterListener listener) {
+ DataWriter dataWriter = null;
+
+ //TUNE - get the classloader & constructor during Topic creation instead of here
+ try {
+ // Class writerClass = topic.getTypeSignature().getClassLoader().loadClass(topic.getTypeSignature().getWriterName());
+ //
+ // Constructor constructor = writerClass.getConstructor(new Class[] {Topic.class, Publisher.class, Boolean.class, DataWriterListener.class,
+ // EntityFactory.class});
+
+ // dataWriter = (DataWriter) constructor.newInstance(new Object[] {topic, this, new Boolean(this.isEnabled()), listener, this});
+ dataWriter = new DataWriter(topic, this, new Boolean(this.isEnabled()), listener, this);
+ }
+ // catch (InstantiationException ex) {
+ // ex.printStackTrace();
+ // }
+ // catch (IllegalAccessException ex) {
+ // ex.printStackTrace();
+ // }
+ // catch (ClassNotFoundException ex) {
+ // ex.printStackTrace();
+ // }
+ catch (IllegalArgumentException ex) {
+ ex.printStackTrace();
+ } catch (SecurityException ex) {
+ ex.printStackTrace();
+ }
+ // catch (InvocationTargetException ex) {
+ // ex.printStackTrace();
+ // }
+ // catch (NoSuchMethodException ex) {
+ // ex.printStackTrace();
+ // }
+ catch (OutOfMemoryError er) {
+ er.printStackTrace();
+ }
+
+ // Only keep this writer if it was successfully created.
+ if (dataWriter != null) {
+ dataWriters.add(dataWriter);
+ }
+ return dataWriter;
+ }
+
+ /**
+ * Removes the <code>DataWriter</code> from this <code>Publisher</code>. If the writer was already deleted, or was
+ * not created by this <code>Publisher</code>, an error is returned.
+ *
+ * @param dataWriter The writer to delete.
+ * @return {@link ReturnCode#OK}if the writer was successfully deleted, otherwise {@link ReturnCode#NOT_ENABLED}if
+ * this <code>Publisher</code> is not enabled, or {@link ReturnCode#ALREADY_DELETED}if the writer has already been
+ * deleted, or {@link ReturnCode#PRECONDITION_NOT_MET}if dataWriter was not created by this <code>Publisher</code>.
+ */
+ public ReturnCode deleteDataWriter(DataWriter dataWriter) {
+
+ // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+ if (!isEnabled()) {
+ return ReturnCode.NOT_ENABLED;
+ }
+
+ // Check that the writer is not already marked as deleted (in case others kept a reference to it
+ if (dataWriter.isDeleted()) {
+ return ReturnCode.ALREADY_DELETED;
+ }
+
+ dataWriter.markAsDeleted();
+ if (dataWriters.remove(dataWriter)) {
+ return ReturnCode.OK;
+ } else {
+ // If the data writer wasn't found, then return PRECONDITION_NOT_MET
+ return ReturnCode.PRECONDITION_NOT_MET;
+ }
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public DataWriter lookupDataWriter(String topicName) {
+ // UNSURE This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+ return null;
+ }
+
+ /**
+ * Suspends published data from being processed (sent to the subscribers) until <code>resumePublications()</code> is
+ * called.
+ *
+ * @return {@link ReturnCode#OK}if publications are successfully suspended, or {@link ReturnCode#NOT_ENABLED}if this
+ * <code>Publisher</code> has not been enabled.
+ */
+ public ReturnCode suspendPublications() {
+
+ // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+ if (!isEnabled()) {
+ return ReturnCode.NOT_ENABLED;
+ }
+
+ publicationsAllowed = false;
+ return ReturnCode.OK;
+ }
+
+ /**
+ * Resumes publications that were suspended by calling <code>suspendPublications()</code>.
+ *
+ * @return {@link ReturnCode#OK}if publications are successfully suspended, or {@link ReturnCode#NOT_ENABLED}if this
+ * <code>Publisher</code> has not been enabled, or {@link ReturnCode#PRECONDITION_NOT_MET}if publications were not
+ * suspended.
+ */
+ public ReturnCode resumePublications() {
+
+ // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+ if (!isEnabled()) {
+ return ReturnCode.NOT_ENABLED;
+ }
+
+ if (publicationsAllowed) {
+ return ReturnCode.PRECONDITION_NOT_MET;
+ }
+
+ // Move the pending items in to the publishQueue
+ synchronized (pendingQueue) {
+ publicationQueue.addAll(pendingQueue);
+ pendingQueue.clear();
+
+ // Now that the queues have been updated, mark publications as allowed
+ publicationsAllowed = true;
+ }
+
+ publishQueuedData();
+
+ return ReturnCode.OK;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public ReturnCode beginCoherentChanges() {
+ // UNSURE This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+ if (!isEnabled()) {
+ return ReturnCode.NOT_ENABLED;
+ }
+
+ return ReturnCode.ERROR;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public ReturnCode endCoherentChanges() {
+ // UNSURE This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+ if (!isEnabled()) {
+ return ReturnCode.NOT_ENABLED;
+ }
+
+ return ReturnCode.ERROR;
+ }
+
+ /**
+ * @return the <code>DomainParticipant</code> to which this belongs.
+ */
+ public DomainParticipant getParticipant() {
+ // NOTE this method is part of the DDS spec.
+ return participant;
+ }
+
+ /**
+ * Deletes all of the <code>DataWriter</code> objects currently in this <code>Publisher</code>.
+ *
+ * @return {@link ReturnCode#OK}if the writers were successfully deleted, otherwise {@link ReturnCode#NOT_ENABLED}if
+ * this <code>Publisher</code> is not enabled.
+ */
+ public ReturnCode deleteContainedEntities() {
+
+ // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+ if (!isEnabled()) {
+ return ReturnCode.NOT_ENABLED;
+ }
+
+ for (DataWriter writer : dataWriters) {
+ writer.markAsDeleted();
+ }
+ dataWriters.clear();
+ return ReturnCode.OK;
+ }
+
+ /**
+ * @return <b>true </b> iff this <code>Publisher</code> currently has any data writers.
+ */
+ public boolean hasDataWriters() {
+ return !dataWriters.isEmpty();
+ }
+
+ /**
+ * Allows the MiddlewarePublisher to publish data without providing the <code>Topic</code> object, but instead
+ * specifying the Topic as a string. This method will only publish data when called by the
+ * <code>MiddlewarePublisher</code> of the <code>DomainParticipant</code>. This is intended for an outside System to
+ * be able to publish any data it wants, regardless of if the <code>Topic</code> has been created in the DDS system.
+ * If a <code>Topic</code> with the provided name does not exist in this publisher's <code>DomainParticipant</code>,
+ * the data will not be published.
+ *
+ * @param theData The Data to be published
+ * @param namespace The name of the Topic associated with theData
+ * @throws IllegalStateException When this method is called by any publisher other than the MiddlewarePublisher
+ */
+ public void publishData(Data theData, String namespace, String topic) {
+ if (theData == null) {
+ throw new NullPointerException("data cannot be null");
+ }
+ if (namespace == null) {
+ throw new NullPointerException("namespace cannot be null");
+ }
+ if (topic == null) {
+ throw new NullPointerException("topic cannot be null");
+ }
+ if (this.participant.getMiddlewarePublisher() == this) {
+ TopicDescription theTopicDescription = this.participant.lookupTopicDescription(namespace, topic);
+ if (theTopicDescription != null) {
+ DataSample dataSample = new DataSample(theData, new SampleInfo());
+ publishData(null, null, new DataStoreItem(dataSample, theTopicDescription, null));
+ }
+ } else {
+ // This should never be called by anything other than the middleware publisher, so throw an exception
+ throw new IllegalStateException("Must be the MiddlewarePublisher to call this method!");
+ }
+ }
+
+ /**
+ * If threading is enabled and publications are not suspended, places the data on the queue to be processed by the
+ * publication thread. If threading is not enabled and publications are not suspended, sends the data to the
+ * <code>DomainParticipant</code> to be sent to be immediately made available to the subscribers. If publications are
+ * suspended the data is queued so it can be processed once publications are resumed.
+ *
+ * @param destination TODO
+ * @param source TODO
+ * @param dataStoreItem The published data to be processed
+ */
+ void publishData(IDestination destination, ISource source, DataStoreItem dataStoreItem) { // package scope
+
+ // If publications are not allowed, then add the item to the queue, and return
+ synchronized (pendingQueue) {
+ if (!publicationsAllowed) {
+ pendingQueue.add(dataStoreItem);
+ return;
+ }
+ }
+
+ // Otherwise, publications are allowed, so process appropriately
+
+ participant.processPublishedData(destination, source, dataStoreItem);
+ }
+
+ /**
+ * Processes data queued either because we are using a publication thread or because publications were suspended and
+ * have now been resumed. In either case, the data queued is immediately ready to be published and will be completely
+ * processed even if publications are again suspended before processing has completed.
+ */
+ void publishQueuedData() { // package scope so that the publisher thread can make use of this
+ // Only process if there are items in the queue - don't do synchronize if not necessary
+ if (!publicationQueue.isEmpty()) {
+
+ synchronized (publicationQueue) {
+ Iterator<DataStoreItem> iter = publicationQueue.iterator();
+ while (iter.hasNext()) {
+ participant.processPublishedData(null, null, iter.next());
+ }
+ publicationQueue.clear();
+ }
+ }
+ }
+
+ public void dispose() {
+ if (deleteContainedEntities() == ReturnCode.NOT_ENABLED) {
+ System.err.println("failed to delete publisher");
+ }
+ publicationQueue.clear();
+ pendingQueue.clear();
+ }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/PublisherThread.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/PublisherThread.java
new file mode 100644
index 000000000..5bf03c7d6
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/PublisherThread.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.entity;
+
+import java.util.Collection;
+import java.util.Iterator;
+
+/**
+ * Provides threading capability for the publication of data. The DDS system makes use of this class internally and
+ * controls it as needed to control the publication of data.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+class PublisherThread extends Thread {
+ private final DomainParticipant domainParticipant;
+
+ /**
+ * Get a <code>PublisherThread</code> for a particular <code>DomainParticipant</code>
+ *
+ * @param domainParticipant - The participant for the thread to call upon
+ */
+ public PublisherThread(DomainParticipant domainParticipant) {
+ super("Publisher Thread");
+ this.domainParticipant = domainParticipant;
+ setDaemon(true);
+ }
+
+ @Override
+ public synchronized void run() {
+
+ try {
+ while (true) {
+ wait(); // Wait for a notify
+
+ // Once notified, call all the queue publishing
+ Collection<Publisher> publishers = domainParticipant.getPublishers();
+ synchronized (publishers) {
+ Iterator<Publisher> iter = publishers.iterator();
+ while (iter.hasNext()) {
+ iter.next().publishQueuedData();
+ }
+ }
+ }
+ } catch (InterruptedException ex) {
+ // We do not expect to be interrupted, so print the error
+ ex.printStackTrace();
+ }
+ }
+
+ /**
+ * Method to cause the thread to publish the queue'd information in each <code>Subscriber</code> then go back to
+ * sleep.
+ */
+ public synchronized void wakeUp() {
+ notifyAll();
+ }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/SampleInfo.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/SampleInfo.java
new file mode 100644
index 000000000..1c1897787
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/SampleInfo.java
@@ -0,0 +1,296 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.entity;
+
+import org.eclipse.osee.ote.messaging.dds.InstanceHandle;
+import org.eclipse.osee.ote.messaging.dds.InstanceStateKind;
+import org.eclipse.osee.ote.messaging.dds.NotImplementedException;
+import org.eclipse.osee.ote.messaging.dds.SampleStateKind;
+import org.eclipse.osee.ote.messaging.dds.Time;
+import org.eclipse.osee.ote.messaging.dds.ViewStateKind;
+
+/*
+ * NOTE: This class is in the same package as DataReader so that the setter methods
+ * on this class can have 'default'/'package' visibility, allowing only the
+ * DDS system classes modify the SampleInfo fields, and thusly causing the
+ * application using the DDS system to only be able to read the fields.
+ */
+
+/**
+ * Provides information about a sample of data. This class is not fully implemented, but is passed through the system
+ * with default values in the current implementation.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class SampleInfo {
+
+ public static final SampleInfo DEFAULT_SAMPLE_INFO = new SampleInfo(null, null, null, 0, 0, 0, 0, 0, null, null);
+
+ private SampleStateKind sampleStateKind;
+ private ViewStateKind viewStateKind;
+ private InstanceStateKind instanceStateKind;
+ private long disposeGenerationCount;
+ private long noWritersGenerationCount;
+ private long sampleRank;
+ private long generationRank;
+ private long absoluteGenerationRank;
+ private Time sourceTimestamp;
+ private InstanceHandle instanceHandle;
+
+ /**
+ * Create a <code>SampleInfo</code> with particular values for all of the state date.
+ */
+ public SampleInfo(SampleStateKind sampleStateKind, ViewStateKind viewStateKind, InstanceStateKind instanceStateKind, long disposeGenerationCount, long noWritersGenerationCount, long sampleRank, long generationRank, long absoluteGenerationRank, Time sourceTimestamp, InstanceHandle instanceHandle) {
+ super();
+ this.sampleStateKind = sampleStateKind;
+ this.viewStateKind = viewStateKind;
+ this.instanceStateKind = instanceStateKind;
+ this.disposeGenerationCount = disposeGenerationCount;
+ this.noWritersGenerationCount = noWritersGenerationCount;
+ this.sampleRank = sampleRank;
+ this.generationRank = generationRank;
+ this.absoluteGenerationRank = absoluteGenerationRank;
+ this.sourceTimestamp = sourceTimestamp;
+ this.instanceHandle = instanceHandle;
+ }
+
+ /**
+ * Create a <code>SampleInfo</code> with default values for all of the state data.
+ */
+ public SampleInfo() {
+ this(SampleStateKind.NOT_READ, ViewStateKind.NEW, InstanceStateKind.ALIVE, 0, 0, 0, 0, 0, new Time(),
+ new InstanceHandle());
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ *
+ * @return Returns the absoluteGenerationRank.
+ */
+ public long getAbsoluteGenerationRank() {
+ //DONT_NEED
+ if (true) {
+ throw new NotImplementedException();
+ }
+ return absoluteGenerationRank;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ *
+ * @return Returns the disposeGenerationCount.
+ */
+ public long getDisposeGenerationCount() {
+ //DONT_NEED
+ if (true) {
+ throw new NotImplementedException();
+ }
+ return disposeGenerationCount;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ *
+ * @return Returns the generationRank.
+ */
+ public long getGenerationRank() {
+ //DONT_NEED
+ if (true) {
+ throw new NotImplementedException();
+ }
+ return generationRank;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ *
+ * @return Returns the instanceHandle.
+ */
+ public InstanceHandle getInstanceHandle() {
+ //DONT_NEED
+ if (true) {
+ throw new NotImplementedException();
+ }
+ return instanceHandle;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ *
+ * @return Returns the instanceStateKind.
+ */
+ public InstanceStateKind getInstanceStateKind() {
+ //DONT_NEED
+ if (true) {
+ throw new NotImplementedException();
+ }
+ return instanceStateKind;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ *
+ * @return Returns the noWritersGenerationCount.
+ */
+ public long getNoWritersGenerationCount() {
+ //DONT_NEED
+ if (true) {
+ throw new NotImplementedException();
+ }
+ return noWritersGenerationCount;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ *
+ * @return Returns the sampleRank.
+ */
+ public long getSampleRank() {
+ //DONT_NEED
+ if (true) {
+ throw new NotImplementedException();
+ }
+ return sampleRank;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ *
+ * @return Returns the sampleStateKind.
+ */
+ public SampleStateKind getSampleStateKind() {
+ //DONT_NEED
+ if (true) {
+ throw new NotImplementedException();
+ }
+ return sampleStateKind;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ *
+ * @return Returns the sourceTimestamp.
+ */
+ public Time getSourceTimestamp() {
+ //DONT_NEED
+ if (true) {
+ throw new NotImplementedException();
+ }
+ return sourceTimestamp;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ *
+ * @return Returns the viewStateKind.
+ */
+ public ViewStateKind getViewStateKind() {
+ //DONT_NEED
+ if (true) {
+ throw new NotImplementedException();
+ }
+ return viewStateKind;
+ }
+
+ public void copyFrom(SampleInfo sampleInfo) {
+ this.sampleStateKind = sampleInfo.sampleStateKind;
+ this.viewStateKind = sampleInfo.viewStateKind;
+ this.instanceStateKind = sampleInfo.instanceStateKind;
+ this.disposeGenerationCount = sampleInfo.disposeGenerationCount;
+ this.noWritersGenerationCount = sampleInfo.noWritersGenerationCount;
+ this.sampleRank = sampleInfo.sampleRank;
+ this.generationRank = sampleInfo.generationRank;
+ this.absoluteGenerationRank = sampleInfo.absoluteGenerationRank;
+ this.sourceTimestamp.copyFrom(sampleInfo.sourceTimestamp);
+ this.instanceHandle.copyFrom(sampleInfo.instanceHandle);
+ }
+
+ /**
+ * @param absoluteGenerationRank The absoluteGenerationRank to set.
+ */
+ void setAbsoluteGenerationRank(long absoluteGenerationRank) {
+ this.absoluteGenerationRank = absoluteGenerationRank;
+ }
+
+ /**
+ * @param disposeGenerationCount The disposeGenerationCount to set.
+ */
+ void setDisposeGenerationCount(long disposeGenerationCount) {
+ this.disposeGenerationCount = disposeGenerationCount;
+ }
+
+ /**
+ * @param generationRank The generationRank to set.
+ */
+ void setGenerationRank(long generationRank) {
+ this.generationRank = generationRank;
+ }
+
+ /**
+ * @param instanceHandle The instanceHandle to set.
+ */
+ void setInstanceHandle(InstanceHandle instanceHandle) {
+ this.instanceHandle = instanceHandle;
+ }
+
+ /**
+ * @param instanceStateKind The instanceStateKind to set.
+ */
+ void setInstanceStateKind(InstanceStateKind instanceStateKind) {
+ this.instanceStateKind = instanceStateKind;
+ }
+
+ /**
+ * @param noWritersGenerationCount The noWritersGenerationCount to set.
+ */
+ void setNoWritersGenerationCount(long noWritersGenerationCount) {
+ this.noWritersGenerationCount = noWritersGenerationCount;
+ }
+
+ /**
+ * @param sampleRank The sampleRank to set.
+ */
+ void setSampleRank(long sampleRank) {
+ this.sampleRank = sampleRank;
+ }
+
+ /**
+ * @param sampleStateKind The sampleStateKind to set.
+ */
+ void setSampleStateKind(SampleStateKind sampleStateKind) {
+ this.sampleStateKind = sampleStateKind;
+ }
+
+ /**
+ * @param sourceTimestamp The sourceTimestamp to set.
+ */
+ void setSourceTimestamp(Time sourceTimestamp) {
+ this.sourceTimestamp = sourceTimestamp;
+ }
+
+ /**
+ * @param viewStateKind The viewStateKind to set.
+ */
+ void setViewStateKind(ViewStateKind viewStateKind) {
+ this.viewStateKind = viewStateKind;
+ }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/Subscriber.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/Subscriber.java
new file mode 100644
index 000000000..6cd649047
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/Subscriber.java
@@ -0,0 +1,337 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.entity;
+
+import java.util.Collection;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import org.eclipse.osee.ote.messaging.dds.DataStoreItem;
+import org.eclipse.osee.ote.messaging.dds.NotImplementedException;
+import org.eclipse.osee.ote.messaging.dds.ReturnCode;
+import org.eclipse.osee.ote.messaging.dds.StatusKind;
+import org.eclipse.osee.ote.messaging.dds.listener.DataReaderListener;
+import org.eclipse.osee.ote.messaging.dds.listener.Listener;
+import org.eclipse.osee.ote.messaging.dds.listener.SubscriberListener;
+import org.eclipse.osee.ote.messaging.dds.service.TopicDescription;
+import org.eclipse.osee.ote.messaging.dds.status.SampleLostStatus;
+
+/**
+ * Provides functionality for applications to create <code>DataReader</code>'s to receive the appropriate published
+ * data. Maintains the data which is made available to those <code>DataReader</code> 's.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class Subscriber extends DomainEntity implements EntityFactory {
+
+ private final ConcurrentHashMap<TopicDescription, CopyOnWriteArrayList<DataReader>> topicMap =
+ new ConcurrentHashMap<TopicDescription, CopyOnWriteArrayList<DataReader>>(512);
+ private final DomainParticipant participant;
+ private final ExecutorService threadService;
+
+ /**
+ * Constructor for <code>Subscriber</code> with the provided listener attached, and enabled status set as passed.
+ * This constructor is only visible to the DDS system, applications should use
+ * {@link DomainParticipant#createSubscriber(SubscriberListener)}to create a <code>Subscriber</code>.
+ *
+ * @param participant The participant creating this <code>Subscriber</code>. This is also used as the parentEntity
+ * for enabling purposes.
+ * @param enabled If <b>true </b>, the created <code>Subscriber</code> will be enabled iff the parentEntity is
+ * enabled.
+ * @param listener The listener to attach to the created subscriber.
+ */
+ Subscriber(DomainParticipant participant, boolean enabled, Listener listener) {
+ super(enabled, listener, participant);
+ this.participant = participant;
+ threadService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1);
+ }
+
+ /**
+ * Gets the attached listener.
+ *
+ * @return The <code>SubscriberListener</code> attached to this.
+ * @see Entity#getBaseListener()
+ */
+ public SubscriberListener getListener() {
+ return (SubscriberListener) super.getBaseListener();
+ }
+
+ /**
+ * Sets the <code>SubscriberListener</code> attached to this. If a listener is already set, this will replace it.
+ *
+ * @see Entity#setBaseListener(Listener, StatusKind)
+ */
+ public ReturnCode setListener(SubscriberListener listener, StatusKind mask) {
+ return super.setBaseListener(listener, mask);
+ }
+
+ /**
+ * Creates a <code>DataReader</code> for the given <code>Topic</code> and adds it to this <code>Subscriber</code>.
+ *
+ * @param topicDescription The <code>Topic</code> associated with the <code>DataReader</code> to be created.
+ * @param listener The <code>DataReaderListener</code> to be attached to the created <code>DataReader</code>.
+ * @return The <code>DataReader</code> created, or null if it could not be created.
+ */
+ public DataReader createDataReader(TopicDescription topicDescription, DataReaderListener listener) {
+ DataReader dataReader = null;
+
+ if (true != topicDescription instanceof Topic) {
+ return null;
+ }
+
+ //TUNE - get the classloader & constructor during Topic creation instead of here
+ try {
+ // Class readerClass = topic.getTypeSignature().getClassLoader().loadClass(topic.getTypeSignature().getReaderName());
+ //
+ // Constructor constructor = readerClass.getConstructor(new Class[] {TopicDescription.class, Subscriber.class, Boolean.class, DataReaderListener.class,
+ // EntityFactory.class});
+ //
+ // dataReader = (DataReader) constructor.newInstance(new Object[] {topicDescription, this, new Boolean(this.isEnabled()), listener, this});
+
+ dataReader = new DataReader(topicDescription, this, new Boolean(this.isEnabled()), listener, this);
+ }
+ // catch (InstantiationException ex) {
+ // ex.printStackTrace();
+ // }
+ // catch (IllegalAccessException ex) {
+ // ex.printStackTrace();
+ // }
+ // catch (ClassNotFoundException ex) {
+ // ex.printStackTrace();
+ // }
+ catch (IllegalArgumentException ex) {
+ ex.printStackTrace();
+ } catch (SecurityException ex) {
+ ex.printStackTrace();
+ }
+ // catch (InvocationTargetException ex) {
+ // ex.printStackTrace();
+ // }
+ // catch (NoSuchMethodException ex) {
+ // ex.printStackTrace();
+ // }
+ catch (OutOfMemoryError er) {
+ er.printStackTrace();
+ }
+
+ // Only keep this writer if it was successfully created.
+ if (dataReader != null) {
+ CopyOnWriteArrayList<DataReader> readers = topicMap.get(topicDescription);
+ if (readers == null) {
+ readers = new CopyOnWriteArrayList<>();
+ topicMap.put(topicDescription, readers);
+ }
+ readers.add(dataReader);
+ }
+ return dataReader;
+ }
+
+ /**
+ * Removes the <code>DataReader</code> from this <code>Subscriber</code>. If the reader was already deleted, or was
+ * not created by this <code>Subscriber</code>, an error is returned.
+ *
+ * @param dataReader The reader to delete.
+ * @return {@link ReturnCode#OK}if the reader was successfully deleted, otherwise {@link ReturnCode#NOT_ENABLED}if
+ * this <code>Subscriber</code> is not enabled, or {@link ReturnCode#ALREADY_DELETED}if the reader has already been
+ * deleted, or {@link ReturnCode#PRECONDITION_NOT_MET}if dataReader was not created by this <code>Subscriber</code>.
+ */
+ public ReturnCode deleteDataReader(DataReader dataReader) {
+
+ // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+ if (!isEnabled()) {
+ return ReturnCode.NOT_ENABLED;
+ }
+
+ // Check that the writer is not already marked as deleted (in case others kept a reference to it
+ if (dataReader.isDeleted()) {
+ return ReturnCode.ALREADY_DELETED;
+ }
+
+ // boolean found = dataReaders.remove(dataReader);
+
+ if (topicMap.remove(dataReader.getTopicDescription()) != null) {
+ dataReader.markAsDeleted();
+ return ReturnCode.OK;
+ } else {
+ return ReturnCode.PRECONDITION_NOT_MET;
+ }
+
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public DataReader lookupDataReader(String topicName) {
+ // UNSURE This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+ return null;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public ReturnCode beginAccess() {
+ // DONT_NEED This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+ if (!isEnabled()) {
+ return ReturnCode.NOT_ENABLED;
+ }
+
+ return ReturnCode.ERROR;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public ReturnCode endAccess() {
+ // DONT_NEED This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+ if (!isEnabled()) {
+ return ReturnCode.NOT_ENABLED;
+ }
+
+ return ReturnCode.ERROR;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public ReturnCode getDataReaders(Collection<DataReader> dataReaders, Collection<?> sampleStateKind, Collection<?> viewStateKind, Collection<?> instanceStateKind) {
+ // UNSURE This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+ if (!isEnabled()) {
+ return ReturnCode.NOT_ENABLED;
+ }
+
+ return ReturnCode.ERROR;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public void notifyDataReaders() {
+ // UNSURE This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public SampleLostStatus getSampleLostStatus() {
+ // UNSURE This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+ return null;
+ }
+
+ /**
+ * @return the <code>DomainParticipant</code> to which this belongs.
+ */
+ public DomainParticipant getParticipant() {
+ // NOTE this method is part of the DDS spec.
+ return participant;
+ }
+
+ /**
+ * Deletes all of the <code>DataReader</code> objects currently in this <code>Subscriber</code>.
+ *
+ * @return {@link ReturnCode#OK}if the readers were successfully deleted, otherwise {@link ReturnCode#NOT_ENABLED}if
+ * this <code>Subscriber</code> is not enabled.
+ */
+ public ReturnCode deleteContainedEntities() {
+ /*
+ * PARTIAL per the DDS spec, this should also delete the ReadCondition and QueryCondition objects stored in the
+ * <code> DataReader </code> 's, however because we haven't implemented the conditions they are not deleted here.
+ */
+
+ // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
+ if (!isEnabled()) {
+ return ReturnCode.NOT_ENABLED;
+ }
+
+ for (CopyOnWriteArrayList<DataReader> readers : topicMap.values()) {
+ for (DataReader reader : readers) {
+ reader.markAsDeleted();
+ }
+ readers.clear();
+ }
+ topicMap.clear();
+ return ReturnCode.OK;
+ }
+
+ /**
+ * @return <b>true </b> iff this <code>Subscriber</code> currently has any data readers.
+ */
+ public boolean hasDataReaders() {
+ return !topicMap.isEmpty();
+ }
+
+ /**
+ * Processes new data received. If this Subscriber has at least one DataReader who is interested in this data, and
+ * the <code>Subscriber</code> has an attached listener, notify it via
+ * {@link SubscriberListener#onDataOnReaders(CopyOfSubscriber)}. Otherwise, if there is no
+ * <code>SubscriberListener</code> then notify all of the interested <code>DataReader</code>'s via
+ * {@link DataReaderListener#onDataAvailable(DataReader)}. The data is stored so that it is available for a reader to
+ * read or take.
+ *
+ * @param dataStoreItem The newly published data.
+ */
+ void processNewData(final DataStoreItem dataStoreItem) { // This has package scope since it is a system-level type call
+ final Collection<DataReader> readers = topicMap.get(dataStoreItem.getTheTopicDescription());
+ if (readers != null && !readers.isEmpty()) {
+
+ // SPEC NOTE: The following listener logic is based on paragraph "Listener access to Read Communication Status"
+ // in the DDS specification.
+
+ // Invoke the SubscriberListener if available
+ SubscriberListener listener = getListener();
+ if (listener != null) {
+ listener.onDataOnReaders(this);
+
+ // Otherwise, invoke the DataReaderListeners
+ } else {
+ // Check all DataReader objects for listeners
+ for (final DataReader reader : readers) {
+ reader.processNewData(dataStoreItem);
+ /*
+ * threadService.submit(new Runnable() { public void run() { reader.processNewData(dataStoreItem); } });
+ */
+
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/SubscriptionBuiltinTopicData.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/SubscriptionBuiltinTopicData.java
new file mode 100644
index 000000000..f456d71d0
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/SubscriptionBuiltinTopicData.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.entity;
+
+import org.eclipse.osee.ote.messaging.dds.listener.TopicListener;
+import org.eclipse.osee.ote.messaging.dds.service.TypeSignature;
+
+//UNSURE This class has not been implemented, but is called out in the spec
+
+/**
+ * This class is here for future functionality that is described in the DDS specification but has not been implemented
+ * or used.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class SubscriptionBuiltinTopicData extends Topic {
+
+ SubscriptionBuiltinTopicData(DomainParticipant participant, TypeSignature typeName, String name, String namespace, boolean enabled, TopicListener listener, EntityFactory parentFactory) {
+ super(participant, typeName, name, namespace, enabled, listener, parentFactory);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/Topic.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/Topic.java
new file mode 100644
index 000000000..37beb79c3
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/Topic.java
@@ -0,0 +1,226 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 20079 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.entity;
+
+import java.util.Collection;
+import java.util.Vector;
+import org.eclipse.osee.ote.messaging.dds.ReturnCode;
+import org.eclipse.osee.ote.messaging.dds.StatusKind;
+import org.eclipse.osee.ote.messaging.dds.listener.TopicListener;
+import org.eclipse.osee.ote.messaging.dds.service.TopicDescription;
+import org.eclipse.osee.ote.messaging.dds.service.TypeSignature;
+import org.eclipse.osee.ote.messaging.dds.status.InconsistentTopicStatus;
+
+/**
+ * Created on May 16, 2005 Provides a basic implementation of the <code>TopicDescription</code> interface for basic
+ * topic support in the DDS system.
+ *
+ * @see org.eclipse.osee.ote.messaging.dds.service.TopicDescription
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class Topic extends DomainEntity implements TopicDescription {
+
+ private int count; // Keeps track of the number of times this Topic was "created"
+ private InconsistentTopicStatus inconsistentTopicStatus;
+ private final Collection<DataReader> dataReaders;
+ private final Collection<DataWriter> dataWriters;
+
+ // Local variables to implement the TopicDescription interface
+ private final DomainParticipant participant;
+ private final TypeSignature typeSignature;
+ private final String name;
+ private final String namespace;
+
+ /**
+ * Creates a topic with all of the necessary information. This constructor is only visible to the DDS system,
+ * applications should use {@link DomainParticipant#createTopic(String, String, TopicListener)} to create a Topic.
+ */
+ Topic(DomainParticipant participant, TypeSignature typeName, String name, String namespace, boolean enabled, TopicListener listener, EntityFactory parentFactory) {
+ super(enabled, listener, parentFactory);
+
+ this.participant = participant;
+ this.typeSignature = typeName;
+ this.name = name;
+ this.namespace = namespace;
+
+ dataReaders = new Vector<>();
+ dataWriters = new Vector<>();
+ count = 1;
+ }
+
+ /**
+ * @return Returns the name.
+ */
+ @Override
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * @return Returns the participant.
+ */
+ @Override
+ public DomainParticipant getParticipant() {
+ return participant;
+ }
+
+ /**
+ * @return Returns the typeName.
+ */
+ @Override
+ public String getTypeName() {
+ return typeSignature.getTypeName();
+ }
+
+ /**
+ * @return Returns the typeSignature.
+ */
+ public TypeSignature getTypeSignature() {
+ return typeSignature;
+ }
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public InconsistentTopicStatus getInconsistentTopicStatus() {
+ return inconsistentTopicStatus;
+ }
+
+ /**
+ * Returns the count for how many times this topic has been "created". This is done to meet the requirement of the
+ * DDS specification that a <code>Topic</code> must be deleted as many times as it was created or found via (@link
+ * DomainParticipant#findTopic(String, Duration)}.
+ *
+ * @return integer count of the creations of this topic.
+ */
+ int getCount() {
+ return count;
+ }
+
+ /**
+ * Increment the creation count for this topic. The DDS system calls this internally each time this is necessary per
+ * the DDS specification.
+ */
+ void incrementCount() {
+ count++;
+ }
+
+ /**
+ * Decrement the creation count for this topic. The DDS system calls this internally each time this
+ * <code>Topic</code> is passed to {@link DomainParticipant#deleteTopic(Topic)}. When the count reaches zero, then
+ * the DDS system knows it can be deleted.
+ */
+ void decrementCount() {
+ count--;
+ }
+
+ /**
+ * Retrieve access to the listener assigned to this <code>Topic</code>. The topic is not guaranteed to have a
+ * listener, so this method may return <b>null</b>, and the user of this method should handle that appropriately.
+ */
+ public TopicListener getListener() {
+ return (TopicListener) super.getBaseListener();
+ }
+
+ /**
+ * Set the listener for this <code>Topic</code>. If another listener was already assigned then it will be overridden
+ * with out any error. Additionally, <b>null</b> may be passed as the listener to remove the current listener from
+ * this topic.
+ *
+ * @param listener - The listener to invoke when events occur.
+ * @param mask - Not implemented, <b>null</b> is acceptable.
+ * @return {@link ReturnCode#OK}
+ */
+ public ReturnCode setListener(TopicListener listener, StatusKind mask) {
+ return super.setBaseListener(listener, mask);
+ }
+
+ /**
+ * @return true if this Topic is being used by a DataReader
+ */
+ boolean hasDataReaders() {
+ return !dataReaders.isEmpty();
+ }
+
+ /**
+ * @return true if this Topic is being used by a DataWriter
+ */
+ boolean hasDataWriters() {
+ return !dataWriters.isEmpty();
+ }
+
+ /**
+ * Used so the topic can keep track of the DataReaders that are created using this Topic. When the DataReader is
+ * deleted, it should call removeDataReader.
+ *
+ * @param reader The DataReader that added this topic
+ */
+ void addDataReader(DataReader reader) {
+ dataReaders.add(reader);
+ }
+
+ /**
+ * Used so the topic can keep track of the DataWriters that are created using this Topic. When the DataReader is
+ * deleted, it should call removeDataWriter.
+ *
+ * @param writer The DataWriter that added this topic
+ */
+ void addDataWriter(DataWriter writer) {
+ dataWriters.add(writer);
+ }
+
+ /**
+ * Used so the topic can keep track of the DataReaders that are created using this Topic.
+ *
+ * @param reader The DataReader that was deleted and used this Topic
+ */
+ void removeDataReader(DataReader reader) {
+ dataReaders.remove(reader);
+ }
+
+ /**
+ * Used so the topic can keep track of the DataWriters that are created using this Topic.
+ *
+ * @param writer The DataWriter that was deleted and used this Topic
+ */
+ void removeDataWriter(DataWriter writer) {
+ dataWriters.remove(writer);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof Topic) {
+ Topic topic = (Topic) obj;
+ return name.equals(topic.getName()) && namespace.equals(topic.getNamespace());
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return name.hashCode() ^ namespace.hashCode();
+ }
+
+ @Override
+ public String getNamespace() {
+ return this.namespace;
+ }
+
+ public void clearDataWriters() {
+ dataWriters.clear();
+ }
+
+ public void clearDataReaders() {
+ dataReaders.clear();
+ }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/package.html b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/package.html
new file mode 100644
index 000000000..47bbc8b99
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/package.html
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+</head>
+<body bgcolor="white">
+
+
+Provides all of descendants of {@link osee.messaging.dds.entity.Entity} class, classes immediately controlled by these classes, and their factories.
+
+<!-- Put @see and @since tags down here. -->
+
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/DataReaderListener.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/DataReaderListener.java
new file mode 100644
index 000000000..60b971dab
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/DataReaderListener.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.listener;
+
+import org.eclipse.osee.ote.messaging.dds.entity.DataReader;
+import org.eclipse.osee.ote.messaging.dds.status.LivelinessChangedStatus;
+import org.eclipse.osee.ote.messaging.dds.status.RequestedDeadlineMissedStatus;
+import org.eclipse.osee.ote.messaging.dds.status.RequestedIncompatibleQosStatus;
+import org.eclipse.osee.ote.messaging.dds.status.SampleLostStatus;
+import org.eclipse.osee.ote.messaging.dds.status.SampleRejectedStatus;
+import org.eclipse.osee.ote.messaging.dds.status.SubscriptionMatchStatus;
+
+/**
+ * The interface for receiving events from a particular <code>DataReader</code>.
+ *
+ * @see org.eclipse.osee.ote.messaging.dds.entity.DataReader
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public interface DataReaderListener extends Listener {
+
+ /**
+ * The method called when data is available for a <code>DataReader</code>. This method is only called if there is no
+ * <code>SubscriberListener</code> assigned to the <code>Subscriber</code> that created the <code>DataReader</code>.
+ *
+ * @param theReader - The reader for which data is available.
+ */
+ public void onDataAvailable(DataReader theReader);
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public void onSampleRejected(DataReader theReader, SampleRejectedStatus status);
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public void onLivelinessChanged(DataReader theReader, LivelinessChangedStatus status);
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public void onRequestedDeadlineMissed(DataReader theReader, RequestedDeadlineMissedStatus status);
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public void onRequestedIncompatibleQos(DataReader theReader, RequestedIncompatibleQosStatus status);
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public void onSubscriptionMatch(DataReader theReader, SubscriptionMatchStatus status);
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public void onSampleLost(DataReader theReader, SampleLostStatus status);
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/DataWriterListener.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/DataWriterListener.java
new file mode 100644
index 000000000..0ca9f1c14
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/DataWriterListener.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.listener;
+
+import org.eclipse.osee.ote.messaging.dds.entity.DataWriter;
+import org.eclipse.osee.ote.messaging.dds.status.LivelinessLostStatus;
+import org.eclipse.osee.ote.messaging.dds.status.OfferedDeadlineMissedStatus;
+import org.eclipse.osee.ote.messaging.dds.status.OfferedIncompatibleQosStatus;
+import org.eclipse.osee.ote.messaging.dds.status.PublicationMatchStatus;
+
+/**
+ * The interface for receiving events from <code>DataWriter</code>'s.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public interface DataWriterListener extends Listener {
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public void onLivelinessLost(DataWriter theWriter, LivelinessLostStatus status);
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public void onOfferedDeadlineMissed(DataWriter theWriter, OfferedDeadlineMissedStatus status);
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public void onOfferedIncompatibleQos(DataWriter theWriter, OfferedIncompatibleQosStatus status);
+
+ /**
+ * This method is here for future functionality that is described in the DDS specification but has not been
+ * implemented or used.
+ */
+ public void onPublicationMatch(DataWriter theWriter, PublicationMatchStatus status);
+
+ /**
+ * This method is called when information for a <code>DataWriter</code> has been sent to the middleware.
+ *
+ * @param theWriter - The <code>DataWriter</code> who's information was sent.
+ */
+ public void onDataSentToMiddleware(DataWriter theWriter);
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/DomainParticipantListener.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/DomainParticipantListener.java
new file mode 100644
index 000000000..557e43db0
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/DomainParticipantListener.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.listener;
+
+import org.eclipse.osee.ote.messaging.dds.DataStoreItem;
+import org.eclipse.osee.ote.messaging.dds.IDestination;
+import org.eclipse.osee.ote.messaging.dds.ISource;
+
+/**
+ * The interface for receiving events from the <code>DomainParticipant</code>. This class also extends the
+ * <code>TopicListener</code>, <code>SubscriberListener</code>, and <code>PublisherListener</code>.
+ *
+ * @see org.eclipse.osee.ote.messaging.dds.entity.DomainParticipant
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public interface DomainParticipantListener extends TopicListener, SubscriberListener, PublisherListener {
+
+ /**
+ * The method called whenever data is published within the DDS system. This can be used by the listening object to
+ * propogate information out to local entities running DDS.
+ *
+ * @param destination TODO
+ * @param source TODO
+ * @param dataStoreItem - The published information.
+ */
+ public void onPublishNotifyMiddleware(IDestination destination, ISource source, DataStoreItem dataStoreItem);
+
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/Listener.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/Listener.java
new file mode 100644
index 000000000..7c1688bbf
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/Listener.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.listener;
+
+/**
+ * This is the base interface for all of the DDS listener interfaces. The sole purpose of this interface is to provide a
+ * common root for all of the DDS listener interfaces.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public interface Listener {
+
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/PublisherListener.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/PublisherListener.java
new file mode 100644
index 000000000..1f71cd8a4
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/PublisherListener.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.listener;
+
+/**
+ * This class is here for future functionality that is described in the DDS specification but has not been implemented
+ * or used.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public interface PublisherListener extends DataWriterListener {
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/SubscriberListener.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/SubscriberListener.java
new file mode 100644
index 000000000..177c41a02
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/SubscriberListener.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.listener;
+
+import org.eclipse.osee.ote.messaging.dds.entity.Subscriber;
+
+/**
+ * The listener interface for receiving notification that data is available to <code>DataReader</code> objects in a
+ * <code>Subscriber</code>.
+ *
+ * @see org.eclipse.osee.ote.messaging.dds.entity.Subscriber
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public interface SubscriberListener extends DataReaderListener {
+
+ /**
+ * This is the first listener invoked when data becomes available. A reference to the <code>Subscriber</code> with
+ * available information is passed to the method.
+ */
+ public void onDataOnReaders(Subscriber theSubscriber);
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/TopicListener.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/TopicListener.java
new file mode 100644
index 000000000..a698c3c05
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/TopicListener.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.listener;
+
+import org.eclipse.osee.ote.messaging.dds.entity.Topic;
+import org.eclipse.osee.ote.messaging.dds.status.InconsistentTopicStatus;
+
+/**
+ * This class is here for future functionality that is described in the DDS specification but has not been implemented
+ * or used.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public interface TopicListener extends Listener {
+ public void onInconsistentTopic(Topic theTopic, InconsistentTopicStatus status);
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/package.html b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/package.html
new file mode 100644
index 000000000..66cee2586
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/listener/package.html
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+</head>
+<body bgcolor="white">
+
+
+Provides all of the listener interfaces supported by the DDS system.
+
+<!-- Put @see and @since tags down here. -->
+
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/package.html b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/package.html
new file mode 100644
index 000000000..d4782bc33
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/package.html
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+</head>
+<body bgcolor="white">
+
+
+Provides the basic classes for the system, such as utility and miscellaneous classes.
+
+<!-- Put @see and @since tags down here. -->
+
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/qos/QosPolicy.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/qos/QosPolicy.java
new file mode 100644
index 000000000..06f2ad65f
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/qos/QosPolicy.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.qos;
+
+import org.eclipse.osee.ote.messaging.dds.NotImplementedException;
+
+/**
+ * This class is here for future functionality that is described in the DDS specification but has not been implemented
+ * or used.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class QosPolicy {
+ public final static QosPolicy USERDATA_QOS_POLICY = new QosPolicy("UserData", 1);
+
+ private final String policyName;
+ private final long policyId;
+
+ private QosPolicy(String policyName, long policyId) {
+ // DONT_NEED This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+ this.policyName = policyName;
+ this.policyId = policyId;
+ }
+
+ public String getPolicyName() {
+ // DONT_NEED This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ return policyName;
+ }
+
+ public long getPolicyId() {
+ // DONT_NEED This method has not been implemented, but is called out in the spec
+ if (true) {
+ throw new NotImplementedException();
+ }
+
+ return policyId;
+ }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/qos/package.html b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/qos/package.html
new file mode 100644
index 000000000..1bb4ec69d
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/qos/package.html
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+</head>
+<body bgcolor="white">
+
+
+Provides the Quality of Service support classes.
+
+<!-- Put @see and @since tags down here. -->
+
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/DomainId.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/DomainId.java
new file mode 100644
index 000000000..c248f7cd3
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/DomainId.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.service;
+
+/**
+ * Stores the data necessary to discern virtual DDS networks within a physical network.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class DomainId {
+ private final long id;
+
+ /**
+ * @param id - The id value for this <code>DomainId</code>.
+ */
+ public DomainId(long id) {
+ super();
+ this.id = id;
+ }
+
+ /**
+ * @return Returns the id.
+ */
+ public long getId() {
+ return id;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+
+ if (obj instanceof DomainId) {
+ DomainId domainId = (DomainId) obj;
+ return domainId.id == this.id;
+ }
+
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = 17;
+ result = 1313723 * result + (int) (id ^ id >>> 32);
+
+ return result;
+ }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/Key.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/Key.java
new file mode 100644
index 000000000..f63531ec9
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/Key.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.service;
+
+/**
+ * Provides the DDS system with a means of recognizing multiple instances of one type. Users of the DDS system should
+ * provide an object that implements this interface for topics which may have multiple instances.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public interface Key {
+
+ /**
+ * This method returns true iff the information in both sets of data represent the same instance. This method should
+ * be commutative, that is, isSameInstance(A,B) should always return the same value as isSameInstance(B,A).
+ *
+ * @return <b>true</b> if the data values are the same instance, <b>false</b> otherwise.
+ */
+ public boolean isSameInstance(byte[] data1, byte[] data2);
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/TopicDescription.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/TopicDescription.java
new file mode 100644
index 000000000..defaf4298
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/TopicDescription.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.service;
+
+import org.eclipse.osee.ote.messaging.dds.entity.DomainParticipant;
+
+/**
+ * Provides a description of all topic classes. Any class that is a topic of some sort should implement this interface.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public interface TopicDescription {
+
+ /**
+ * The method which will supply the name used to create the topic.
+ *
+ * @return A string representation of the topic name.
+ */
+ public String getName();
+
+ /**
+ * The method which will return a reference to the <code>DomainParticipant</code> which created the topic.
+ *
+ * @return The <code>DomainParticipant</code> that created this topic.
+ */
+ public DomainParticipant getParticipant();
+
+ /**
+ * The method which will supply the type name used to create the topic.
+ *
+ * @return A string representation of the type name.
+ */
+ public String getTypeName();
+
+ public String getNamespace();
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/TypeRegistry.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/TypeRegistry.java
new file mode 100644
index 000000000..9d8507850
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/TypeRegistry.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.service;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.osee.ote.messaging.dds.ReturnCode;
+
+/**
+ * Provides registration functionality of types that are used in the DDS system. The registry relies on a hash map for
+ * optimum performance tuning which can be done via the parameters to the constructor. The registry acts as the
+ * authority for types by keeping track of <code>TypeSignature</code>'s.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class TypeRegistry {
+ private final Map<String, TypeSignature> typeHash;
+
+ /**
+ * Create a new <code>TypeRegistry</code> with particular characteristics. This is used by portions of the DDS system
+ * for resolving necessary information about types during run time.
+ *
+ * @param initialCapacity The initial capacity to create the hash map with
+ * @param loadFactor The load factor for the hash map. This specifies how full the map can get before more memory is
+ * allocated for the map.
+ */
+ public TypeRegistry(int initialCapacity, float loadFactor) {
+ super();
+ typeHash = Collections.synchronizedMap(new HashMap<String, TypeSignature>(initialCapacity, loadFactor));
+ }
+
+ /**
+ * Register a <code>TypeSignature</code> with the registry.
+ *
+ * @see TypeSignature
+ * @param signature The signature of the type to register.
+ * @return OK if the type was registered. OUT_OF_RESOURCES if a memory error happened, or PRECONDITION_NOT_MET if the
+ * signature conflicts with one already registered.
+ */
+ public ReturnCode register(TypeSignature signature) {
+ ReturnCode retCode = ReturnCode.OK;
+
+ TypeSignature checkSignature = typeHash.get(signature.getTypeName());
+ // If the signature was not already registered, then add it.
+ if (checkSignature == null) {
+ try {
+ typeHash.put(signature.getTypeName(), signature);
+ } catch (OutOfMemoryError er) {
+ er.printStackTrace();
+ retCode = ReturnCode.OUT_OF_RESOURCES;
+ }
+
+ // If the signature was already registered, then make sure the signature is the same
+ } else {
+ if (!checkSignature.equals(signature)) {
+ retCode = ReturnCode.PRECONDITION_NOT_MET;
+ }
+ }
+
+ return retCode;
+ }
+
+ /**
+ * Provides the signature for a type with a particular name.
+ *
+ * @param typeName The name of the type to lookup
+ * @return The appropriate signature for the name as registered with the registry, null if no such signature exists.
+ */
+ public TypeSignature lookupSignature(String typeName) {
+ return typeHash.get(typeName);
+ }
+
+ public void clear() {
+ typeHash.clear();
+ }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/TypeSignature.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/TypeSignature.java
new file mode 100644
index 000000000..e79621048
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/TypeSignature.java
@@ -0,0 +1,109 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.service;
+
+import java.lang.ref.WeakReference;
+
+/**
+ * Provides the necessary information to communicate type information for messaging within the DDS system. This allows
+ * the DDS system to be introduced to new types at run time, and be able to handle them properly.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class TypeSignature {
+ private final String typeName;
+ private final int typeDataSize;
+ private final WeakReference<Key> key;
+ private final String readerName;
+ private final String writerName;
+ private final WeakReference<ClassLoader> classLoader;
+
+ /**
+ * Create a <code>TypeSignature</code> with all of the necessary information.
+ *
+ * @param typeName The name used to reference this type.
+ * @param typeDataSize The full size in bytes of this type when transmitted.
+ * @param key The <code>Key</code> used to distinguish instances of data for this type.
+ * @param readerName The name used to load the reader class for this type from the supplied class loader
+ * @param writerName The name used to load the reader class for this type from the supplied class loader
+ * @param classLoader The class loader which can load the reader and writer for this type
+ */
+ public TypeSignature(String typeName, int typeDataSize, Key key, String readerName, String writerName, ClassLoader classLoader) {
+ super();
+ this.typeName = typeName;
+ this.typeDataSize = typeDataSize;
+ this.key = new WeakReference<>(key);
+ this.readerName = readerName;
+ this.writerName = writerName;
+ this.classLoader = new WeakReference<>(classLoader);
+ }
+
+ /**
+ * @return Returns the classLoader.
+ */
+ public ClassLoader getClassLoader() {
+ return classLoader.get();
+ }
+
+ /**
+ * @return Returns the key.
+ */
+ public Key getKey() {
+ return key.get();
+ }
+
+ /**
+ * @return Returns the readerName.
+ */
+ public String getReaderName() {
+ return readerName;
+ }
+
+ /**
+ * @return Returns the typeDataSize.
+ */
+ public int getTypeDataSize() {
+ return typeDataSize;
+ }
+
+ /**
+ * @return Returns the typeName.
+ */
+ public String getTypeName() {
+ return typeName;
+ }
+
+ /**
+ * @return Returns the writerName.
+ */
+ public String getWriterName() {
+ return writerName;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+
+ if (obj instanceof TypeSignature) {
+ TypeSignature signature = (TypeSignature) obj;
+
+ return typeName.equals(signature.typeName) && typeDataSize == signature.typeDataSize && readerName.equals(signature.readerName) && writerName.equals(signature.writerName) && classLoader.get().equals(
+ signature.classLoader.get());
+ }
+
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return typeName.hashCode();
+ }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/TypeSupport.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/TypeSupport.java
new file mode 100644
index 000000000..7a2036ca9
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/TypeSupport.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.service;
+
+import org.eclipse.osee.ote.messaging.dds.ReturnCode;
+import org.eclipse.osee.ote.messaging.dds.entity.DomainParticipant;
+
+/**
+ * The base class that needs to be extended by application specific type support classes. This is used to allow the DDS
+ * system to recognize and make use of application specific types for creating topics at run time.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public abstract class TypeSupport {
+
+ /**
+ * The method which tells the system how large the data type is in bytes.
+ *
+ * @return The integer count of bytes for the type.
+ */
+ protected abstract int getTypeDataSize();
+
+ /**
+ * The method which supplies the <code>Key</code> for distinguishing instances of this data type.
+ *
+ * @see Key
+ */
+ protected abstract Key getKey();
+
+ /**
+ * The method that supplies the class name for the application class that extends <code>DataReader</code> for this
+ * type. The string returned must be formatted such that the <code>ClassLoader</code> designated during registration
+ * will be able to supply the reader.
+ *
+ * @return The class name for the reader of this type.
+ */
+ protected abstract String getReaderName();
+
+ /**
+ * The method that supplies the class name for the application class that extends <code>DataWriter</code> for this
+ * type. The string returned must be formatted such that the <code>ClassLoader</code> designated during registration
+ * will be able to supply the writer.
+ *
+ * @return The class name for the writer of this type.
+ */
+ protected abstract String getWriterName();
+
+ // TUNE should/could this method be made static ?
+ /**
+ * The method used to register this type. This method allows a the application to supply any <code>ClassLoader</code>
+ * for the system to use to load the application specific data readers and writers.
+ *
+ * @param participant - The <code>DomainParticipant</code> to register the type with.
+ * @param typeName - The typeName to register this type as.
+ * @param classLoader - The <code>ClassLoader</code> to register for this type.
+ */
+ public ReturnCode registerType(DomainParticipant participant, String typeName, ClassLoader classLoader) {
+ return participant.getTypeRegistry().register(
+ new TypeSignature(typeName, getTypeDataSize(), getKey(), getReaderName(), getWriterName(), classLoader));
+ }
+
+ /**
+ * The method used to register this type. This method registers the type with the system <code>ClassLoader</code> as
+ * the loader for the reader and writer.
+ *
+ * @param participant - The <code>DomainParticipant</code> to register the type with.
+ * @param typeName - The typeName to register this type as.
+ */
+ public ReturnCode registerType(DomainParticipant participant, String typeName) {
+ ClassLoader defaultClassLoader = ClassLoader.getSystemClassLoader();
+
+ return registerType(participant, typeName, defaultClassLoader);
+ }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/package.html b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/package.html
new file mode 100644
index 000000000..2818d5897
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/service/package.html
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+</head>
+<body bgcolor="white">
+
+
+Provides service level support classes.
+
+<!-- Put @see and @since tags down here. -->
+
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/CountedStatus.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/CountedStatus.java
new file mode 100644
index 000000000..9a5092751
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/CountedStatus.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.status;
+
+/**
+ * A <code>Status</code> that also maintains a counts for the total and incremental number of samples associated with
+ * the status.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public abstract class CountedStatus extends Status {
+ private final long totalCount;
+ private final long totalCountChange;
+
+ /**
+ * @param totalCount The cumulative count of samples or topics associated with this status.
+ * @param totalCountChange The change in count since the last time the listener was called or the status was read.
+ */
+ public CountedStatus(long totalCount, long totalCountChange) {
+ super();
+ this.totalCount = totalCount;
+ this.totalCountChange = totalCountChange;
+ }
+
+ /**
+ * Gets the Total Count of all samples or topics associated with this status.
+ *
+ * @return Returns the totalCount.
+ */
+ public long getTotalCount() {
+ return totalCount;
+ }
+
+ /**
+ * Gets the number of samples or topics associated with this status since the last time the listener was called or
+ * the status was read.
+ *
+ * @return Returns the totalCountChange.
+ */
+ public long getTotalCountChange() {
+ return totalCountChange;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/InconsistentTopicStatus.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/InconsistentTopicStatus.java
new file mode 100644
index 000000000..2d103e22f
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/InconsistentTopicStatus.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.status;
+
+/**
+ * Maintains counts of Topics whose name match the topic this <code>Status</code> is attached to, but type differs.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class InconsistentTopicStatus extends CountedStatus {
+
+ /**
+ * @param totalCount The cumulative countt of inconsistent statuses.
+ * @param totalCountChange The change in count since the last time the listener was called or the status was read.
+ */
+ public InconsistentTopicStatus(long totalCount, long totalCountChange) {
+ super(totalCount, totalCountChange);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/LivelinessChangedStatus.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/LivelinessChangedStatus.java
new file mode 100644
index 000000000..49f233987
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/LivelinessChangedStatus.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.status;
+
+/**
+ * Maintains counts of {@link org.eclipse.osee.ote.messaging.dds.entity.DataWriter}'s actively or inactively write the
+ * same Topic as the {@link org.eclipse.osee.ote.messaging.dds.entity.DataReader}this is attached to.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class LivelinessChangedStatus extends Status {
+ private final long activeCount;
+ private final long activeCountChange;
+ private final long inactiveCount;
+ private final long inactiveCountChange;
+
+ /**
+ * @param activeCount The current number of active <code>DataWriter</code>'s with the same Topic.
+ * @param inactiveCount The current number of inactive <code>DataWriter</code>'s with the same Topic.
+ * @param activeCountChange The change in activeCount since the last time the listener was called or the status was
+ * read.
+ * @param inactiveCountChange The change in inactiveCount since the last time the listener was called or the status
+ * was read.
+ */
+ public LivelinessChangedStatus(long activeCount, long inactiveCount, long activeCountChange, long inactiveCountChange) {
+ super();
+ this.activeCount = activeCount;
+ this.inactiveCount = inactiveCount;
+ this.activeCountChange = activeCountChange;
+ this.inactiveCountChange = inactiveCountChange;
+ }
+
+ /**
+ * Gets the current number of active <code>DataWriter</code>'s with the same Topic.
+ *
+ * @return Returns the activeCount.
+ */
+ public long getActiveCount() {
+ return activeCount;
+ }
+
+ /**
+ * Gets the change in activeCount since the last time the listener was called or the status was read.
+ *
+ * @return Returns the activeCountChange.
+ */
+ public long getActiveCountChange() {
+ return activeCountChange;
+ }
+
+ /**
+ * Gets the current number of inactive <code>DataWriter</code>'s with the same Topic.
+ *
+ * @return Returns the inactiveCount.
+ */
+ public long getInactiveCount() {
+ return inactiveCount;
+ }
+
+ /**
+ * Gets the change in inactiveCount since the last time the listener was called or the status was read.
+ *
+ * @return Returns the inactiveCountChange.
+ */
+ public long getInactiveCountChange() {
+ return inactiveCountChange;
+ }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/LivelinessLostStatus.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/LivelinessLostStatus.java
new file mode 100644
index 000000000..b03faa512
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/LivelinessLostStatus.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.status;
+
+/**
+ * Maintains counts of the number of times the {@link org.eclipse.osee.ote.messaging.dds.entity.DataWriter} failed to
+ * signal its liveliness within the liveliness period.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class LivelinessLostStatus extends CountedStatus {
+
+ /**
+ * @param totalCount The cumulative count of liveliness lost.
+ * @param totalCountChange The change in count since the last time the listener was called or the status was read.
+ */
+ public LivelinessLostStatus(long totalCount, long totalCountChange) {
+ super(totalCount, totalCountChange);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/OfferedDeadlineMissedStatus.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/OfferedDeadlineMissedStatus.java
new file mode 100644
index 000000000..10cb9de20
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/OfferedDeadlineMissedStatus.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.status;
+
+import org.eclipse.osee.ote.messaging.dds.InstanceHandle;
+
+/**
+ * Maintains counts of the number of times the {@link org.eclipse.osee.ote.messaging.dds.entity.DataWriter} failed to
+ * write within the offered deadline.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class OfferedDeadlineMissedStatus extends CountedStatus {
+ private final InstanceHandle lastInstanceHandle;
+
+ /**
+ * @param totalCount The cumulative count of offered deadlines missed.
+ * @param totalCountChange The change in count since the last time the listener was called or the status was read.
+ * @param lastInstanceHandle The last instance in the <code>DataWriter</code> for which the deadline was missed.
+ */
+ public OfferedDeadlineMissedStatus(long totalCount, long totalCountChange, InstanceHandle lastInstanceHandle) {
+ super(totalCount, totalCountChange);
+ this.lastInstanceHandle = lastInstanceHandle;
+ }
+
+ /**
+ * Gets a handle to the instance in the <code>DataWriter</code> for which the last offered deadline that was missed.
+ *
+ * @return Returns the lastInstanceHandle.
+ */
+ public InstanceHandle getLastInstanceHandle() {
+ return lastInstanceHandle;
+ }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/OfferedIncompatibleQosStatus.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/OfferedIncompatibleQosStatus.java
new file mode 100644
index 000000000..00e62f210
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/OfferedIncompatibleQosStatus.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.status;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import org.eclipse.osee.ote.messaging.dds.entity.DataReader;
+import org.eclipse.osee.ote.messaging.dds.entity.DataWriter;
+import org.eclipse.osee.ote.messaging.dds.qos.QosPolicy;
+
+/**
+ * Maintains counts of the number of {@link DataReader}'s that the {@link DataWriter} <code>Topic</code> matched but has
+ * an incompatible Qos Policy.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class OfferedIncompatibleQosStatus extends CountedStatus {
+
+ private final long lastPolicyId;
+ private final Collection<QosPolicy> policies;
+
+ /**
+ * @param totalCount The cumulative count of <code>DataReader</code>'s whose <code>Topic</code>'s match but have an
+ * incompatible Qos Policy.
+ * @param totalCountChange The change in count since the last time the listener was called or the status was read.
+ * @param lastPolicyId The ID of one of the incompatible policies found from the last detected incompatibility.
+ * @param policies The total counts of incompatibilities for each policy which has been found to be incompatible at
+ * some point.
+ */
+ public OfferedIncompatibleQosStatus(long totalCount, long totalCountChange, long lastPolicyId, Collection<QosPolicy> policies) {
+ super(totalCount, totalCountChange);
+ this.lastPolicyId = lastPolicyId;
+ this.policies = new ArrayList<>(policies);
+ }
+
+ /**
+ * Gets the ID of one of the incompatible policies found from the last detected incompatibility.
+ *
+ * @return Returns the lastPolicyId.
+ */
+ public long getLastPolicyId() {
+ return lastPolicyId;
+ }
+
+ /**
+ * Gets the total counts of incompatibilities for each policy which has been found to be incompatible at some point.
+ *
+ * @return Returns the counts by individual policy.
+ */
+ public Collection<QosPolicy> getPolicies() {
+ return policies;
+ }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/PublicationMatchStatus.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/PublicationMatchStatus.java
new file mode 100644
index 000000000..d93687422
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/PublicationMatchStatus.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.status;
+
+import org.eclipse.osee.ote.messaging.dds.InstanceHandle;
+
+/**
+ * Maintains counts of the number of {@link org.eclipse.osee.ote.messaging.dds.entity.DataReader}'s that the
+ * {@link org.eclipse.osee.ote.messaging.dds.entity.DataWriter} matched based upon <code>Topic</code> & Qos Policies.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class PublicationMatchStatus extends CountedStatus {
+ private final InstanceHandle lastSubscriptionHandle;
+
+ /**
+ * @param totalCount The cumulative count of <code>DataReader</code>'s whose Qos Policies match.
+ * @param totalCountChange The change in count since the last time the listener was called or the status was read.
+ * @param lastSubscriptionHandle The last <code>DataReader</code> matching the <code>DataWriter</code> causing the
+ * status to change.
+ */
+ public PublicationMatchStatus(long totalCount, long totalCountChange, InstanceHandle lastSubscriptionHandle) {
+ super(totalCount, totalCountChange);
+ this.lastSubscriptionHandle = lastSubscriptionHandle;
+ }
+
+ /**
+ * Gets a handle to the last <code>DataReader</code> matching the DataWriter causing the status to change.
+ *
+ * @return Returns the lastInstanceHandle.
+ */
+ public InstanceHandle getLastSubscriptionHandle() {
+ return lastSubscriptionHandle;
+ }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/RequestedDeadlineMissedStatus.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/RequestedDeadlineMissedStatus.java
new file mode 100644
index 000000000..f1d134199
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/RequestedDeadlineMissedStatus.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.status;
+
+import org.eclipse.osee.ote.messaging.dds.InstanceHandle;
+
+/**
+ * Maintains counts of the number of times the {@link org.eclipse.osee.ote.messaging.dds.entity.DataReader} detected a
+ * missed deadline.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class RequestedDeadlineMissedStatus extends CountedStatus {
+ private final InstanceHandle lastInstanceHandle;
+
+ /**
+ * @param totalCount The cumulative count of deadlines missed.
+ * @param totalCountChange The change in count since the last time the listener was called or the status was read.
+ * @param lastInstanceHandle The last instance in the <code>DataReader</code> for which the deadline was missed.
+ */
+ public RequestedDeadlineMissedStatus(long totalCount, long totalCountChange, InstanceHandle lastInstanceHandle) {
+ super(totalCount, totalCountChange);
+ this.lastInstanceHandle = lastInstanceHandle;
+ }
+
+ /**
+ * Gets a handle to the instance in the <code>DataReader</code> for which the last deadline that was missed.
+ *
+ * @return Returns the lastInstanceHandle.
+ */
+ public InstanceHandle getLastInstanceHandle() {
+ return lastInstanceHandle;
+ }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/RequestedIncompatibleQosStatus.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/RequestedIncompatibleQosStatus.java
new file mode 100644
index 000000000..8cc5d0757
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/RequestedIncompatibleQosStatus.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.status;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import org.eclipse.osee.ote.messaging.dds.entity.DataReader;
+import org.eclipse.osee.ote.messaging.dds.entity.DataWriter;
+import org.eclipse.osee.ote.messaging.dds.qos.QosPolicy;
+
+/**
+ * Maintains counts of the number of {@link DataWriter}'s that the {@link DataReader} <code>Topic</code> matched but has
+ * an incompatible Qos Policy.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class RequestedIncompatibleQosStatus extends CountedStatus {
+ private final long lastPolicyId;
+ private final Collection<QosPolicy> policies;
+
+ /**
+ * @param totalCount The cumulative count of <code>DataWriter</code>'s whose <code>Topic</code>'s match but have an
+ * incompatible Qos Policy.
+ * @param totalCountChange The change in count since the last time the listener was called or the status was read.
+ * @param lastPolicyId The ID of one of the incompatible policies found from the last detected incompatibility.
+ * @param policies The total counts of incompatibilities for each policy which has been found to be incompatible at
+ * some point.
+ */
+ public RequestedIncompatibleQosStatus(long totalCount, long totalCountChange, long lastPolicyId, Collection<QosPolicy> policies) {
+ super(totalCount, totalCountChange);
+ this.lastPolicyId = lastPolicyId;
+ this.policies = new ArrayList<>(policies);
+ }
+
+ /**
+ * Gets the ID of one of the incompatible policies found from the last detected incompatibility.
+ *
+ * @return Returns the lastPolicyId.
+ */
+ public long getLastPolicyId() {
+ return lastPolicyId;
+ }
+
+ /**
+ * Gets the total counts of incompatibilities for each policy which has been found to be incompatible at some point.
+ *
+ * @return Returns the counts by individual policy.
+ */
+ public Collection<QosPolicy> getPolicies() {
+ return policies;
+ }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/SampleLostStatus.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/SampleLostStatus.java
new file mode 100644
index 000000000..315d7d95f
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/SampleLostStatus.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.status;
+
+/**
+ * Maintains counts of the samples lost across all instances of data published for the
+ * {@link org.eclipse.osee.ote.messaging.dds.entity.Topic}.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class SampleLostStatus extends CountedStatus {
+
+ /**
+ * @param totalCount The cumulative count of all samples lost for the <code>Topic</code>.
+ * @param totalCountChange The change in count since the last time the listener was called or the status was read.
+ */
+ public SampleLostStatus(long totalCount, long totalCountChange) {
+ super(totalCount, totalCountChange);
+ }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/SampleRejectedStatus.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/SampleRejectedStatus.java
new file mode 100644
index 000000000..64d9f0683
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/SampleRejectedStatus.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.status;
+
+import org.eclipse.osee.ote.messaging.dds.InstanceHandle;
+
+/**
+ * Maintains counts of the number of samples rejected by a {@link org.eclipse.osee.ote.messaging.dds.entity.DataReader}.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class SampleRejectedStatus extends CountedStatus {
+ private final SampleRejectedStatusKind lastReason;
+ private final InstanceHandle lastInstanceHandle;
+
+ /**
+ * @param totalCount The cumulative count of all samples rejected by the <code>DataReader</code>.
+ * @param totalCountChange The change in count since the last time the listener was called or the status was read.
+ * @param lastReason The reason the last sample was rejected.
+ * @param lastInstanceHandle The instance of the last rejected sample.
+ */
+ public SampleRejectedStatus(long totalCount, long totalCountChange, SampleRejectedStatusKind lastReason, InstanceHandle lastInstanceHandle) {
+ super(totalCount, totalCountChange);
+ this.lastReason = lastReason;
+ this.lastInstanceHandle = lastInstanceHandle;
+ }
+
+ /**
+ * Gets the instance of the last sample that was rejected.
+ *
+ * @return Returns the lastInstanceHandle.
+ */
+ public InstanceHandle getLastInstanceHandle() {
+ return lastInstanceHandle;
+ }
+
+ /**
+ * Gets the reason the last sample was rejected.
+ *
+ * @return Returns the lastReason.
+ */
+ public SampleRejectedStatusKind getLastReason() {
+ return lastReason;
+ }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/SampleRejectedStatusKind.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/SampleRejectedStatusKind.java
new file mode 100644
index 000000000..3212b4890
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/SampleRejectedStatusKind.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.status;
+
+/**
+ * Enumeration class for the reasons a sample was rejected by a
+ * {@link org.eclipse.osee.ote.messaging.dds.entity.DataReader}.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class SampleRejectedStatusKind {
+ public static final SampleRejectedStatusKind REJECTED_BY_INSTANCE_LIMIT = new SampleRejectedStatusKind(1,
+ "Rejected by instance limit");
+ public static final SampleRejectedStatusKind REJECTED_BY_TOPIC_LIMIT = new SampleRejectedStatusKind(2,
+ "Rejected by topic limit");
+
+ private final int value;
+ private final String description;
+
+ private SampleRejectedStatusKind(int value, String description) {
+ super();
+ this.value = value;
+ this.description = description;
+ }
+
+ /**
+ * Gets the description of the rejected status.
+ *
+ * @return Returns the description.
+ */
+ public String getDescription() {
+ return description;
+ }
+
+ /**
+ * Gets the value used to identify the rejected status.
+ *
+ * @return Returns the value.
+ */
+ public int getValue() {
+ return value;
+ }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/Status.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/Status.java
new file mode 100644
index 000000000..5dc3d7359
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/Status.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.status;
+
+/**
+ * Base class for the various *Status classes specified in the DDS specification.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public abstract class Status {
+
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/SubscriptionMatchStatus.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/SubscriptionMatchStatus.java
new file mode 100644
index 000000000..d5c14e468
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/SubscriptionMatchStatus.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.status;
+
+import org.eclipse.osee.ote.messaging.dds.InstanceHandle;
+
+/**
+ * Maintains counts of the number of {@link org.eclipse.osee.ote.messaging.dds.entity.DataWriter}'s that the
+ * {@link org.eclipse.osee.ote.messaging.dds.entity.DataReader} matched based upon <code>Topic</code> & Qos Policies.
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class SubscriptionMatchStatus extends CountedStatus {
+ private final InstanceHandle lastPublicationHandle;
+
+ /**
+ * @param totalCount The cumulative count of <code>DataWriter</code>'s whose Qos Policies match.
+ * @param totalCountChange The change in count since the last time the listener was called or the status was read.
+ * @param lastPublicationHandle The last <code>DataWriter</code> matching the <code>DataReader</code> causing the
+ * status to change.
+ */
+ public SubscriptionMatchStatus(long totalCount, long totalCountChange, InstanceHandle lastPublicationHandle) {
+ super(totalCount, totalCountChange);
+ this.lastPublicationHandle = lastPublicationHandle;
+ }
+
+ /**
+ * Gets a handle to the last <code>DataWriter</code> matching the DataWriter causing the status to change.
+ *
+ * @return Returns the lastInstanceHandle.
+ */
+ public InstanceHandle getLastPublicationHandle() {
+ return lastPublicationHandle;
+ }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/package.html b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/package.html
new file mode 100644
index 000000000..b4590a3df
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/status/package.html
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+</head>
+<body bgcolor="white">
+
+
+Provides classes necessary for tracking and reporting status.
+
+<!-- Put @see and @since tags down here. -->
+
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/Driver.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/Driver.java
new file mode 100644
index 000000000..ee95bd832
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/Driver.java
@@ -0,0 +1,179 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.test;
+
+import org.eclipse.osee.ote.messaging.dds.DataStoreItem;
+import org.eclipse.osee.ote.messaging.dds.IDestination;
+import org.eclipse.osee.ote.messaging.dds.ISource;
+import org.eclipse.osee.ote.messaging.dds.entity.DataReader;
+import org.eclipse.osee.ote.messaging.dds.entity.DataWriter;
+import org.eclipse.osee.ote.messaging.dds.entity.DomainParticipant;
+import org.eclipse.osee.ote.messaging.dds.entity.DomainParticipantFactory;
+import org.eclipse.osee.ote.messaging.dds.entity.Publisher;
+import org.eclipse.osee.ote.messaging.dds.entity.Subscriber;
+import org.eclipse.osee.ote.messaging.dds.entity.Topic;
+import org.eclipse.osee.ote.messaging.dds.listener.DomainParticipantListener;
+import org.eclipse.osee.ote.messaging.dds.service.DomainId;
+import org.eclipse.osee.ote.messaging.dds.status.InconsistentTopicStatus;
+import org.eclipse.osee.ote.messaging.dds.status.LivelinessChangedStatus;
+import org.eclipse.osee.ote.messaging.dds.status.LivelinessLostStatus;
+import org.eclipse.osee.ote.messaging.dds.status.OfferedDeadlineMissedStatus;
+import org.eclipse.osee.ote.messaging.dds.status.OfferedIncompatibleQosStatus;
+import org.eclipse.osee.ote.messaging.dds.status.PublicationMatchStatus;
+import org.eclipse.osee.ote.messaging.dds.status.RequestedDeadlineMissedStatus;
+import org.eclipse.osee.ote.messaging.dds.status.RequestedIncompatibleQosStatus;
+import org.eclipse.osee.ote.messaging.dds.status.SampleLostStatus;
+import org.eclipse.osee.ote.messaging.dds.status.SampleRejectedStatus;
+import org.eclipse.osee.ote.messaging.dds.status.SubscriptionMatchStatus;
+import org.eclipse.osee.ote.messaging.dds.test.data.IntMessageReader;
+import org.eclipse.osee.ote.messaging.dds.test.data.IntMessageTypeSupport;
+import org.eclipse.osee.ote.messaging.dds.test.data.IntMessageWriter;
+import org.eclipse.osee.ote.messaging.dds.test.data.IntegerData;
+
+/**
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class Driver implements DomainParticipantListener {
+ private final DomainParticipant domainParticipant;
+ private final Publisher publisher;
+ private final Subscriber subscriber;
+ private final Publisher myMiddlewarePublisher;
+
+ public Driver() {
+ // Get a domain participant so that we can participate in DDS
+ DomainParticipantFactory domainParticipantFactory = DomainParticipantFactory.getInstance();
+ domainParticipant = domainParticipantFactory.createParticipant(new DomainId(12), this, false);
+
+ // Get some publishers and subscribers
+ subscriber = domainParticipant.createSubscriber(null);
+ publisher = domainParticipant.createPublisher(this);
+ myMiddlewarePublisher = domainParticipant.getMiddlewarePublisherInstance(this);
+
+ // Register a type, and get some topics built from that type
+ new IntMessageTypeSupport().registerType(domainParticipant, "IntMessage");
+ Topic anIntTopic = domainParticipant.createTopic("Daves topic", "default", "IntMessage", this);
+ Topic anotherIntTopic = domainParticipant.createTopic("Robs topic", "default", "IntMessage", this);
+
+ // Get some readers and writers for communication via the generated topics
+ IntMessageWriter davesWriter = (IntMessageWriter) publisher.createDataWriter(anIntTopic, this);
+ IntMessageReader davesReader = (IntMessageReader) subscriber.createDataReader(anIntTopic, this);
+ IntMessageWriter robsWriter = (IntMessageWriter) publisher.createDataWriter(anotherIntTopic, this);
+ IntMessageReader robsReader = (IntMessageReader) subscriber.createDataReader(anotherIntTopic, this);
+
+ // A reference for read data
+ IntegerData readData;
+
+ System.out.println("Write 8 to daves message from middleware");
+ myMiddlewarePublisher.publishData(new IntegerData(8), anIntTopic.getName(), anIntTopic.getNamespace());
+ readData = davesReader.takeNextSample();
+ System.out.println("Daves reader sees: " + readData.getTheInt());
+ System.out.println("Robs reader sees: " + robsReader.takeNextSample().getTheInt());
+
+ System.out.println("\n");
+ System.out.println("Write 54875 to daves message");
+ davesWriter.write(5);
+ readData = davesReader.takeNextSample();
+ System.out.println("Daves reader sees: " + readData.getTheInt());
+ System.out.println("Robs reader sees: " + robsReader.takeNextSample().getTheInt());
+ System.out.println("Write 10 to daves message, but check the previous data is still 5");
+ davesWriter.write(10);
+ System.out.println("Daves previous data is: " + readData.getTheInt());
+
+ System.out.println("\n");
+ System.out.println("Write 12 to robs message");
+ robsWriter.write(12);
+ System.out.println("Daves reader sees: " + davesReader.takeNextSample().getTheInt());
+ System.out.println("Robs reader sees: " + robsReader.takeNextSample().getTheInt());
+
+ System.out.println("\n");
+ System.out.println("Write 15 to robs message");
+ robsWriter.write(15);
+ System.out.println("Daves reader sees: " + davesReader.takeNextSample().getTheInt());
+ System.out.println("Robs reader sees: " + robsReader.takeNextSample().getTheInt());
+ }
+
+ public static void main(String[] args) {
+ System.out.println("Starting the driver ...");
+ System.out.println("---------------------------------------------------");
+ new Driver();
+ System.out.println("---------------------------------------------------");
+ System.out.println("Driver finished");
+ }
+
+ @Override
+ public void onInconsistentTopic(Topic theTopic, InconsistentTopicStatus status) {
+ }
+
+ @Override
+ public void onDataOnReaders(Subscriber theSubscriber) {
+ System.out.println("++onDataOnReaders was called");
+ //theSubscriber.getDataReaders();
+ }
+
+ @Override
+ public void onDataAvailable(DataReader theReader) {
+ System.out.println("**Data available from system: " + theReader.getTopicDescription().getName());
+
+ }
+
+ @Override
+ public void onSampleRejected(DataReader theReader, SampleRejectedStatus status) {
+ }
+
+ @Override
+ public void onLivelinessChanged(DataReader theReader, LivelinessChangedStatus status) {
+ }
+
+ @Override
+ public void onRequestedDeadlineMissed(DataReader theReader, RequestedDeadlineMissedStatus status) {
+ }
+
+ @Override
+ public void onRequestedIncompatibleQos(DataReader theReader, RequestedIncompatibleQosStatus status) {
+ }
+
+ @Override
+ public void onSubscriptionMatch(DataReader theReader, SubscriptionMatchStatus status) {
+ }
+
+ @Override
+ public void onSampleLost(DataReader theReader, SampleLostStatus status) {
+ }
+
+ @Override
+ public void onLivelinessLost(DataWriter theWriter, LivelinessLostStatus status) {
+ }
+
+ @Override
+ public void onOfferedDeadlineMissed(DataWriter theWriter, OfferedDeadlineMissedStatus status) {
+ }
+
+ @Override
+ public void onOfferedIncompatibleQos(DataWriter theWriter, OfferedIncompatibleQosStatus status) {
+ }
+
+ @Override
+ public void onPublicationMatch(DataWriter theWriter, PublicationMatchStatus status) {
+ }
+
+ @Override
+ public void onDataSentToMiddleware(DataWriter theWriter) {
+ System.out.println("@@onDataTaken called");
+
+ }
+
+ @Override
+ public void onPublishNotifyMiddleware(IDestination destination, ISource source, DataStoreItem dataStoreItem) {
+ System.out.println("--Middleware notified on publish of: " + dataStoreItem.getTheTopicDescription().getName() + "-" + dataStoreItem.getTheTopicDescription().getTypeName());
+
+ }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/IntMessage.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/IntMessage.java
new file mode 100644
index 000000000..be78e9d74
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/IntMessage.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.test.data;
+
+/**
+ * Created on May 19, 2005
+ *
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class IntMessage extends IntegerData {
+
+ public IntMessage() {
+ super(-2);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/IntMessageReader.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/IntMessageReader.java
new file mode 100644
index 000000000..80a04b5f6
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/IntMessageReader.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.test.data;
+
+import org.eclipse.osee.ote.messaging.dds.DataSample;
+import org.eclipse.osee.ote.messaging.dds.ReturnCode;
+import org.eclipse.osee.ote.messaging.dds.entity.DataReader;
+import org.eclipse.osee.ote.messaging.dds.entity.EntityFactory;
+import org.eclipse.osee.ote.messaging.dds.entity.Subscriber;
+import org.eclipse.osee.ote.messaging.dds.listener.DataReaderListener;
+import org.eclipse.osee.ote.messaging.dds.service.TopicDescription;
+import org.eclipse.osee.ote.messaging.dds.status.LivelinessChangedStatus;
+import org.eclipse.osee.ote.messaging.dds.status.RequestedDeadlineMissedStatus;
+import org.eclipse.osee.ote.messaging.dds.status.RequestedIncompatibleQosStatus;
+import org.eclipse.osee.ote.messaging.dds.status.SampleLostStatus;
+import org.eclipse.osee.ote.messaging.dds.status.SampleRejectedStatus;
+import org.eclipse.osee.ote.messaging.dds.status.SubscriptionMatchStatus;
+
+/**
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class IntMessageReader extends DataReader {
+
+ DataSample dataSample;
+ private final IntMessage intMessage;
+
+ public IntMessageReader(TopicDescription topicDescription, Subscriber subscriber, Boolean enabled, DataReaderListener listener, EntityFactory parentFactory) {
+ super(topicDescription, subscriber, enabled, listener, parentFactory);
+
+ intMessage = new IntMessage();
+ dataSample = new DataSample(intMessage);
+ this.setListener(new IntMessageListener(), null);
+ }
+
+ public class IntMessageListener implements DataReaderListener {
+
+ @Override
+ public synchronized void onDataAvailable(DataReader theReader) {
+ System.out.println("onDataAvailable Called for " + theReader.getTopicDescription().getName());
+ }
+
+ @Override
+ public void onSampleRejected(DataReader theReader, SampleRejectedStatus status) {
+ }
+
+ @Override
+ public void onLivelinessChanged(DataReader theReader, LivelinessChangedStatus status) {
+ }
+
+ @Override
+ public void onRequestedDeadlineMissed(DataReader theReader, RequestedDeadlineMissedStatus status) {
+ }
+
+ @Override
+ public void onRequestedIncompatibleQos(DataReader theReader, RequestedIncompatibleQosStatus status) {
+ }
+
+ @Override
+ public void onSubscriptionMatch(DataReader theReader, SubscriptionMatchStatus status) {
+ }
+
+ @Override
+ public void onSampleLost(DataReader theReader, SampleLostStatus status) {
+ }
+ }
+
+ public IntegerData takeNextSample() {
+ ReturnCode code = super.takeNextSample(dataSample);
+
+ System.out.println("Result of take is: " + code.getDescription());
+ if (dataSample.getData() != null) {
+ IntegerData data = (IntegerData) dataSample.getData();
+ return data;
+ } else {
+ return new IntegerData(-1);
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/IntMessageTypeSupport.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/IntMessageTypeSupport.java
new file mode 100644
index 000000000..bf700a219
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/IntMessageTypeSupport.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.test.data;
+
+import org.eclipse.osee.ote.messaging.dds.service.Key;
+import org.eclipse.osee.ote.messaging.dds.service.TypeSupport;
+
+/**
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class IntMessageTypeSupport extends TypeSupport {
+
+ @Override
+ protected int getTypeDataSize() {
+ return Integer.SIZE / 8;
+ }
+
+ @Override
+ protected Key getKey() {
+ return null;
+ }
+
+ @Override
+ protected String getReaderName() {
+ return IntMessageReader.class.getCanonicalName();
+ }
+
+ @Override
+ protected String getWriterName() {
+ return IntMessageWriter.class.getCanonicalName();
+ }
+
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/IntMessageWriter.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/IntMessageWriter.java
new file mode 100644
index 000000000..d4c2a24ec
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/IntMessageWriter.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.test.data;
+
+import org.eclipse.osee.ote.messaging.dds.ReturnCode;
+import org.eclipse.osee.ote.messaging.dds.entity.DataWriter;
+import org.eclipse.osee.ote.messaging.dds.entity.EntityFactory;
+import org.eclipse.osee.ote.messaging.dds.entity.Publisher;
+import org.eclipse.osee.ote.messaging.dds.entity.Topic;
+import org.eclipse.osee.ote.messaging.dds.listener.DataWriterListener;
+
+/**
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class IntMessageWriter extends DataWriter {
+ private final IntegerData buffer;
+
+ public IntMessageWriter(Topic topic, Publisher publisher, Boolean enabled, DataWriterListener listener, EntityFactory parentFactory) {
+ super(topic, publisher, enabled, listener, parentFactory);
+ buffer = new IntegerData(0);
+ }
+
+ public ReturnCode write(int value) {
+ buffer.setTheInt(value);
+ return super.write(null, null, buffer, null);
+ }
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/IntegerData.java b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/IntegerData.java
new file mode 100644
index 000000000..02c6af616
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/IntegerData.java
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.messaging.dds.test.data;
+
+import java.nio.ByteBuffer;
+import org.eclipse.osee.ote.messaging.dds.Data;
+
+/**
+ * @author Robert A. Fisher
+ * @author David Diepenbrock
+ */
+public class IntegerData implements Data {
+ private int theInt;
+
+ public IntegerData(int theInt) {
+ super();
+ this.theInt = theInt;
+ }
+
+ /**
+ * @return Returns the theInt.
+ */
+ public int getTheInt() {
+ return theInt;
+ }
+
+ /**
+ * @param theInt The theInt to set.
+ */
+ public void setTheInt(int theInt) {
+ this.theInt = theInt;
+ }
+
+ @Override
+ public byte[] toByteArray() {
+ int x = theInt;
+
+ return new byte[] {byteOf(x, 3), byteOf(x, 2), byteOf(x, 1), byteOf(x, 0)};
+ }
+
+ private byte byteOf(int x, int index) {
+ return (byte) (x >> index * 4 & 0xff);
+ }
+
+ @Override
+ public void setFromByteArray(byte[] input) {
+
+ int value = 0;
+
+ if (input.length > 4) {
+ value = Integer.MAX_VALUE;
+ } else {
+ for (int x = input.length - 1; x > -1; x--) {
+ value += input[x] << (input.length - (x + 1)) * 4;
+ }
+ }
+ theInt = value;
+ }
+
+ @Override
+ public Object getKeyValue() {
+ return new Integer(theInt);
+ }
+
+ @Override
+ public void copyFrom(Data buffer) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void setFromByteBuffer(ByteBuffer buffer) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public ByteBuffer toByteBuffer() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public int getOffset() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/package.html b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/package.html
new file mode 100644
index 000000000..09212d235
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/data/package.html
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+</head>
+<body bgcolor="white">
+
+
+Provides the application specific classes necessary for the test driver.
+
+<!-- Put @see and @since tags down here. -->
+
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/package.html b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/package.html
new file mode 100644
index 000000000..5d7538307
--- /dev/null
+++ b/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/test/package.html
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+</head>
+<body bgcolor="white">
+
+
+Provides a basic test of the DDS System.
+
+<!-- Put @see and @since tags down here. -->
+
+</body>
+</html> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.p2/.project b/org.eclipse.osee.ote.p2/.project
new file mode 100644
index 000000000..44fdaae7b
--- /dev/null
+++ b/org.eclipse.osee.ote.p2/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ote.p2</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.pde.UpdateSiteBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.UpdateSiteNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.p2/category.xml b/org.eclipse.osee.ote.p2/category.xml
new file mode 100644
index 000000000..95ea8cb40
--- /dev/null
+++ b/org.eclipse.osee.ote.p2/category.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<site>
+ <feature url="features/org.eclipse.osee.client.ote.feature_0.25.3.qualifier.jar" id="org.eclipse.osee.client.ote.feature" version="0.25.3.qualifier">
+ <category name="org.eclipse.osee.ote"/>
+ </feature>
+ <feature url="features/org.eclipse.osee.client.ote.feature.source_0.25.3.qualifier.jar" id="org.eclipse.osee.client.ote.feature.source" version="0.25.3.qualifier">
+ <category name="org.eclipse.osee.ote"/>
+ </feature>
+ <feature url="features/org.eclipse.osee.ote.feature_0.25.3.qualifier.jar" id="org.eclipse.osee.ote.feature" version="0.25.3.qualifier">
+ <category name="org.eclipse.osee.ote"/>
+ </feature>
+ <feature url="features/org.eclipse.osee.ote.feature.source_0.25.3.qualifier.jar" id="org.eclipse.osee.ote.feature.source" version="0.25.3.qualifier">
+ <category name="org.eclipse.osee.ote"/>
+ </feature>
+ <category-def name="org.eclipse.osee.ote" label="Eclipse OSEE OTE - (Incubation)">
+ <description>
+ Eclipse OSEE OTE - (Incubation)
+ </description>
+ </category-def>
+</site>
diff --git a/org.eclipse.osee.ote.p2/pom.xml b/org.eclipse.osee.ote.p2/pom.xml
new file mode 100644
index 000000000..32ec9b60e
--- /dev/null
+++ b/org.eclipse.osee.ote.p2/pom.xml
@@ -0,0 +1,93 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.osee</groupId>
+ <artifactId>org.eclipse.osee.ote.parent</artifactId>
+ <version>0.25.3-SNAPSHOT</version>
+ <relativePath>../org.eclipse.osee.ote.parent</relativePath>
+ </parent>
+
+ <artifactId>org.eclipse.osee.ote.p2</artifactId>
+ <packaging>eclipse-repository</packaging>
+ <name>OSEE OTE - p2 Site (Incubation)</name>
+ <version>0.25.3-SNAPSHOT</version>
+
+<build>
+<plugins>
+<plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-p2-repository-plugin</artifactId>
+ <version>${tycho-version}</version>
+ <configuration>
+ <includeAllDependencies>true</includeAllDependencies>
+ </configuration>
+ <executions>
+ <execution>
+ <id>assemble-repository</id>
+ <goals>
+ <goal>assemble-repository</goal>
+ </goals>
+ </execution>
+ <execution>
+ <id>archive-repository</id>
+ <phase>pre-integration-test</phase>
+ <goals>
+ <goal>archive-repository</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <executions>
+ <execution>
+ <phase>package</phase>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ <configuration>
+ <tasks name="generate">
+ <taskdef resource="net/sf/antcontrib/antlib.xml" />
+ <if>
+ <available file="version.xml" />
+ <then>
+ <ant antfile="version.xml" />
+ </then>
+ </if>
+ </tasks>
+ </configuration>
+ </execution>
+ </executions>
+ <dependencies>
+ <dependency>
+ <groupId>ant-contrib</groupId>
+ <artifactId>ant-contrib</artifactId>
+ <version>1.0b3</version>
+ <exclusions>
+ <exclusion>
+ <groupId>ant</groupId>
+ <artifactId>ant</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ </dependencies>
+ </plugin>
+ </plugins>
+ </build>
+ <!-- <build>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-p2-repository-plugin</artifactId>
+ <version>${tycho-version}</version>
+ <configuration>
+ <includeAllDependencies>true</includeAllDependencies>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build> -->
+
+</project>
diff --git a/org.eclipse.osee.ote.p2/version.xml b/org.eclipse.osee.ote.p2/version.xml
new file mode 100644
index 000000000..4a0aa95bf
--- /dev/null
+++ b/org.eclipse.osee.ote.p2/version.xml
@@ -0,0 +1,71 @@
+<project name="Contribute Extra Build Steps" default="version">
+
+
+ <target name="version">
+
+
+
+ <property name="root.folder" value="${basedir}/../../.." />
+ <property name="versions.file" value="${basedir}/target/repository/versions.txt" />
+ <!-- <property name="versions.file" value="${basedir}/versions.txt" /> -->
+
+ <!-- Grab version from dependency p2
+ <get src="${something.p2}/versions.txt" dest="${versions.file}"
+ username="${ldap.uname}" password="${ldap.pw}" />
+ -->
+ <!-- Add OSEE Version -->
+ <pathconvert property="version.bundle.path" setonempty="false">
+ <path>
+ <fileset dir="${basedir}/target/repository/plugins">
+ <include name="org.eclipse.osee.framework.core_*" />
+ </fileset>
+ </path>
+ </pathconvert>
+ <basename property="version.bundle.base.path" file="${version.bundle.path}" />
+ <propertyregex property="core.version" override="true"
+ input="${version.bundle.base.path}" regexp="core_(.*).jar" select="\1"
+ casesensitive="false" />
+
+ <echo file="${versions.file}" append="true"
+ message="OSEE build (org.eclipse.osee.ote): ${core.version}${line.separator}" />
+
+ <if>
+ <available file="${root.folder}/org.eclipse.osee/.git" type="dir"
+ property="org.eclipse.osee.present" />
+ <then>
+ <antcall target="git.revision">
+ <param name="param1" value="${root.folder}" />
+ <param name="param2" value="org.eclipse.osee" />
+ </antcall>
+ </then>
+ </if>
+
+ </target>
+
+ <target name="git.revision" description="Store git revision in ${repository.version}">
+ <exec executable="git" outputproperty="git.branch"
+ failifexecutionfails="false" errorproperty="git.error" dir="${param1}/${param2}">
+ <arg value="rev-parse" />
+ <arg value="--abbrev-ref" />
+ <arg value="HEAD" />
+ </exec>
+ <exec executable="git" outputproperty="git.revision"
+ failifexecutionfails="false" errorproperty="git.error" dir="${param1}/${param2}">
+ <arg value="log" />
+ <arg value="-1" />
+ <arg value="--pretty=format:%H,%cd" />
+ </exec>
+ <condition property="repository.version" value="${git.revision}"
+ else="unknown">
+ <and>
+ <isset property="git.revision" />
+ <length string="${git.revision}" trim="yes" length="0" when="greater" />
+ </and>
+ </condition>
+
+ <echo message="${param2},${git.branch},${repository.version}${line.separator}"
+ file="${versions.file}" append="true" />
+
+ </target>
+
+</project>
diff --git a/org.eclipse.osee.ote.parent/.project b/org.eclipse.osee.ote.parent/.project
new file mode 100644
index 000000000..338ba14d7
--- /dev/null
+++ b/org.eclipse.osee.ote.parent/.project
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ote.parent</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ </buildSpec>
+ <natures>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.parent/build.sh b/org.eclipse.osee.ote.parent/build.sh
new file mode 100644
index 000000000..6689a5be3
--- /dev/null
+++ b/org.eclipse.osee.ote.parent/build.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+mvn clean verify -Dosee.base.p2=$1 \ No newline at end of file
diff --git a/org.eclipse.osee.ote.parent/buildLocal.sh b/org.eclipse.osee.ote.parent/buildLocal.sh
new file mode 100644
index 000000000..31a8dea45
--- /dev/null
+++ b/org.eclipse.osee.ote.parent/buildLocal.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+export BASE_AREA=`pwd | sed 's/\/c\//\/c\:\//'`
+mvn clean verify -Dosee.x.core.p2=file://$BASE_AREA/../org.eclipse.osee.x.core.p2/target/repository -Dosee.base.p2=file://$BASE_AREA/../org.eclipse.osee.client.all.p2/target/repository \ No newline at end of file
diff --git a/org.eclipse.osee.ote.parent/pom.xml b/org.eclipse.osee.ote.parent/pom.xml
new file mode 100644
index 000000000..e57754d09
--- /dev/null
+++ b/org.eclipse.osee.ote.parent/pom.xml
@@ -0,0 +1,445 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>org.eclipse.osee</groupId>
+ <artifactId>org.eclipse.osee.ote.parent</artifactId>
+ <packaging>pom</packaging>
+ <name>OSEE OTE - Parent (Incubation)</name>
+ <version>0.25.3-SNAPSHOT</version>
+
+ <modules>
+ <module>../org.eclipse.osee.framework.ui.workspacebundleloader</module>
+ <module>../org.eclipse.osee.ote.master</module>
+ <module>../org.eclipse.osee.ote.master.test</module>
+ <module>../org.eclipse.osee.ote.master.rest</module>
+ <module>../org.eclipse.osee.ote.master.rest.client</module>
+ <module>../org.eclipse.osee.ote.master.rest.model</module>
+ <module>../org.eclipse.osee.ote.server.external.feature</module>
+ <module>../org.eclipse.osee.ote.master.feature</module>
+ <module>../org.eclipse.osee.ote.master.product</module>
+ <module>../org.eclipse.osee.ote.rest</module>
+ <module>../org.eclipse.osee.ote.rest.client</module>
+ <module>../org.eclipse.osee.ote.rest.model</module>
+ <module>../org.eclipse.osee.ote.properties</module>
+ <module>../org.eclipse.osee.ote.io</module>
+ <module>../org.eclipse.osee.ote.client</module>
+ <module>../org.eclipse.osee.ote.client.msg</module>
+ <module>../org.eclipse.osee.ote.connection.jini</module>
+ <module>../org.eclipse.osee.ote.connection.service</module>
+ <module>../org.eclipse.osee.ote.container</module>
+ <module>../org.eclipse.osee.ote.core</module>
+ <module>../org.eclipse.osee.ote.jms</module>
+ <module>../org.eclipse.osee.ote.messaging.dds</module>
+ <module>../org.eclipse.osee.ote.runtimeManager</module>
+ <module>../org.eclipse.osee.ote.server</module>
+ <module>../org.eclipse.osee.ote.ui</module>
+ <module>../org.eclipse.osee.ote.ui.builder</module>
+ <module>../org.eclipse.osee.ote.ui.markers</module>
+ <module>../org.eclipse.osee.ote.version</module>
+ <module>../org.eclipse.osee.ote.version.git</module>
+ <module>../org.eclipse.osee.ote.version.svn</module>
+ <module>../org.eclipse.osee.ote.ui.test.manager</module>
+ <module>../org.eclipse.osee.ote.feature</module>
+ <module>../org.eclipse.osee.client.ote.feature</module>
+ <module>../org.eclipse.osee.ote.p2</module>
+ </modules>
+
+
+ <properties>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+
+ <git-repo-root>file:../..</git-repo-root>
+ <build-alias>-DEV</build-alias>
+
+ <tycho-version>1.0.0</tycho-version>
+ <tycho-extras-version>1.0.0</tycho-extras-version>
+
+ <maven-antrun-version>1.6</maven-antrun-version>
+ <ant-contrib-version>1.0b3</ant-contrib-version>
+ <jsch-version>0.1.42</jsch-version>
+ <ant-jsch-version>1.8.2</ant-jsch-version>
+ <ant-commons-net-version>1.7.0</ant-commons-net-version>
+ <commons-net-version>1.4.1</commons-net-version>
+ <jacoco-version>0.5.3.201107060350</jacoco-version>
+ <findbugs-version>2.3.2</findbugs-version>
+ <pmd-version>2.5</pmd-version>
+ <checkstyle-version>2.6</checkstyle-version>
+ <javadoc-version>2.9.1</javadoc-version>
+ <build-helper-maven-plugin-version>1.7</build-helper-maven-plugin-version>
+ <maven-resources-version>2.5</maven-resources-version>
+
+ <jaxdoclet-version>0.9.0</jaxdoclet-version>
+ <jersey-version>1.17.1</jersey-version>
+ <jersey-wadlgen-version>1.17.1</jersey-wadlgen-version>
+ <jaxrs-version>1.1.1</jaxrs-version>
+ <maven-clean-version>2.5</maven-clean-version>
+ <xerces-version>2.6.1</xerces-version>
+
+ <jaxb2-maven-version>1.5</jaxb2-maven-version>
+
+ <jasmine-version>1.3.1.0</jasmine-version>
+
+ <platform-version-name>mars</platform-version-name>
+ <!-- <orbit-version>R20150124073747</orbit-version> -->
+ <orbit-version>R20130517111416</orbit-version>
+ <xtext-version>2.0.0</xtext-version>
+ <subversive-version>1.0</subversive-version>
+ <polarion-version>3.0</polarion-version>
+
+ <orbit-site>http://download.eclipse.org/tools/orbit/downloads/drops/${orbit-version}/repository</orbit-site>
+ <eclipse-site>http://download.eclipse.org/releases/${platform-version-name}</eclipse-site>
+ <itemis-site>http://download.itemis.com/updates/releases/${xtext-version}</itemis-site>
+
+ <osee-create-help-docs>false</osee-create-help-docs>
+
+
+
+ </properties>
+
+ <licenses>
+ <license>
+ <name>Eclipse Public License v1.0</name>
+ <comments>
+ 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.htm
+ </comments>
+ </license>
+ </licenses>
+
+ <organization>
+ <name>Eclipse Open System Engineering Environment</name>
+ <url>http://www.eclipse.org/osee</url>
+ </organization>
+
+ <build>
+ <sourceDirectory>src</sourceDirectory>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-maven-plugin</artifactId>
+ <version>${tycho-version}</version>
+ <extensions>true</extensions>
+ </plugin>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-packaging-plugin</artifactId>
+ <version>${tycho-version}</version>
+ <configuration>
+ <format>'v'yyyyMMddHHmm'${build-alias}'</format>
+ <archiveSite>true</archiveSite>
+ <environments>
+ <environment>
+ <os>win32</os>
+ <ws>win32</ws>
+ <arch>x86_64</arch>
+ </environment>
+ <environment>
+ <os>win32</os>
+ <ws>win32</ws>
+ <arch>x86</arch>
+ </environment>
+ <environment>
+ <os>linux</os>
+ <ws>gtk</ws>
+ <arch>x86</arch>
+ </environment>
+ <environment>
+ <os>linux</os>
+ <ws>gtk</ws>
+ <arch>x86_64</arch>
+ </environment>
+ </environments>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>target-platform-configuration</artifactId>
+ <version>${tycho-version}</version>
+ <configuration>
+ <filters>
+ <!-- Work around Equinox bug 348045 -->
+ <filter>
+ <type>p2-installable-unit</type>
+ <id>org.eclipse.equinox.servletbridge.extensionbundle</id>
+ <removeAll />
+ </filter>
+ </filters>
+ <resolver>p2</resolver>
+ <environments>
+ <environment>
+ <os>win32</os>
+ <ws>win32</ws>
+ <arch>x86_64</arch>
+ </environment>
+ <environment>
+ <os>win32</os>
+ <ws>win32</ws>
+ <arch>x86</arch>
+ </environment>
+ <environment>
+ <os>linux</os>
+ <ws>gtk</ws>
+ <arch>x86</arch>
+ </environment>
+ <environment>
+ <os>linux</os>
+ <ws>gtk</ws>
+ <arch>x86_64</arch>
+ </environment>
+ </environments>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-source-plugin</artifactId>
+ <version>${tycho-version}</version>
+ <executions>
+ <execution>
+ <id>plugin-source</id>
+ <goals>
+ <goal>plugin-source</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.eclipse.tycho.extras</groupId>
+ <artifactId>tycho-source-feature-plugin</artifactId>
+ <version>${tycho-extras-version}</version>
+ <executions>
+ <execution>
+ <id>source-feature</id>
+ <phase>package</phase>
+ <goals>
+ <goal>source-feature</goal>
+ </goals>
+ </execution>
+ </executions>
+ <!-- optional excludes -->
+ <configuration>
+ <excludes>
+ <plugin id="sourcefeature.bundle.nosource" />
+ <feature id="sourcefeature.feature.nosource" />
+ </excludes>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-p2-plugin</artifactId>
+ <version>${tycho-extras-version}</version>
+ <executions>
+ <execution>
+ <id>default-p2-metadata-default</id>
+ <configuration>
+ <attachP2Metadata>false</attachP2Metadata>
+ </configuration>
+ </execution>
+ <execution>
+ <id>attach-p2-metadata</id>
+ <goals>
+ <goal>p2-metadata</goal>
+ </goals>
+ <phase>package</phase>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ <pluginManagement>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-compiler-plugin</artifactId>
+ <version>${tycho-version}</version>
+ <configuration>
+ <source>1.8</source>
+ <target>1.8</target>
+ <encoding>UTF-8</encoding>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-source-plugin</artifactId>
+ <version>${tycho-version}</version>
+ <configuration>
+ <strictSrcIncludes>false</strictSrcIncludes>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.eclipse.tycho.extras</groupId>
+ <artifactId>tycho-source-feature-plugin</artifactId>
+ <version>${tycho-extras-version}</version>
+ </plugin>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-p2-plugin</artifactId>
+ <version>${tycho-version}</version>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-resources-plugin</artifactId>
+ <version>${maven-resources-version}</version>
+ <configuration>
+ <encoding>ISO-8859-1</encoding>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <version>${maven-antrun-version}</version>
+ <dependencies>
+ <dependency>
+ <groupId>ant-contrib</groupId>
+ <artifactId>ant-contrib</artifactId>
+ <version>${ant-contrib-version}</version>
+ <exclusions>
+ <exclusion>
+ <groupId>ant</groupId>
+ <artifactId>ant</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>com.jcraft</groupId>
+ <artifactId>jsch</artifactId>
+ <version>${jsch-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-jsch</artifactId>
+ <version>${ant-jsch-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>commons-net</groupId>
+ <artifactId>commons-net</artifactId>
+ <version>${commons-net-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-commons-net</artifactId>
+ <version>${ant-commons-net-version}</version>
+ </dependency>
+ </dependencies>
+ </plugin>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>build-helper-maven-plugin</artifactId>
+ <version>${build-helper-maven-plugin-version}</version>
+ </plugin>
+ <plugin>
+ <groupId>com.github.searls</groupId>
+ <artifactId>jasmine-maven-plugin</artifactId>
+ <version>${jasmine-version}</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>test</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </pluginManagement>
+ </build>
+
+ <profiles>
+ <profile>
+ <id>external-repos</id>
+ <activation>
+ <property>
+ <name>!no-extern-repos</name>
+ </property>
+ </activation>
+ <properties>
+ <eclipse-ip-site>${git-repo-root}/org.eclipse.ip/org.eclipse.ip.p2/target/repository</eclipse-ip-site>
+ </properties>
+ <repositories>
+ <repository>
+ <id>orbit</id>
+ <layout>p2</layout>
+ <url>${orbit-site}</url>
+ </repository>
+ <repository>
+ <id>eclipse</id>
+ <layout>p2</layout>
+ <url>${eclipse-site}</url>
+ </repository>
+ <repository>
+ <id>itemis</id>
+ <layout>p2</layout>
+ <url>${itemis-site}</url>
+ </repository>
+
+ <repository>
+ <id>eclipse-ip</id>
+ <layout>p2</layout>
+ <url>${eclipse-ip-site}</url>
+ </repository>
+ </repositories>
+ </profile>
+ <profile>
+ <id>client-external-p2</id>
+ <activation>
+ <property>
+ <name>osee-build-stage</name>
+ <value>!osee-all-server</value>
+ </property>
+ </activation>
+ <properties>
+ <!--<nebula-site>http://download.eclipse.org/technology/nebula/snapshot</nebula-site> -->
+ <!--<wikitext-site>http://download.eclipse.org/tools/mylyn/update/weekly</wikitext-site> -->
+ <!--<subversive-site>http://download.eclipse.org/technology/subversive/${subversive-version}/update-site</subversive-site> -->
+ <!-- <polarion-site>http://community.polarion.com/projects/subversive/download/eclipse/${polarion-version}/update-site</polarion-site> -->
+ <!-- <egit-site>http://download.eclipse.org/egit/updates</egit-site> -->
+ </properties>
+ <repositories>
+ <!-- <repository> <id>nebula</id> <layout>p2</layout> <url>${nebula-site}</url>
+ </repository> -->
+ <!-- <repository> <id>wikitext</id> <layout>p2</layout> <url>${wikitext-site}</url>
+ </repository> -->
+ <!-- <repository> <id>polarion</id> <layout>p2</layout> <url>${polarion-site}</url>
+ </repository> <repository> <id>subversive</id> <layout>p2</layout> <url>${subversive-site}</url>
+ </repository> -->
+ <!-- <repository> <id>egit</id> <layout>p2</layout> <url>${egit-site}</url>
+ </repository> -->
+ </repositories>
+ </profile>
+ <profile>
+ <id>osee.base.p2</id>
+ <activation>
+ <property>
+ <name>osee.base.p2</name>
+ </property>
+ </activation>
+ <repositories>
+ <repository>
+ <id>osee.base.p2</id>
+ <layout>p2</layout>
+ <url>${osee.base.p2}</url>
+ </repository>
+ </repositories>
+ </profile>
+ <profile>
+ <id>osee.x.core.p2</id>
+ <activation>
+ <property>
+ <name>osee.x.core.p2</name>
+ </property>
+ </activation>
+ <repositories>
+ <repository>
+ <id>osee.x.core.p2</id>
+ <layout>p2</layout>
+ <url>${osee.x.core.p2}</url>
+ </repository>
+ </repositories>
+ </profile>
+ </profiles>
+
+</project>
diff --git a/org.eclipse.osee.ote.properties/.classpath b/org.eclipse.osee.ote.properties/.classpath
new file mode 100644
index 000000000..1fa3e6803
--- /dev/null
+++ b/org.eclipse.osee.ote.properties/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.ote.properties/.project b/org.eclipse.osee.ote.properties/.project
new file mode 100644
index 000000000..0b97c2ca6
--- /dev/null
+++ b/org.eclipse.osee.ote.properties/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ote.properties</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.properties/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.properties/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..da313d9b9
--- /dev/null
+++ b/org.eclipse.osee.ote.properties/META-INF/MANIFEST.MF
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OTE Properties
+Bundle-SymbolicName: org.eclipse.osee.ote.properties
+Bundle-Version: 0.25.3.qualifier
+Require-Bundle: org.eclipse.core.runtime
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: org.eclipse.osee.ote.properties
diff --git a/org.eclipse.osee.ote.properties/build.properties b/org.eclipse.osee.ote.properties/build.properties
new file mode 100644
index 000000000..34d2e4d2d
--- /dev/null
+++ b/org.eclipse.osee.ote.properties/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .
diff --git a/org.eclipse.osee.ote.properties/pom.xml b/org.eclipse.osee.ote.properties/pom.xml
new file mode 100644
index 000000000..3bff00bcd
--- /dev/null
+++ b/org.eclipse.osee.ote.properties/pom.xml
@@ -0,0 +1,35 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.osee</groupId>
+ <artifactId>org.eclipse.osee.ote.parent</artifactId>
+ <version>0.25.3-SNAPSHOT</version>
+ <relativePath>../org.eclipse.osee.ote.parent</relativePath>
+ </parent>
+
+ <artifactId>org.eclipse.osee.ote.properties</artifactId>
+ <packaging>eclipse-plugin</packaging>
+ <name>OTE Properties</name>
+
+ <build>
+ <!-- workaround for https://issues.sonatype.org/browse/TYCHO-168 -->
+ <resources>
+ <resource>
+ <directory>src</directory>
+ <excludes>
+ <exclude>**/*.java</exclude>
+ </excludes>
+ </resource>
+ </resources>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-source-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.properties/src/org/eclipse/osee/ote/properties/OteProperties.java b/org.eclipse.osee.ote.properties/src/org/eclipse/osee/ote/properties/OteProperties.java
new file mode 100644
index 000000000..869ef86ca
--- /dev/null
+++ b/org.eclipse.osee.ote.properties/src/org/eclipse/osee/ote/properties/OteProperties.java
@@ -0,0 +1,8 @@
+package org.eclipse.osee.ote.properties;
+
+public interface OteProperties {
+ String getKey();
+ void setValue(String value);
+ String getValue();
+ String getValue(String defaultValue);
+}
diff --git a/org.eclipse.osee.ote.properties/src/org/eclipse/osee/ote/properties/OtePropertiesCore.java b/org.eclipse.osee.ote.properties/src/org/eclipse/osee/ote/properties/OtePropertiesCore.java
new file mode 100644
index 000000000..45c2cfda3
--- /dev/null
+++ b/org.eclipse.osee.ote.properties/src/org/eclipse/osee/ote/properties/OtePropertiesCore.java
@@ -0,0 +1,130 @@
+package org.eclipse.osee.ote.properties;
+
+public enum OtePropertiesCore implements OteProperties {
+
+ batchFolderDays("ote.batchfolder.days"),
+ brokerUriPort("ote.server.broker.uri.port"),
+ endpointPort("ote.endpoint.port"),
+ httpPort("org.osgi.service.http.port"),
+ ioRedirectFile("ote.io.redirect.file"),
+ ioRedirect("ote.io.redirect"),
+ ioRedirectPath("ote.io.redirect.path"),
+ javaIoTmpdir("java.io.tmpdir"),
+ lineSeparator("line.separator"),
+ masterURI("ote.master.uri"),
+ noStacktraceFilter("org.eclipse.osee.ote.core.noStacktraceFilter"),
+ outfilesLocation("osee.ote.outfiles"),
+ pingTimeout("ote.client.pingTimeout"),
+ serverConnectionTimeout("ote.server.connection.timeout"),
+ serverFactoryClass("osee.ote.server.factory.class"),
+ serverKeepalive("osee.ote.server.keepAlive"),
+ serverTitle("osee.ote.server.title"),
+ timeDebug("ote.time.debug", false),
+ abortMultipleInterrupt("ote.abort.interrupt.multiple", false),
+ timeDebugTimeout("ote.time.debug.timeout", 250000),
+ userHome("user.home"),
+ userName("user.name"),
+ oteServerFolder("osee.ote.server.folder"),
+ oteStationName("osee.ote.station.name"),
+ useLookup("osee.ote.use.lookup");
+
+ private String key;
+ private long defaultLong;
+ private boolean defaultBoolean;
+ private String defaultString;
+
+ private final boolean defaultValueSet;
+
+ OtePropertiesCore(String key){
+ this.key = key;
+ this.defaultValueSet = false;
+ }
+
+ OtePropertiesCore(String key, long defaultLong){
+ this.key = key;
+ this.defaultLong = defaultLong;
+ this.defaultValueSet = true;
+ }
+
+ OtePropertiesCore(String key, boolean defaultBoolean){
+ this.key = key;
+ this.defaultBoolean = defaultBoolean;
+ this.defaultValueSet = true;
+ }
+
+ OtePropertiesCore(String key, String defaultString){
+ this.key = key;
+ this.defaultString = defaultString;
+ this.defaultValueSet = true;
+ }
+
+ @Override
+ public String getKey() {
+ return key;
+ }
+
+ @Override
+ public void setValue(String value) {
+ System.setProperty(key, value);
+ }
+
+ @Override
+ public String getValue() {
+ return System.getProperty(key);
+ }
+
+ @Override
+ public String getValue(String defaultValue) {
+ return System.getProperty(key, defaultValue);
+ }
+
+ public long getLongValue(long defaultValue) {
+ long value = defaultValue;
+ String valueStr = System.getProperty(key);
+ try{
+ value = Long.parseLong(valueStr);
+ } catch (Throwable th){
+ }
+ return value;
+ }
+
+ public long getLongValue() {
+ if(!defaultValueSet){
+ throw new IllegalStateException("No default value set.");
+ }
+ long value = defaultLong;
+ String valueStr = System.getProperty(key);
+ try{
+ value = Long.parseLong(valueStr);
+ } catch (Throwable th){
+ }
+ return value;
+ }
+
+ public boolean getBooleanValue(boolean defaultValue) {
+ boolean value = defaultValue;
+ String valueStr = System.getProperty(key);
+ if(valueStr != null){
+ try{
+ value = Boolean.parseBoolean(valueStr);
+ } catch (Throwable th){
+ }
+ }
+ return value;
+ }
+
+ public boolean getBooleanValue() {
+ if(!defaultValueSet){
+ throw new IllegalStateException("No default value set.");
+ }
+ boolean value = defaultBoolean;
+ String valueStr = System.getProperty(key);
+ if(valueStr != null){
+ try{
+ value = Boolean.parseBoolean(valueStr);
+ } catch (Throwable th){
+ }
+ }
+ return value;
+ }
+}
diff --git a/org.eclipse.osee.ote.rest.client/.classpath b/org.eclipse.osee.ote.rest.client/.classpath
new file mode 100644
index 000000000..1fa3e6803
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.client/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.ote.rest.client/.project b/org.eclipse.osee.ote.rest.client/.project
new file mode 100644
index 000000000..8ed6bb712
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.client/.project
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ote.rest.client</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ds.core.builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.rest.client/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.rest.client/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..efed415ee
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.client/META-INF/MANIFEST.MF
@@ -0,0 +1,30 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OSEE OTE Rest Client (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.rest.client
+Bundle-Version: 0.25.3.qualifier
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Service-Component: OSGI-INF/*.xml
+Import-Package: javax.ws.rs;version="2.0.0",
+ javax.ws.rs.client;version="2.0.0",
+ javax.ws.rs.core;version="2.0.0",
+ org.apache.commons.lang.time,
+ org.eclipse.core.net.proxy,
+ org.eclipse.osee.framework.core.data,
+ org.eclipse.osee.framework.core.enums,
+ org.eclipse.osee.framework.core.exception,
+ org.eclipse.osee.framework.core.operation,
+ org.eclipse.osee.framework.core.util,
+ org.eclipse.osee.framework.jdk.core.type,
+ org.eclipse.osee.framework.jdk.core.util,
+ org.eclipse.osee.framework.jdk.core.util.network,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.osee.jaxrs.client,
+ org.eclipse.osee.ote.classserver,
+ org.eclipse.osee.ote.core
+Export-Package: org.eclipse.osee.ote.rest.client
+Bundle-ActivationPolicy: lazy
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.osee.ote.rest.model,
+ javax.servlet
diff --git a/org.eclipse.osee.ote.rest.client/OSGI-INF/ote.client.xml b/org.eclipse.osee.ote.rest.client/OSGI-INF/ote.client.xml
new file mode 100644
index 000000000..239d14858
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.client/OSGI-INF/ote.client.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="start" deactivate="stop" modified="update">
+ <implementation class="org.eclipse.osee.ote.rest.client.internal.OteClientImpl"/>
+ <service>
+ <provide interface="org.eclipse.osee.ote.rest.client.OteClient"/>
+ </service>
+</scr:component>
diff --git a/org.eclipse.osee.ote.rest.client/build.properties b/org.eclipse.osee.ote.rest.client/build.properties
new file mode 100644
index 000000000..c58ea2178
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.client/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ OSGI-INF/
diff --git a/org.eclipse.osee.ote.rest.client/pom.xml b/org.eclipse.osee.ote.rest.client/pom.xml
new file mode 100644
index 000000000..81abd92b6
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.client/pom.xml
@@ -0,0 +1,35 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.osee</groupId>
+ <artifactId>org.eclipse.osee.ote.parent</artifactId>
+ <version>0.25.3-SNAPSHOT</version>
+ <relativePath>../org.eclipse.osee.ote.parent</relativePath>
+ </parent>
+
+ <artifactId>org.eclipse.osee.ote.rest.client</artifactId>
+ <packaging>eclipse-plugin</packaging>
+ <name>OTE REST Client(Incubation)</name>
+
+ <build>
+ <!-- workaround for https://issues.sonatype.org/browse/TYCHO-168 -->
+ <resources>
+ <resource>
+ <directory>src</directory>
+ <excludes>
+ <exclude>**/*.java</exclude>
+ </excludes>
+ </resource>
+ </resources>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-source-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/BasicProgress.java b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/BasicProgress.java
new file mode 100644
index 000000000..295a0b6e9
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/BasicProgress.java
@@ -0,0 +1,55 @@
+package org.eclipse.osee.ote.rest.client;
+
+public class BasicProgress implements Progress {
+
+ private String fail;
+ private Throwable throwable;
+ private boolean success = false;
+ private int totalUnitsOfWork;
+ private int unitsWorked;
+
+ @Override
+ public void fail(String fail) {
+ this.fail = fail;
+ }
+
+ @Override
+ public void fail(Throwable th) {
+ this.throwable = th;
+ }
+
+ @Override
+ public void setUnitsOfWork(int totalUnitsOfWork) {
+ this.totalUnitsOfWork = totalUnitsOfWork;
+ }
+
+ @Override
+ public void setUnitsWorked(int unitsWorked) {
+ this.unitsWorked = unitsWorked;
+ }
+
+ @Override
+ public void success() {
+ success = true;
+ }
+
+ public String getFail() {
+ return fail;
+ }
+
+ public Throwable getThrowable() {
+ return throwable;
+ }
+
+ public boolean isSuccess() {
+ return success;
+ }
+
+ public int getTotalUnitsOfWork() {
+ return totalUnitsOfWork;
+ }
+
+ public int getUnitsWorked() {
+ return unitsWorked;
+ }
+}
diff --git a/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/ConfigurationStatusCallback.java b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/ConfigurationStatusCallback.java
new file mode 100644
index 000000000..e2db3ad8d
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/ConfigurationStatusCallback.java
@@ -0,0 +1,12 @@
+package org.eclipse.osee.ote.rest.client;
+
+public interface ConfigurationStatusCallback {
+
+ void fail(String string);
+ void fail(Throwable th);
+
+ void setUnitsOfWork(int totalUnitsOfWork);
+ void setUnitsWorked(int unitsWorked);
+ void success();
+
+}
diff --git a/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/GetFileProgress.java b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/GetFileProgress.java
new file mode 100644
index 000000000..525f1e6a8
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/GetFileProgress.java
@@ -0,0 +1,6 @@
+package org.eclipse.osee.ote.rest.client;
+
+
+public interface GetFileProgress extends Progress {
+
+}
diff --git a/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/OTECacheItem.java b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/OTECacheItem.java
new file mode 100644
index 000000000..b9b325152
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/OTECacheItem.java
@@ -0,0 +1,31 @@
+package org.eclipse.osee.ote.rest.client;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+
+import org.eclipse.osee.framework.jdk.core.util.ChecksumUtil;
+
+public class OTECacheItem {
+ private File file;
+ private String md5;
+
+ public OTECacheItem(File file, String md5){
+ this.file = file;
+ this.md5 = md5;
+ }
+
+ public OTECacheItem(File file) throws FileNotFoundException, Exception{
+ this.file = file;
+ md5 = ChecksumUtil.createChecksumAsString(new FileInputStream(file), "MD5");
+ }
+
+ public File getFile() {
+ return file;
+ }
+
+ public String getMd5() {
+ return md5;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/OteClient.java b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/OteClient.java
new file mode 100644
index 000000000..059bc44e5
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/OteClient.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2012 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.rest.client;
+
+import java.io.File;
+import java.net.URI;
+import java.util.List;
+import java.util.concurrent.Future;
+
+import org.eclipse.osee.ote.rest.model.OTEConfiguration;
+import org.eclipse.osee.ote.rest.model.OTETestRun;
+
+
+/**
+ * @author Andrew Finkbeiner
+ */
+public interface OteClient {
+ Future<Progress> getFile(URI uri, File destination, String filePath, final Progress progress);
+ Future<Progress> configureServerEnvironment(URI uri, List<File> jars, final Progress progress);
+ Future<Progress> configureServerEnvironment(URI uri, OTEConfiguration configuration, final Progress progress);
+ Future<Progress> updateServerJarCache(URI uri, String baseJarURL, List<OTECacheItem> jars, final Progress progress);
+ Future<ProgressWithCancel> runTest(URI uri, OTETestRun tests, Progress progress);
+}
diff --git a/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/Progress.java b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/Progress.java
new file mode 100644
index 000000000..095e40e0c
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/Progress.java
@@ -0,0 +1,11 @@
+package org.eclipse.osee.ote.rest.client;
+
+public interface Progress {
+
+ void fail(String string);
+ void fail(Throwable th);
+
+ void setUnitsOfWork(int totalUnitsOfWork);
+ void setUnitsWorked(int unitsWorked);
+ void success();
+}
diff --git a/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/ProgressWithCancel.java b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/ProgressWithCancel.java
new file mode 100644
index 000000000..72d8722b8
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/ProgressWithCancel.java
@@ -0,0 +1,9 @@
+package org.eclipse.osee.ote.rest.client;
+
+public interface ProgressWithCancel extends Progress {
+
+ boolean cancelAll();
+
+ boolean cancelSingle();
+
+}
diff --git a/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/internal/BaseClientCallable.java b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/internal/BaseClientCallable.java
new file mode 100644
index 000000000..7ed3ffa79
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/internal/BaseClientCallable.java
@@ -0,0 +1,27 @@
+package org.eclipse.osee.ote.rest.client.internal;
+
+import java.util.concurrent.Callable;
+import org.eclipse.osee.ote.rest.client.Progress;
+
+public abstract class BaseClientCallable<T extends Progress> implements Callable<T>{
+
+ private T progress;
+
+ public BaseClientCallable(T progress) {
+ this.progress = progress;
+ }
+
+ @Override
+ final public T call() throws Exception {
+ try{
+ doWork();
+ progress.success();
+ } catch (Throwable th){
+ progress.fail(th);
+ }
+ return progress;
+ }
+
+ public abstract void doWork() throws Exception;
+
+}
diff --git a/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/internal/ConfigureOteServer.java b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/internal/ConfigureOteServer.java
new file mode 100644
index 000000000..397fb3eb0
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/internal/ConfigureOteServer.java
@@ -0,0 +1,114 @@
+package org.eclipse.osee.ote.rest.client.internal;
+
+import java.io.File;
+import java.net.InetAddress;
+import java.net.URI;
+import java.util.List;
+
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.UriBuilder;
+
+import org.eclipse.osee.framework.jdk.core.util.network.PortUtil;
+import org.eclipse.osee.jaxrs.client.JaxRsClient;
+import org.eclipse.osee.jaxrs.client.JaxRsWebTarget;
+import org.eclipse.osee.ote.classserver.HeadlessClassServer;
+import org.eclipse.osee.ote.core.BundleInfo;
+import org.eclipse.osee.ote.rest.client.Progress;
+import org.eclipse.osee.ote.rest.model.OTEConfiguration;
+import org.eclipse.osee.ote.rest.model.OTEConfigurationIdentity;
+import org.eclipse.osee.ote.rest.model.OTEConfigurationItem;
+import org.eclipse.osee.ote.rest.model.OTEJobStatus;
+
+public class ConfigureOteServer extends BaseClientCallable<Progress> {
+
+ private static final long POLLING_RATE = 1000;
+ private final URI uri;
+ private List<File> jars;
+ private final Progress progress;
+ private final JaxRsClient factory;
+ private OTEJobStatus status;
+ private HeadlessClassServer classServer;
+ private OTEConfiguration configuration;
+
+ public ConfigureOteServer(URI uri, List<File> jars, Progress progress, JaxRsClient factory) {
+ super(progress);
+ this.uri = uri;
+ this.jars = jars;
+ this.progress = progress;
+ this.factory = factory;
+ }
+
+ public ConfigureOteServer(URI uri, OTEConfiguration configuration, Progress progress, JaxRsClient factory) {
+ super(progress);
+ this.uri = uri;
+ this.configuration = configuration;
+ this.progress = progress;
+ this.factory = factory;
+ }
+
+ @Override
+ public void doWork() throws Exception {
+ try {
+ status = sendBundleConfiguration();
+ if (!status.isJobComplete()) {
+ waitForJobComplete();
+ }
+
+ if (!status.isSuccess()) {
+ throw new Exception("Failed to configure the environment: " + status.getErrorLog());
+ }
+ } finally {
+ if (classServer != null) {
+ classServer.stop();
+ }
+ }
+ }
+
+ private void waitForJobComplete() throws Exception {
+
+ URI jobUri = status.getUpdatedJobStatus().toURI();
+ final JaxRsWebTarget service = factory.target(jobUri);
+
+ while (!status.isJobComplete()) {
+ Thread.sleep(POLLING_RATE);
+ status = service.request(MediaType.APPLICATION_JSON).get(OTEJobStatus.class);
+ progress.setUnitsOfWork(status.getTotalUnitsOfWork());
+ progress.setUnitsWorked(status.getUnitsWorked());
+ }
+ }
+
+ private OTEJobStatus sendBundleConfiguration() throws Exception {
+ URI targetUri = UriBuilder.fromUri(uri).path("ote").path("config").build();
+
+ if (configuration == null) {
+ OTEConfiguration localConfiguration = new OTEConfiguration();
+ OTEConfigurationIdentity identity = new OTEConfigurationIdentity();
+ identity.setName("test");
+ localConfiguration.setIdentity(identity);
+ classServer = new HeadlessClassServer(PortUtil.getInstance().getValidPort(), InetAddress.getLocalHost(), jars);
+ for (BundleInfo bundleInfo : classServer.getBundles()) {
+ OTEConfigurationItem item = new OTEConfigurationItem();
+ item.setBundleName(bundleInfo.getSymbolicName());
+ item.setBundleVersion(bundleInfo.getVersion());
+ item.setLocationUrl(bundleInfo.getServerBundleLocation().toString());
+ item.setMd5Digest(bundleInfo.getMd5Digest());
+ localConfiguration.addItem(item);
+ }
+ OTEConfiguration currentConfig =
+ factory.target(targetUri).request(MediaType.APPLICATION_JSON).get(OTEConfiguration.class);
+ if (currentConfig.equals(localConfiguration)) {
+ OTEJobStatus status = new OTEJobStatus();
+ status.setSuccess(true);
+ status.setJobComplete(true);
+ return status;
+ } else {
+ return factory.target(targetUri).request(MediaType.APPLICATION_JSON).post(Entity.xml(localConfiguration),
+ OTEJobStatus.class);
+ }
+ } else {
+ return factory.target(targetUri).request(MediaType.APPLICATION_JSON).post(Entity.xml(configuration),
+ OTEJobStatus.class);
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/internal/GetOteServerFile.java b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/internal/GetOteServerFile.java
new file mode 100644
index 000000000..afd6b2053
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/internal/GetOteServerFile.java
@@ -0,0 +1,51 @@
+package org.eclipse.osee.ote.rest.client.internal;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.net.URI;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+import javax.ws.rs.core.UriBuilder;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.jaxrs.client.JaxRsClient;
+import org.eclipse.osee.ote.rest.client.Progress;
+
+public class GetOteServerFile extends BaseClientCallable<Progress> {
+
+ private final URI uri;
+ private final String filePath;
+ @SuppressWarnings("unused")
+ private final Progress progress;
+ private final JaxRsClient factory;
+ private final File destination;
+
+ public GetOteServerFile(URI uri, File destination, String filePath, Progress progress, JaxRsClient factory) {
+ super(progress);
+ this.uri = uri;
+ this.filePath = filePath;
+ this.progress = progress;
+ this.factory = factory;
+ this.destination = destination;
+ }
+
+ @Override
+ public void doWork() throws Exception {
+ URI targetUri = UriBuilder.fromUri(uri).path("ote").path("file").queryParam("path", filePath).build();
+
+ Response response = factory.target(targetUri).request(MediaType.APPLICATION_XML).get();
+ if (response.getStatus() == Status.OK.getStatusCode()) {
+ InputStream is = (InputStream) response.getEntity();
+ FileOutputStream fos = new FileOutputStream(destination);
+ try {
+ Lib.inputStreamToOutputStream(is, fos);
+ } finally {
+ Lib.close(fos);
+ }
+ } else {
+ throw new Exception(response.toString());
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/internal/OteClientImpl.java b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/internal/OteClientImpl.java
new file mode 100644
index 000000000..27c78ec8c
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/internal/OteClientImpl.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2012 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.rest.client.internal;
+
+import java.io.File;
+import java.net.URI;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.ThreadFactory;
+import org.eclipse.osee.jaxrs.client.JaxRsClient;
+import org.eclipse.osee.ote.rest.client.OTECacheItem;
+import org.eclipse.osee.ote.rest.client.OteClient;
+import org.eclipse.osee.ote.rest.client.Progress;
+import org.eclipse.osee.ote.rest.client.ProgressWithCancel;
+import org.eclipse.osee.ote.rest.model.OTEConfiguration;
+import org.eclipse.osee.ote.rest.model.OTETestRun;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class OteClientImpl implements OteClient {
+
+ private ExecutorService executor;
+ private volatile JaxRsClient client;
+
+ public void start(Map<String, Object> props) {
+ executor = Executors.newCachedThreadPool(new ThreadFactory() {
+ @Override
+ public Thread newThread(Runnable arg0) {
+ Thread th = new Thread(arg0);
+ th.setName("OTE Client " + th.getId());
+ th.setDaemon(true);
+ return th;
+ }
+ });
+ update(props);
+ }
+
+ public void stop() {
+ if (executor != null) {
+ executor.shutdown();
+ }
+ client = null;
+ }
+
+ public void update(Map<String, Object> props) {
+ client = JaxRsClient.newBuilder().properties(props).build();
+ }
+
+ @Override
+ public Future<Progress> getFile(URI uri, File destination, String filePath, final Progress progress) {
+ return executor.submit(new GetOteServerFile(uri, destination, filePath, progress, client));
+ }
+
+ @Override
+ public Future<Progress> configureServerEnvironment(URI uri, List<File> jars, final Progress progress) {
+ return executor.submit(new ConfigureOteServer(uri, jars, progress, client));
+ }
+
+ @Override
+ public Future<Progress> updateServerJarCache(URI uri, String baseJarURL, List<OTECacheItem> jars, Progress progress) {
+ return executor.submit(new PrepareOteServerFile(uri, baseJarURL, jars, progress, client));
+ }
+
+ @Override
+ public Future<ProgressWithCancel> runTest(URI uri, OTETestRun tests, Progress progress) {
+ return executor.submit(new RunTests(uri, tests, progress, client));
+ }
+
+ @Override
+ public Future<Progress> configureServerEnvironment(URI uri, OTEConfiguration configuration, Progress progress) {
+ return executor.submit(new ConfigureOteServer(uri, configuration, progress, client));
+ }
+
+}
diff --git a/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/internal/PrepareOteServerFile.java b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/internal/PrepareOteServerFile.java
new file mode 100644
index 000000000..59a4a1d62
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/internal/PrepareOteServerFile.java
@@ -0,0 +1,79 @@
+package org.eclipse.osee.ote.rest.client.internal;
+
+import java.net.URI;
+import java.util.List;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.UriBuilder;
+import org.eclipse.osee.jaxrs.client.JaxRsClient;
+import org.eclipse.osee.jaxrs.client.JaxRsWebTarget;
+import org.eclipse.osee.ote.rest.client.OTECacheItem;
+import org.eclipse.osee.ote.rest.client.Progress;
+import org.eclipse.osee.ote.rest.model.OTEConfiguration;
+import org.eclipse.osee.ote.rest.model.OTEConfigurationIdentity;
+import org.eclipse.osee.ote.rest.model.OTEConfigurationItem;
+import org.eclipse.osee.ote.rest.model.OTEJobStatus;
+
+public class PrepareOteServerFile extends BaseClientCallable<Progress> {
+
+ private static final long POLLING_RATE = 1000;
+ private final URI uri;
+ private final List<OTECacheItem> jars;
+ private final Progress progress;
+ private final JaxRsClient factory;
+ private OTEJobStatus status;
+ private final String baseJarURL;
+
+ public PrepareOteServerFile(URI uri, String baseJarURL, List<OTECacheItem> jars, Progress progress, JaxRsClient factory) {
+ super(progress);
+ this.uri = uri;
+ this.jars = jars;
+ this.progress = progress;
+ this.factory = factory;
+ this.baseJarURL = baseJarURL;
+ }
+
+ @Override
+ public void doWork() throws Exception {
+ status = sendBundleConfiguration();
+ if (!status.isJobComplete()) {
+ waitForJobComplete();
+ }
+
+ if (!status.isSuccess()) {
+ throw new Exception("Failed to update the environment cache: " + status.getErrorLog());
+ }
+ }
+
+ private void waitForJobComplete() throws Exception {
+
+ URI jobUri = status.getUpdatedJobStatus().toURI();
+ JaxRsWebTarget service = factory.target(jobUri);
+
+ while (!status.isJobComplete()) {
+ Thread.sleep(POLLING_RATE);
+ status = service.request(MediaType.APPLICATION_JSON).get(OTEJobStatus.class);
+ progress.setUnitsOfWork(status.getTotalUnitsOfWork());
+ progress.setUnitsWorked(status.getUnitsWorked());
+ }
+ }
+
+ private OTEJobStatus sendBundleConfiguration() throws Exception {
+ OTEConfiguration configuration = new OTEConfiguration();
+ OTEConfigurationIdentity identity = new OTEConfigurationIdentity();
+ identity.setName("test");
+ configuration.setIdentity(identity);
+ for (OTECacheItem bundleInfo : jars) {
+ OTEConfigurationItem item = new OTEConfigurationItem();
+ item.setBundleName(bundleInfo.getFile().getName());
+ item.setBundleVersion("N/A");
+ item.setLocationUrl(baseJarURL + bundleInfo.getMd5());
+ item.setMd5Digest(bundleInfo.getMd5());
+ configuration.addItem(item);
+ }
+ URI targetUri = UriBuilder.fromUri(uri).path("ote").path("cache").build();
+ return factory.target(targetUri).request(MediaType.APPLICATION_JSON).post(Entity.json(configuration),
+ OTEJobStatus.class);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/internal/RunTests.java b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/internal/RunTests.java
new file mode 100644
index 000000000..f28be5973
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.client/src/org/eclipse/osee/ote/rest/client/internal/RunTests.java
@@ -0,0 +1,108 @@
+package org.eclipse.osee.ote.rest.client.internal;
+
+import java.net.URI;
+import java.util.concurrent.Callable;
+import java.util.logging.Level;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.UriBuilder;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.jaxrs.client.JaxRsClient;
+import org.eclipse.osee.ote.rest.client.Progress;
+import org.eclipse.osee.ote.rest.client.ProgressWithCancel;
+import org.eclipse.osee.ote.rest.model.OTEJobStatus;
+import org.eclipse.osee.ote.rest.model.OTETestRun;
+
+public class RunTests implements ProgressWithCancel, Callable<ProgressWithCancel> {
+
+ private final URI uri;
+ private final OTETestRun tests;
+ private final Progress progress;
+ private final JaxRsClient factory;
+ private OTEJobStatus status;
+ private String id;
+
+ public RunTests(URI uri, OTETestRun tests, Progress progress, JaxRsClient factory) {
+ this.uri = uri;
+ this.tests = tests;
+ this.progress = progress;
+ this.factory = factory;
+ }
+
+ public void doWork() throws Exception {
+ status = sendCommand();
+ id = status.getJobId();
+ if (!status.isSuccess()) {
+ throw new Exception("Failed to submit the run command: " + status.getErrorLog());
+ }
+ }
+
+ @Override
+ public boolean cancelSingle() {
+ URI targetUri = UriBuilder.fromUri(uri).path("ote").path("run").path("{run-id}").build(id);
+ try {
+ OTEJobStatus cancelStatus =
+ factory.target(targetUri).request(MediaType.APPLICATION_JSON).put(Entity.json(""), OTEJobStatus.class);
+ return cancelStatus.isSuccess();
+ } catch (Exception e) {
+ OseeLog.log(getClass(), Level.SEVERE, e);
+ return false;
+ }
+ }
+
+ private OTEJobStatus sendCommand() throws Exception {
+ URI targetUri = UriBuilder.fromUri(uri).path("ote").path("run").build();
+ return factory.target(targetUri).request(MediaType.APPLICATION_JSON).post(Entity.json(tests), OTEJobStatus.class);
+ }
+
+ @Override
+ public boolean cancelAll() {
+ URI targetUri = UriBuilder.fromUri(uri).path("ote").path("run").path("{run-id}").build(id);
+
+ try {
+ OTEJobStatus cancelStatus =
+ factory.target(targetUri).request(MediaType.APPLICATION_JSON).delete(OTEJobStatus.class);
+ return cancelStatus.isSuccess();
+ } catch (Exception e) {
+ OseeLog.log(getClass(), Level.SEVERE, e);
+ return false;
+ }
+ }
+
+ @Override
+ final public ProgressWithCancel call() throws Exception {
+ try {
+ doWork();
+ progress.success();
+ } catch (Throwable th) {
+ progress.fail(th);
+ }
+ return this;
+ }
+
+ @Override
+ public void fail(String string) {
+ progress.fail(string);
+ }
+
+ @Override
+ public void fail(Throwable th) {
+ progress.fail(th);
+ }
+
+ @Override
+ public void setUnitsOfWork(int totalUnitsOfWork) {
+ progress.setUnitsOfWork(totalUnitsOfWork);
+ }
+
+ @Override
+ public void setUnitsWorked(int unitsWorked) {
+ progress.setUnitsWorked(unitsWorked);
+ }
+
+ @Override
+ public void success() {
+ progress.success();
+ }
+
+}
diff --git a/org.eclipse.osee.ote.rest.model/.classpath b/org.eclipse.osee.ote.rest.model/.classpath
new file mode 100644
index 000000000..1fa3e6803
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.model/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.ote.rest.model/.project b/org.eclipse.osee.ote.rest.model/.project
new file mode 100644
index 000000000..a8ae5b42c
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.model/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ote.rest.model</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.rest.model/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.rest.model/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..e4e871521
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.model/META-INF/MANIFEST.MF
@@ -0,0 +1,14 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OSEE OTE Rest Model (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.rest.model
+Bundle-Version: 0.25.3.qualifier
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: org.eclipse.osee.ote.rest.model
+Import-Package: javax.xml.bind.annotation,
+ org.eclipse.osee.framework.core.exception,
+ org.eclipse.osee.framework.core.util,
+ org.eclipse.osee.framework.jdk.core.util
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.osee.framework.core
diff --git a/org.eclipse.osee.ote.rest.model/build.properties b/org.eclipse.osee.ote.rest.model/build.properties
new file mode 100644
index 000000000..34d2e4d2d
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.model/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .
diff --git a/org.eclipse.osee.ote.rest.model/pom.xml b/org.eclipse.osee.ote.rest.model/pom.xml
new file mode 100644
index 000000000..163c7ddf9
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.model/pom.xml
@@ -0,0 +1,35 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.osee</groupId>
+ <artifactId>org.eclipse.osee.ote.parent</artifactId>
+ <version>0.25.3-SNAPSHOT</version>
+ <relativePath>../org.eclipse.osee.ote.parent</relativePath>
+ </parent>
+
+ <artifactId>org.eclipse.osee.ote.rest.model</artifactId>
+ <packaging>eclipse-plugin</packaging>
+ <name>OTE RESTModel(Incubation)</name>
+
+ <build>
+ <!-- workaround for https://issues.sonatype.org/browse/TYCHO-168 -->
+ <resources>
+ <resource>
+ <directory>src</directory>
+ <excludes>
+ <exclude>**/*.java</exclude>
+ </excludes>
+ </resource>
+ </resources>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-source-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/KeyValue.java b/org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/KeyValue.java
new file mode 100644
index 000000000..9726e7d4b
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/KeyValue.java
@@ -0,0 +1,62 @@
+package org.eclipse.osee.ote.rest.model;
+
+import java.util.Arrays;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement
+public class KeyValue {
+
+ private String key;
+ private String value;
+
+ private List<String> values;
+
+ public KeyValue(){
+
+ }
+
+ public KeyValue(String key, String value){
+ this.key = key;
+ this.value = value;
+ }
+
+ public KeyValue(String key, List<String> values) {
+ this.key = key;
+ this.values = values;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ @XmlElementWrapper
+ @XmlElement(name="Values")
+ public List<String> getValues() {
+ return values;
+ }
+
+ public List<String> setValues(List<String> values) {
+ return this.values = values;
+ }
+
+ public void setValueArray(List<String> values) {
+ this.values = values;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/OTEConfiguration.java b/org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/OTEConfiguration.java
new file mode 100644
index 000000000..483f5d44e
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/OTEConfiguration.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright (c) 2012 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.rest.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+@XmlRootElement
+public class OTEConfiguration {
+
+ private OTEConfigurationIdentity identity;
+
+ private List<OTEConfigurationItem> items;
+
+ private boolean install;
+
+ public OTEConfiguration(){
+ items = new ArrayList<>();
+ this.install = true;
+ }
+
+ public OTEConfigurationIdentity getIdentity(){
+ return identity;
+ }
+
+ @XmlElementWrapper
+ @XmlElement(name="OTEConfigurationItem")
+ public List<OTEConfigurationItem> getItems(){
+ return items;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((identity == null) ? 0 : identity.hashCode());
+ result = prime * result + ((items == null) ? 0 : items.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ OTEConfiguration other = (OTEConfiguration) obj;
+// if (identity == null) {
+// if (other.identity != null)
+// return false;
+// } else if (!identity.equals(other.identity))
+// return false;
+ if (items == null) {
+ if (other.items != null)
+ return false;
+ } else if (!items.equals(other.items))
+ return false;
+ return true;
+ }
+
+ public void setIdentity(OTEConfigurationIdentity identity) {
+ this.identity = identity;
+ }
+
+ public void addItem(OTEConfigurationItem item){
+ items.add(item);
+ }
+
+ public void setInstall(boolean install) {
+ this.install = install;
+ }
+
+ public boolean getInstall(){
+ return this.install;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/OTEConfigurationIdentity.java b/org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/OTEConfigurationIdentity.java
new file mode 100644
index 000000000..7c104d4d9
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/OTEConfigurationIdentity.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2012 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.rest.model;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * @author Roberto E. Escobar
+ */
+@XmlRootElement
+public class OTEConfigurationIdentity {
+ private String uuid;
+ private String name;
+
+ public String getUuid() {
+ return uuid;
+ }
+
+ public void setUuid(String uuid) {
+ this.uuid = uuid;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+}
diff --git a/org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/OTEConfigurationItem.java b/org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/OTEConfigurationItem.java
new file mode 100644
index 000000000..4dba4b9ac
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/OTEConfigurationItem.java
@@ -0,0 +1,99 @@
+package org.eclipse.osee.ote.rest.model;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement
+public class OTEConfigurationItem {
+
+ private String locationUrl;
+ private String md5Digest;
+ private String bundleVersion;
+ private String bundleName;
+ private boolean isOsgiBundle;
+
+ public String getLocationUrl() {
+ return locationUrl;
+ }
+ public void setLocationUrl(String locationUrl) {
+ this.locationUrl = locationUrl;
+ }
+ public String getMd5Digest() {
+ return md5Digest;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((bundleName == null) ? 0 : bundleName.hashCode());
+ result = prime * result + ((bundleVersion == null) ? 0 : bundleVersion.hashCode());
+ result = prime * result + (isOsgiBundle ? 1231 : 1237);
+ result = prime * result + ((locationUrl == null) ? 0 : locationUrl.hashCode());
+ result = prime * result + ((md5Digest == null) ? 0 : md5Digest.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ OTEConfigurationItem other = (OTEConfigurationItem) obj;
+ if (bundleName == null) {
+ if (other.bundleName != null)
+ return false;
+ } else if (!bundleName.equals(other.bundleName))
+ return false;
+ if (bundleVersion == null) {
+ if (other.bundleVersion != null)
+ return false;
+ } else if (!bundleVersion.equals(other.bundleVersion))
+ return false;
+ if (isOsgiBundle != other.isOsgiBundle)
+ return false;
+ if (locationUrl == null) {
+ if (other.locationUrl != null)
+ return false;
+ } else if (!locationUrl.equals(other.locationUrl))
+ return false;
+ if (md5Digest == null) {
+ if (other.md5Digest != null)
+ return false;
+ } else if (!md5Digest.equals(other.md5Digest))
+ return false;
+ return true;
+ }
+ public void setMd5Digest(String md5Digest) {
+ this.md5Digest = md5Digest;
+ }
+ public String getBundleVersion() {
+ return bundleVersion;
+ }
+ public void setBundleVersion(String bundleVersion) {
+ this.bundleVersion = bundleVersion;
+ }
+ public String getBundleName() {
+ return bundleName;
+ }
+ public void setBundleName(String bundleName) {
+ this.bundleName = bundleName;
+ }
+ public String getSymbolicName() {
+ return bundleName;
+ }
+ public String getVersion() {
+ return bundleVersion;
+ }
+
+ public boolean isOsgiBundle() {
+ return isOsgiBundle;
+ }
+ public void setOsgiBundle(boolean isOsgiBundle) {
+ this.isOsgiBundle = isOsgiBundle;
+ }
+
+
+}
diff --git a/org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/OTEJobStatus.java b/org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/OTEJobStatus.java
new file mode 100644
index 000000000..833ce5d2c
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/OTEJobStatus.java
@@ -0,0 +1,91 @@
+package org.eclipse.osee.ote.rest.model;
+
+import java.net.URL;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement
+public class OTEJobStatus {
+
+ private URL updatedJobStatus;
+ private String jobId;
+
+ private int totalUnitsOfWork;
+ private int unitsWorked;
+ private String errorLog;
+ private boolean jobComplete;
+ private boolean success;
+
+ public OTEJobStatus(){
+ errorLog = "";
+ jobComplete = false;
+ success = true;
+ totalUnitsOfWork = 0;
+ unitsWorked = 0;
+ }
+
+ public int getTotalUnitsOfWork() {
+ return totalUnitsOfWork;
+ }
+
+ public int getUnitsWorked() {
+ return unitsWorked;
+ }
+
+ public String getErrorLog() {
+ return errorLog;
+ }
+
+ public boolean isJobComplete() {
+ return jobComplete;
+ }
+
+ public void setTotalUnitsOfWork(int i) {
+ totalUnitsOfWork = i;
+ }
+
+ public void jobComplete() {
+ jobComplete = true;
+ }
+
+ public void incrememtUnitsWorked() {
+ unitsWorked++;
+ }
+
+ public void setUnitsWorked(int unitsWorked) {
+ this.unitsWorked = unitsWorked;
+ }
+
+ public void setErrorLog(String log) {
+ this.errorLog = log;
+ }
+
+ public void setJobComplete(boolean jobComplete) {
+ this.jobComplete = jobComplete;
+ }
+
+ public boolean isSuccess() {
+ return success;
+ }
+
+ public void setSuccess(boolean success) {
+ this.success = success;
+ }
+
+ public URL getUpdatedJobStatus() {
+ return updatedJobStatus;
+ }
+
+ public void setUpdatedJobStatus(URL updatedJobStatus) {
+ this.updatedJobStatus = updatedJobStatus;
+ }
+
+ public String getJobId() {
+ return jobId;
+ }
+
+ public void setJobId(String jobId) {
+ this.jobId = jobId;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/OTETestRun.java b/org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/OTETestRun.java
new file mode 100644
index 000000000..412a05322
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/OTETestRun.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2012 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.rest.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+@XmlRootElement
+public class OTETestRun {
+
+ private OTEConfiguration jarConfiguration;
+ private Properties globalProperties;
+ private List<Properties> tests;
+
+ public OTETestRun(){
+ tests = new ArrayList<>();
+ globalProperties = new Properties();
+ }
+
+ public Properties getGlobalProperties(){
+ return globalProperties;
+ }
+
+ @XmlElementWrapper
+ @XmlElement(name="Properties")
+ public List<Properties> getTests(){
+ return tests;
+ }
+
+ public void setGlobalProperties(Properties globalProperties) {
+ this.globalProperties = globalProperties;
+ }
+
+ public void addTest(Properties test){
+ tests.add(test);
+ }
+
+ public OTEConfiguration getJarConfiguration() {
+ return jarConfiguration;
+ }
+
+ public void setJarConfiguration(OTEConfiguration jarConfiguration) {
+ this.jarConfiguration = jarConfiguration;
+ }
+
+
+}
diff --git a/org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/Properties.java b/org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/Properties.java
new file mode 100644
index 000000000..8a205ab6c
--- /dev/null
+++ b/org.eclipse.osee.ote.rest.model/src/org/eclipse/osee/ote/rest/model/Properties.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright (c) 2012 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.rest.model;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+@XmlRootElement
+public class Properties {
+
+ private List<KeyValue> pairs;
+
+ public Properties(){
+ pairs = new ArrayList<>();
+ }
+
+ public Properties(String simpleName) {
+ this();
+ }
+
+ @XmlElementWrapper
+ @XmlElement(name="Pair")
+ public List<KeyValue> getPairs(){
+ return pairs;
+ }
+
+ public List<KeyValue> setPairs(List<KeyValue> pairs){
+ return this.pairs = pairs;
+ }
+
+ public void addPair(KeyValue pair){
+ pairs.add(pair);
+ }
+
+ public void put(String key, boolean value) {
+ put(key, Boolean.toString(value));
+ }
+
+ public void put(String key, String value) {
+ KeyValue pair = findPair(key);
+ if(pair == null){
+ pairs.add(new KeyValue(key, value));
+ } else {
+ pair.setValueArray(null);
+ pair.setValue(value);
+ }
+ }
+
+ public void put(String key, List<String> values) {
+ KeyValue pair = findPair(key);
+ if(pair == null){
+ pairs.add(new KeyValue(key, values));
+ } else {
+ pair.setValueArray(values);
+ pair.setValue(null);
+ }
+ }
+
+ public void put(String key, String[] values) {
+ put(key, Arrays.asList(values));
+ }
+
+ private KeyValue findPair(String key) {
+ for(KeyValue pair:pairs){
+ if(pair.getKey().equals(key)){
+ return pair;
+ }
+ }
+ return null;
+ }
+
+ public String get(String key) {
+ KeyValue pair = findPair(key);
+ if(pair != null){
+ return pair.getValue();
+ }
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.rest/.classpath b/org.eclipse.osee.ote.rest/.classpath
new file mode 100644
index 000000000..1fa3e6803
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.ote.rest/.project b/org.eclipse.osee.ote.rest/.project
new file mode 100644
index 000000000..e388ba0b5
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/.project
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ote.rest</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ds.core.builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.rest/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.rest/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..398e173c6
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/META-INF/MANIFEST.MF
@@ -0,0 +1,21 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OSEE OTE Rest (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.rest
+Bundle-Version: 0.25.3.qualifier
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Service-Component: OSGI-INF/*.xml
+Import-Package: javax.ws.rs,
+ javax.ws.rs.core,
+ javax.ws.rs.ext,
+ org.eclipse.osee.framework.core.exception,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.osee.ote,
+ org.eclipse.osee.ote.core,
+ org.eclipse.osee.ote.core.environment,
+ org.eclipse.osee.ote.core.framework.command,
+ org.eclipse.osee.ote.io,
+ org.eclipse.osee.ote.rest.model
+Require-Bundle: org.eclipse.osee.framework.jdk.core,
+ org.eclipse.core.runtime
diff --git a/org.eclipse.osee.ote.rest/OSGI-INF/ote.configuration.store.xml b/org.eclipse.osee.ote.rest/OSGI-INF/ote.configuration.store.xml
new file mode 100644
index 000000000..b3dcec39f
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/OSGI-INF/ote.configuration.store.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="org.eclipse.osee.ote.rest.configuration">
+ <implementation class="org.eclipse.osee.ote.rest.internal.OteConfigurationStoreImpl"/>
+ <service>
+ <provide interface="org.eclipse.osee.ote.rest.internal.OteConfigurationStore"/>
+ </service>
+ <reference bind="bindOTEApi" cardinality="1..1" interface="org.eclipse.osee.ote.OTEApi" name="OTEApi" policy="static" unbind="unbindOTEApi"/>
+ <reference bind="bindOteJobStore" cardinality="1..1" interface="org.eclipse.osee.ote.rest.internal.OteJobStore" name="OteJobStore" policy="static" unbind="unbindOteJobStore"/>
+</scr:component>
diff --git a/org.eclipse.osee.ote.rest/OSGI-INF/ote.job.store.xml b/org.eclipse.osee.ote.rest/OSGI-INF/ote.job.store.xml
new file mode 100644
index 000000000..eee590006
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/OSGI-INF/ote.job.store.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="org.eclipse.osee.ote.rest">
+ <implementation class="org.eclipse.osee.ote.rest.internal.OteJobStoreImpl"/>
+ <service>
+ <provide interface="org.eclipse.osee.ote.rest.internal.OteJobStore"/>
+ </service>
+</scr:component>
diff --git a/org.eclipse.osee.ote.rest/OSGI-INF/ote.rest.application.xml b/org.eclipse.osee.ote.rest/OSGI-INF/ote.rest.application.xml
new file mode 100644
index 000000000..d049d2731
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/OSGI-INF/ote.rest.application.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="org.eclipse.osee.ote.rest.internal.OteRestApplication">
+ <implementation class="org.eclipse.osee.ote.rest.internal.OteRestApplication"/>
+ <service>
+ <provide interface="javax.ws.rs.core.Application"/>
+ </service>
+ <reference bind="setOteConfigurationStore" cardinality="1..1" interface="org.eclipse.osee.ote.rest.internal.OteConfigurationStore" name="OteConfigurationStore" policy="static"/>
+</scr:component>
diff --git a/org.eclipse.osee.ote.rest/OSGI-INF/ote.run.tests.component.xml b/org.eclipse.osee.ote.rest/OSGI-INF/ote.run.tests.component.xml
new file mode 100644
index 000000000..b5474dcb1
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/OSGI-INF/ote.run.tests.component.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="org.eclipse.osee.ote.rest.OteRunTests">
+ <implementation class="org.eclipse.osee.ote.rest.internal.OteRunTestCommandsImpl"/>
+ <service>
+ <provide interface="org.eclipse.osee.ote.rest.internal.OteRunTestCommands"/>
+ </service>
+</scr:component>
diff --git a/org.eclipse.osee.ote.rest/build.properties b/org.eclipse.osee.ote.rest/build.properties
new file mode 100644
index 000000000..891015962
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/build.properties
@@ -0,0 +1,8 @@
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ OSGI-INF/,\
+ OSGI-INF/ote.configuration.store.xml,\
+ OSGI-INF/ote.job.store.xml,\
+ OSGI-INF/ote.run.tests.component.xml
+source.. = src/
diff --git a/org.eclipse.osee.ote.rest/pom.xml b/org.eclipse.osee.ote.rest/pom.xml
new file mode 100644
index 000000000..b3f88cbb3
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/pom.xml
@@ -0,0 +1,35 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.osee</groupId>
+ <artifactId>org.eclipse.osee.ote.parent</artifactId>
+ <version>0.25.3-SNAPSHOT</version>
+ <relativePath>../org.eclipse.osee.ote.parent</relativePath>
+ </parent>
+
+ <artifactId>org.eclipse.osee.ote.rest</artifactId>
+ <packaging>eclipse-plugin</packaging>
+ <name>OTE REST(Incubation)</name>
+
+ <build>
+ <!-- workaround for https://issues.sonatype.org/browse/TYCHO-168 -->
+ <resources>
+ <resource>
+ <directory>src</directory>
+ <excludes>
+ <exclude>**/*.java</exclude>
+ </excludes>
+ </resource>
+ </resources>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-source-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/ConfigurationJobStatus.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/ConfigurationJobStatus.java
new file mode 100644
index 000000000..1066ad65c
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/ConfigurationJobStatus.java
@@ -0,0 +1,101 @@
+package org.eclipse.osee.ote.rest.internal;
+
+import java.net.URL;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.ote.ConfigurationStatus;
+import org.eclipse.osee.ote.OTEStatusCallback;
+import org.eclipse.osee.ote.rest.model.OTEJobStatus;
+
+public class ConfigurationJobStatus implements OTEStatusCallback<ConfigurationStatus>, OteJob {
+
+ private int totalUnitsOfWork;
+ private int count;
+ private StringBuilder errorLog;
+ private StringBuilder statusLog;
+ private Future<ConfigurationStatus> future;
+ private String uuid;
+ private URL url;
+
+ public ConfigurationJobStatus(){
+ totalUnitsOfWork = 0;
+ errorLog = new StringBuilder();
+ statusLog = new StringBuilder();
+ }
+
+ @Override
+ public void complete(ConfigurationStatus done) {
+ }
+
+ @Override
+ public void setTotalUnitsOfWork(int totalUnitsOfWork) {
+ this.totalUnitsOfWork = totalUnitsOfWork;
+ }
+
+ @Override
+ public void incrememtUnitsWorked(int count) {
+ this.count+=count;
+ }
+
+ @Override
+ public void log(String string) {
+ statusLog.append(string);
+ statusLog.append("\n");
+ }
+
+ @Override
+ public void error(String message, Throwable th) {
+ errorLog.append(message);
+ errorLog.append("\n");
+ errorLog.append(Lib.exceptionToString(th));
+ errorLog.append("\n");
+ }
+
+ @Override
+ public void error(String message) {
+ errorLog.append(message);
+ errorLog.append("\n");
+ }
+
+ public void setFuture(Future<ConfigurationStatus> future) {
+ this.future = future;
+ }
+
+ @Override
+ public OTEJobStatus getStatus() throws InterruptedException, ExecutionException {
+ OTEJobStatus jobStatus = new OTEJobStatus();
+ if(future.isDone()){
+ jobStatus.setJobComplete(true);
+ jobStatus.setSuccess(future.get().isSuccess());
+ if(!future.get().isSuccess()){
+ error(future.get().getMessage());
+ }
+ } else {
+ jobStatus.setJobComplete(false);
+ jobStatus.setSuccess(false);
+ }
+ jobStatus.setJobId(uuid);
+ jobStatus.setErrorLog(errorLog.toString());
+ jobStatus.setTotalUnitsOfWork(totalUnitsOfWork);
+ jobStatus.setUnitsWorked(count);
+ jobStatus.setUpdatedJobStatus(url);
+ return jobStatus;
+ }
+
+ @Override
+ public String getId() {
+ return uuid;
+ }
+
+ @Override
+ public void setId(String uuid) {
+ this.uuid = uuid;
+ }
+
+ public void setUrl(URL url) {
+ this.url = url;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/HTMLBuilder.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/HTMLBuilder.java
new file mode 100644
index 000000000..4bfc2cb82
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/HTMLBuilder.java
@@ -0,0 +1,127 @@
+package org.eclipse.osee.ote.rest.internal;
+
+import java.io.File;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+public class HTMLBuilder {
+
+ private static String hostname = "";
+ private static final String serverTitle = "OTE Server";
+
+ private StringBuilder sb;
+
+ static {
+ try {
+ InetAddress localHost = InetAddress.getLocalHost();
+ hostname = localHost.getHostName();
+ } catch (UnknownHostException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public HTMLBuilder() {
+ sb = new StringBuilder();
+ }
+
+ public void open(String title){
+ sb.append("<!DOCTYPE HTML>\n");
+ sb.append("<html>\n");
+ sb.append("<head>\n");
+ sb.append("<title>"+title+"</title>\n");
+ sb.append("</head>\n");
+ sb.append("<body>\n");
+ }
+
+ public void commonHeader(File directory){
+ h2(serverTitle + " on " + hostname);
+ h3("Local Folder:");
+ p(directory.getAbsolutePath());
+ }
+
+ private void h3(String string) {
+ sb.append("<h3>");
+ sb.append(string);
+ sb.append("</h3>");
+ }
+
+ public void addLink(String baseUrl, String path, String title){
+ sb.append("<a href=\"");
+ sb.append(baseUrl);
+ if(!baseUrl.endsWith("/")){
+ sb.append("/");
+ }
+ sb.append(path);
+ sb.append("\">");
+ sb.append(title);
+ sb.append("</a>");
+ }
+
+ public void close(){
+ sb.append("</body>\n");
+ sb.append("</html>\n");
+ }
+
+ public String get(){
+ return sb.toString();
+ }
+
+ public void br() {
+ sb.append("<br>");
+ }
+
+ public void pre(String statusFileContents) {
+ sb.append("<pre>");
+ sb.append(statusFileContents);
+ sb.append("</pre>");
+ }
+
+ public void p(String content) {
+ sb.append("<p>");
+ sb.append(content);
+ sb.append("</p>");
+ }
+
+ public void h2(String title) {
+ sb.append("<h2>");
+ sb.append(title);
+ sb.append("</h2>");
+ }
+
+ public void ulStart() {
+ sb.append("<ul>");
+ }
+
+ public void ulStop() {
+ sb.append("</ul>");
+ }
+
+ public void li(String name) {
+ sb.append("<li>");
+ sb.append(name);
+ sb.append("</li>");
+ }
+
+ public void tableStart() {
+ sb.append("<table border=\"1\">");
+ }
+
+ public void trStart() {
+ sb.append("<tr>");
+ }
+
+ public void td(String string) {
+ sb.append("<td>");
+ sb.append(string);
+ sb.append("</td>");
+ }
+
+ public void trEnd() {
+ sb.append("</tr>");
+ }
+
+ public void tableEnd() {
+ sb.append("</table>");
+ }
+
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OTEConfigItemSort.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OTEConfigItemSort.java
new file mode 100644
index 000000000..2d8c41105
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OTEConfigItemSort.java
@@ -0,0 +1,14 @@
+package org.eclipse.osee.ote.rest.internal;
+
+import java.util.Comparator;
+
+import org.eclipse.osee.ote.rest.model.OTEConfigurationItem;
+
+public class OTEConfigItemSort implements Comparator<OTEConfigurationItem> {
+
+ @Override
+ public int compare(OTEConfigurationItem arg0, OTEConfigurationItem arg1) {
+ return arg0.getBundleName().compareTo(arg1.getBundleName());
+ }
+
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OTEStatusCallbackForRun.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OTEStatusCallbackForRun.java
new file mode 100644
index 000000000..ed47e1d76
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OTEStatusCallbackForRun.java
@@ -0,0 +1,44 @@
+package org.eclipse.osee.ote.rest.internal;
+
+import org.eclipse.osee.ote.ConfigurationStatus;
+import org.eclipse.osee.ote.OTEStatusCallback;
+
+public class OTEStatusCallbackForRun<T> implements OTEStatusCallback<ConfigurationStatus> {
+
+ @Override
+ public void complete(ConfigurationStatus done) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void setTotalUnitsOfWork(int totalUnitsOfWork) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void incrememtUnitsWorked(int count) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void log(String message) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void error(String message, Throwable th) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void error(String message) {
+ // TODO Auto-generated method stub
+
+ }
+
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteBatchResource.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteBatchResource.java
new file mode 100644
index 000000000..eadbb7ed4
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteBatchResource.java
@@ -0,0 +1,203 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.rest.internal;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Request;
+import javax.ws.rs.core.StreamingOutput;
+import javax.ws.rs.core.UriInfo;
+
+import org.eclipse.osee.framework.jdk.core.type.OseeCoreException;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.ote.OTEApi;
+import org.eclipse.osee.ote.core.ServiceUtility;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+@Path("batches")
+public class OteBatchResource {
+
+ // Allows to insert contextual objects into the class,
+ // e.g. ServletContext, Request, Response, UriInfo
+ @Context
+ UriInfo uriInfo;
+ @Context
+ Request request;
+ private final String path;
+
+ public OteBatchResource(UriInfo uriInfo, Request request, String path) {
+ this.uriInfo = uriInfo;
+ this.request = request;
+ this.path = path;
+ }
+
+ public OteBatchResource() {
+ this.path = "";
+ }
+
+ @GET
+ @Produces(MediaType.TEXT_HTML)
+ public String getBatches() throws OseeCoreException {
+ OTEApi ote = ServiceUtility.getService(OTEApi.class);
+ File rootBatches = ote.getServerFolder().getBatchesFolder();
+ File myBatchFolder = new File(rootBatches, path);
+ File logFile = ote.getServerFolder().getBatchLogFile(myBatchFolder);
+
+ HTMLBuilder builder = new HTMLBuilder();
+
+ builder.open("OTE Batch Status");
+ /**
+ * Disaled till we figure out security
+ if(uriInfo != null){
+ String url = uriInfo.getAbsolutePath().toASCIIString();
+ builder.addLink(url, "content.zip", "Get Folder Contents");
+ }
+ */
+ builder.commonHeader(myBatchFolder);
+
+
+ generateStatusSection(builder, ote, myBatchFolder);
+
+ generateResultsSection(builder, ote, myBatchFolder);
+
+ builder.h2("Output");
+ builder.pre(getFileContents(logFile));
+ builder.close();
+ return builder.get();
+ }
+
+ private void generateResultsSection(HTMLBuilder builder, OTEApi ote, File myBatchFolder) {
+ File runList = ote.getServerFolder().getBatchRunList(myBatchFolder);
+ String runListContents = "";
+ if(runList.exists()){
+ runListContents = getFileContents(runList);
+ }
+ if(runListContents.length() > 0){
+ File[] resultFiles = myBatchFolder.listFiles(new FileFilter() {
+ @Override
+ public boolean accept(File arg0) {
+ return arg0.getName().endsWith(".result");
+ }
+ });
+ String[] runListArray = runListContents.split("\n");
+ List<TestResultSummary> results = getTestResults(resultFiles, runListArray);
+ builder.h2("Tests");
+ builder.tableStart();
+ builder.trStart();
+ builder.td("Test");
+ builder.td("Result");
+ builder.td("Time");
+ builder.trEnd();
+
+ for(TestResultSummary result:results){
+ builder.trStart();
+ builder.td(result.getName());
+ builder.td(result.getResult());
+ builder.td(result.getTime());
+ builder.trEnd();
+ }
+
+ builder.tableEnd();
+
+ } else {
+ builder.h2("Files");
+ builder.ulStart();
+ File[] batches = myBatchFolder.listFiles();
+ Arrays.sort(batches, new TimeSort());
+ for(File file:batches){
+ builder.li(file.getName());
+ }
+ builder.ulStop();
+ }
+ }
+
+
+
+ private List<TestResultSummary> getTestResults(File[] resultFiles, String[] runListArray) {
+ List<TestResultSummary> results = new ArrayList<>();
+ Map<String, TestResultSummary> resultsTemp = new HashMap<>();
+ for(File file:resultFiles){
+ String content = getFileContents(file);
+ if(content.length() > 0){
+ String[] data = content.split(",");
+ if(data.length == 3){
+ resultsTemp.put(data[0], new TestResultSummary(data[0], data[1], data[2]));
+ }
+ }
+ }
+ for(String name:runListArray){
+ TestResultSummary result = resultsTemp.get(name);
+ if(result == null){
+ result = new TestResultSummary(name);
+ }
+ results.add(result);
+ }
+ return results;
+ }
+
+ private void generateStatusSection(HTMLBuilder builder, OTEApi ote, File myBatchFolder){
+ builder.h2("Status");
+ String status = getFileContents(ote.getServerFolder().getBatchStatusFile(myBatchFolder));
+ if(status.length() == 0){
+ status = "unknown";
+ }
+ builder.p(status);
+ }
+
+ private String getFileContents(File statusFile) {
+ String status = "";
+ try {
+ if(statusFile.exists()){
+ status = Lib.fileToString(statusFile);
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return status;
+ }
+
+ @Path("content.zip")
+ @GET
+ @Produces({"application/zip"})
+ public StreamingOutput getZip() throws Exception {
+ return new StreamingOutput() {
+ @Override
+ public void write(OutputStream output) throws IOException, WebApplicationException {
+ try {
+ OTEApi ote = ServiceUtility.getService(OTEApi.class);
+ File rootBatches = ote.getServerFolder().getBatchesFolder();
+ File myBatchFolder = new File(rootBatches, path);
+ ZIPGenerator generator = new ZIPGenerator(myBatchFolder);
+ generator.generateZip(output);
+ } catch (Exception e) {
+ throw new WebApplicationException(e);
+ }
+ }
+ };
+ }
+
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteBatchesResource.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteBatchesResource.java
new file mode 100644
index 000000000..b490478ff
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteBatchesResource.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.rest.internal;
+
+import java.io.File;
+import java.util.Arrays;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Request;
+import javax.ws.rs.core.UriInfo;
+
+import org.eclipse.osee.framework.jdk.core.type.OseeCoreException;
+import org.eclipse.osee.ote.OTEApi;
+import org.eclipse.osee.ote.core.ServiceUtility;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+@Path("batches")
+public class OteBatchesResource {
+
+ // Allows to insert contextual objects into the class,
+ // e.g. ServletContext, Request, Response, UriInfo
+ @Context
+ UriInfo uriInfo;
+ @Context
+ Request request;
+
+ @GET
+ @Produces(MediaType.TEXT_HTML)
+ public String getBatches() throws OseeCoreException {
+ OTEApi ote = ServiceUtility.getService(OTEApi.class);
+ File[] batches = ote.getServerFolder().getBatchesFolder().listFiles();
+ String url = uriInfo.getAbsolutePath().toASCIIString();
+ HTMLBuilder builder = new HTMLBuilder();
+ builder.open("OTE Server Batches");
+ builder.commonHeader(ote.getServerFolder().getBatchesFolder());
+
+ builder.h2("Archived Batches:");
+ Arrays.sort(batches, new ReverseAlphabeticalSort());
+ for(File file:batches){
+ if(file.isDirectory()){
+ builder.addLink(url, file.getName(), file.getName());
+ builder.br();
+ }
+ }
+ builder.close();
+ return builder.get();
+ }
+
+ @Path("{path}")
+ public OteBatchResource getConfiguration(@PathParam("path") String path) {
+ return new OteBatchResource(uriInfo, request, path);
+ }
+
+
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteConfigurationResource.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteConfigurationResource.java
new file mode 100644
index 000000000..684b8500d
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteConfigurationResource.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.rest.internal;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Request;
+import javax.ws.rs.core.UriBuilderException;
+import javax.ws.rs.core.UriInfo;
+
+import org.eclipse.osee.ote.rest.model.OTEConfiguration;
+import org.eclipse.osee.ote.rest.model.OTEConfigurationItem;
+import org.eclipse.osee.ote.rest.model.OTEJobStatus;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+@Path("config")
+public class OteConfigurationResource {
+
+ // Allows to insert contextual objects into the class,
+ // e.g. ServletContext, Request, Response, UriInfo
+ @Context
+ UriInfo uriInfo;
+ @Context
+ Request request;
+
+ @GET
+ @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
+ public OTEConfiguration getConfiguration() throws MalformedURLException, IllegalArgumentException, UriBuilderException, InterruptedException, ExecutionException {
+ return getDataStore().getConfiguration(uriInfo);
+ }
+
+ @POST
+ @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
+ @Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
+ public OTEJobStatus createConfig(OTEConfiguration config) throws IOException, InterruptedException, ExecutionException {
+ return getDataStore().setup(config, uriInfo);
+ }
+
+ @GET
+ @Produces({MediaType.TEXT_HTML})
+ public String getHtmlConfiguration() throws MalformedURLException, IllegalArgumentException, UriBuilderException, InterruptedException, ExecutionException {
+ OTEConfiguration config = getDataStore().getConfiguration(uriInfo);
+ HTMLBuilder b = new HTMLBuilder();
+ b.open("OTE Server Configuration");
+ b.h2("Server Configuration");
+ b.ulStart();
+ List<OTEConfigurationItem> items = config.getItems();
+ Collections.sort(items, new OTEConfigItemSort());
+ for(OTEConfigurationItem item:config.getItems()){
+ b.li(String.format("%s %s", item.getBundleName(), item.getBundleVersion()));
+ }
+ b.ulStop();
+ return b.get();
+ }
+
+ private OteConfigurationStore getDataStore(){
+ return OteRestApplication.get();
+ }
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteConfigurationStore.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteConfigurationStore.java
new file mode 100644
index 000000000..2c58266fc
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteConfigurationStore.java
@@ -0,0 +1,19 @@
+package org.eclipse.osee.ote.rest.internal;
+
+import java.net.MalformedURLException;
+import java.util.Collection;
+import java.util.concurrent.ExecutionException;
+
+import javax.ws.rs.core.UriBuilderException;
+import javax.ws.rs.core.UriInfo;
+
+import org.eclipse.osee.ote.rest.model.OTEConfiguration;
+import org.eclipse.osee.ote.rest.model.OTEJobStatus;
+
+public interface OteConfigurationStore {
+ OTEJobStatus setup(OTEConfiguration config, UriInfo uriInfo) throws InterruptedException, ExecutionException, MalformedURLException, IllegalArgumentException, UriBuilderException;
+ OTEJobStatus reset(UriInfo uriInfo) throws InterruptedException, ExecutionException, MalformedURLException, IllegalArgumentException, UriBuilderException;
+ OTEConfiguration getConfiguration(UriInfo uriInfo) throws MalformedURLException, IllegalArgumentException, UriBuilderException, InterruptedException, ExecutionException;
+ OTEJobStatus getJob(String uuid) throws InterruptedException, ExecutionException;
+ Collection<String> getAllJobIds();
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteConfigurationStoreImpl.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteConfigurationStoreImpl.java
new file mode 100644
index 000000000..6bbac8bb1
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteConfigurationStoreImpl.java
@@ -0,0 +1,107 @@
+package org.eclipse.osee.ote.rest.internal;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Collection;
+import java.util.UUID;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+
+import javax.ws.rs.core.UriBuilderException;
+import javax.ws.rs.core.UriInfo;
+
+import org.eclipse.osee.ote.Configuration;
+import org.eclipse.osee.ote.ConfigurationStatus;
+import org.eclipse.osee.ote.OTEApi;
+import org.eclipse.osee.ote.rest.model.OTEConfiguration;
+import org.eclipse.osee.ote.rest.model.OTEJobStatus;
+
+public class OteConfigurationStoreImpl implements OteConfigurationStore {
+
+ private OTEApi ote;
+ private OteJobStore oteJobs;
+
+ public OteConfigurationStoreImpl(){
+ }
+
+ public void bindOTEApi(OTEApi ote){
+ this.ote = ote;
+ }
+
+ public void unbindOTEApi(OTEApi ote){
+ this.ote = null;
+ }
+
+ public void bindOteJobStore(OteJobStore oteJobs){
+ this.oteJobs = oteJobs;
+ }
+
+ public void unbindOteJobStore(OteJobStore oteJobs){
+ this.oteJobs = null;
+ }
+
+ @Override
+ public OTEJobStatus setup(OTEConfiguration config, UriInfo uriInfo) throws InterruptedException, ExecutionException, MalformedURLException, IllegalArgumentException, UriBuilderException {
+ Configuration realConfig = TranslateUtil.translateToOtherConfig(config);
+ ConfigurationJobStatus status = createConfigurationJobStatus(realConfig, uriInfo);
+ Future<ConfigurationStatus> future = null;
+ if(config.getInstall()){
+ future = ote.loadConfiguration(realConfig, status);
+ } else {
+ future = ote.downloadConfigurationJars(realConfig, status);
+ }
+ status.setFuture(future);
+ return status.getStatus();
+ }
+
+ private ConfigurationJobStatus createConfigurationJobStatus(Configuration config, UriInfo uriInfo) throws MalformedURLException, IllegalArgumentException, UriBuilderException {
+ ConfigurationJobStatus status = new ConfigurationJobStatus();
+ status.setId(UUID.randomUUID().toString());
+ status.setUrl(generateJobUrl(status, uriInfo));
+ oteJobs.add(status);
+ return status;
+ }
+
+ private URL generateJobUrl(OteJob job, UriInfo uriInfo) throws MalformedURLException, IllegalArgumentException, UriBuilderException{
+ return uriInfo.getBaseUriBuilder().path("job").path(job.getId()).build().toURL();
+ }
+
+ @Override
+ public OTEJobStatus reset(UriInfo uriInfo) throws InterruptedException, ExecutionException, MalformedURLException, IllegalArgumentException, UriBuilderException {
+ ConfigurationJobStatus status = createConfigurationJobStatus(uriInfo);
+ Future<ConfigurationStatus> future = ote.resetConfiguration(status);
+ status.setFuture(future);
+ return status.getStatus();
+ }
+
+ @Override
+ public OTEConfiguration getConfiguration(UriInfo uriInfo) throws MalformedURLException, IllegalArgumentException, UriBuilderException, InterruptedException, ExecutionException {
+ ConfigurationJobStatus status = createConfigurationJobStatus(uriInfo);
+ Future<ConfigurationStatus> future = ote.getConfiguration();
+ status.setFuture(future);
+ if(future.isDone()){
+ return TranslateUtil.translateConfig(future.get().getConfiguration());
+ } else {
+ return new OTEConfiguration();
+ }
+ }
+
+ private ConfigurationJobStatus createConfigurationJobStatus(UriInfo uriInfo) throws MalformedURLException, IllegalArgumentException, UriBuilderException {
+ ConfigurationJobStatus status = new ConfigurationJobStatus();
+ status.setId(UUID.randomUUID().toString());
+ status.setUrl(generateJobUrl(status, uriInfo));
+ oteJobs.add(status);
+ return status;
+ }
+
+ @Override
+ public OTEJobStatus getJob(String uuid) throws InterruptedException, ExecutionException {
+ return oteJobs.get(uuid);
+ }
+
+ @Override
+ public Collection<String> getAllJobIds() {
+ return oteJobs.getAll();
+ }
+
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteFilesResource.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteFilesResource.java
new file mode 100644
index 000000000..a618a4653
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteFilesResource.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.rest.internal;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Request;
+import javax.ws.rs.core.StreamingOutput;
+import javax.ws.rs.core.UriInfo;
+import org.eclipse.osee.framework.jdk.core.type.OseeCoreException;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+@Path("file")
+public class OteFilesResource {
+
+ // Allows to insert contextual objects into the class,
+ // e.g. ServletContext, Request, Response, UriInfo
+ @Context
+ UriInfo uriInfo;
+ @Context
+ Request request;
+
+ @GET
+ @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
+ public StreamingOutput getFile(@QueryParam("path") String path ) throws OseeCoreException {
+ final String myPath = path;
+ return new StreamingOutput() {
+ public void write(OutputStream output) throws IOException, WebApplicationException {
+ try {
+ File file = new File(myPath);
+ InputStream is = new FileInputStream(file);
+ byte[] bytes = new byte[2048];
+ int numRead = 0;
+ while((numRead = is.read(bytes)) != -1){
+ output.write(bytes, 0, numRead);
+ }
+ is.close();
+ } catch (Exception e) {
+ throw new WebApplicationException(e);
+ }
+ }
+ };
+ }
+
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteJob.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteJob.java
new file mode 100644
index 000000000..0d2c64679
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteJob.java
@@ -0,0 +1,13 @@
+package org.eclipse.osee.ote.rest.internal;
+
+import java.util.concurrent.ExecutionException;
+
+import org.eclipse.osee.ote.rest.model.OTEJobStatus;
+
+public interface OteJob {
+
+ String getId();
+ void setId(String uuid);
+ OTEJobStatus getStatus() throws InterruptedException, ExecutionException;
+
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteJobResource.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteJobResource.java
new file mode 100644
index 000000000..23a1f8923
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteJobResource.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+9 * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.rest.internal;
+
+import java.util.concurrent.ExecutionException;
+import javax.ws.rs.GET;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Request;
+import javax.ws.rs.core.UriInfo;
+import org.eclipse.osee.framework.jdk.core.type.OseeCoreException;
+import org.eclipse.osee.ote.rest.model.OTEJobStatus;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class OteJobResource {
+
+ @Context
+ private final UriInfo uriInfo;
+ @Context
+ private final Request request;
+
+ private final String uuid;
+
+ private final OteConfigurationStore store;
+
+
+ public OteJobResource(UriInfo uriInfo, Request request, OteConfigurationStore store, String id) {
+ this.uriInfo = uriInfo;
+ this.request = request;
+ this.uuid = id;
+ this.store = store;
+ }
+
+ @GET
+ @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
+ public OTEJobStatus getConfig() throws OseeCoreException, InterruptedException, ExecutionException {
+ return store.getJob(uuid);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteJobStore.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteJobStore.java
new file mode 100644
index 000000000..90a74d0da
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteJobStore.java
@@ -0,0 +1,16 @@
+package org.eclipse.osee.ote.rest.internal;
+
+import java.util.Collection;
+import java.util.concurrent.ExecutionException;
+
+import org.eclipse.osee.ote.rest.model.OTEJobStatus;
+
+public interface OteJobStore {
+
+ OTEJobStatus get(String uuid) throws InterruptedException, ExecutionException;
+
+ Collection<String> getAll();
+
+ void add(OteJob job);
+
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteJobStoreImpl.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteJobStoreImpl.java
new file mode 100644
index 000000000..b6cbd83e5
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteJobStoreImpl.java
@@ -0,0 +1,36 @@
+package org.eclipse.osee.ote.rest.internal;
+
+import java.util.Collection;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutionException;
+
+import org.eclipse.osee.ote.rest.model.OTEJobStatus;
+
+public class OteJobStoreImpl implements OteJobStore {
+
+ ConcurrentHashMap<String, OteJob> jobs;
+
+ public OteJobStoreImpl(){
+ jobs = new ConcurrentHashMap<>();
+ }
+
+ @Override
+ public OTEJobStatus get(String uuid) throws InterruptedException, ExecutionException {
+ OteJob job = jobs.get(uuid);
+ if(job != null){
+ return job.getStatus();
+ }
+ return null;
+ }
+
+ @Override
+ public Collection<String> getAll() {
+ return jobs.keySet();
+ }
+
+ @Override
+ public void add(OteJob job) {
+ jobs.put(job.getId(), job);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteJobsResource.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteJobsResource.java
new file mode 100644
index 000000000..2d20aa75f
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteJobsResource.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.rest.internal;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Request;
+import javax.ws.rs.core.UriInfo;
+import org.eclipse.osee.framework.jdk.core.type.OseeCoreException;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+@Path("job")
+public class OteJobsResource {
+
+ // Allows to insert contextual objects into the class,
+ // e.g. ServletContext, Request, Response, UriInfo
+ @Context
+ UriInfo uriInfo;
+ @Context
+ Request request;
+
+ @Path("{uuid}")
+ public OteJobResource getConfiguration(@PathParam("uuid") String id) {
+ return new OteJobResource(uriInfo, request, getDataStore(), id);
+ }
+
+ @GET
+ @Produces(MediaType.TEXT_PLAIN)
+ public String getConfiguration() throws OseeCoreException {
+ StringBuilder sb = new StringBuilder();
+ for(String id:getDataStore().getAllJobIds()){
+ sb.append(id);
+ sb.append("\n");
+ }
+ return sb.toString();
+ }
+
+ private OteConfigurationStore getDataStore(){
+ return OteRestApplication.get();
+ }
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteRestApplication.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteRestApplication.java
new file mode 100644
index 000000000..ed12256e7
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteRestApplication.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.rest.internal;
+
+import java.util.HashSet;
+import java.util.Set;
+import javax.ws.rs.ApplicationPath;
+import javax.ws.rs.core.Application;
+
+/**
+ * Get application.wadl at this context to get rest documentation
+ *
+ * @author Roberto E. Escobar
+ */
+@ApplicationPath("ote")
+public class OteRestApplication extends Application {
+
+ private static OteConfigurationStore store;
+
+ public void setOteConfigurationStore(OteConfigurationStore store) {
+ OteRestApplication.store = store;
+ }
+
+ public static OteConfigurationStore get() {
+ return store;
+ }
+
+ @Override
+ public Set<Class<?>> getClasses() {
+ Set<Class<?>> classes = new HashSet<>();
+ classes.add(OteRootResource.class);
+ classes.add(OteConfigurationResource.class);
+ classes.add(OteJobsResource.class);
+ classes.add(OteFilesResource.class);
+ classes.add(OteRunTestResource.class);
+ classes.add(OteBatchesResource.class);
+ return classes;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteRootResource.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteRootResource.java
new file mode 100644
index 000000000..e91c5855c
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteRootResource.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.rest.internal;
+
+import java.io.File;
+import java.util.Arrays;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Request;
+import javax.ws.rs.core.StreamingOutput;
+import javax.ws.rs.core.UriInfo;
+
+import org.eclipse.osee.framework.jdk.core.type.OseeCoreException;
+import org.eclipse.osee.ote.OTEApi;
+import org.eclipse.osee.ote.core.ServiceUtility;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+@Path("/")
+public class OteRootResource {
+
+ // Allows to insert contextual objects into the class,
+ // e.g. ServletContext, Request, Response, UriInfo
+ @Context
+ UriInfo uriInfo;
+ @Context
+ Request request;
+
+ @GET
+ @Produces(MediaType.TEXT_HTML)
+ public String getConfiguration() throws OseeCoreException {
+ String url = uriInfo.getAbsolutePath().toASCIIString();
+ OTEApi ote = ServiceUtility.getService(OTEApi.class);
+ File serverFolder = ote.getServerFolder().getRootFolder();
+ HTMLBuilder builder = new HTMLBuilder();
+ builder.open("OTE Server");
+ builder.commonHeader(serverFolder);
+ builder.h2("Batch Data:");
+ builder.addLink(url, "latestbatch", "Latest Batch");
+ builder.br();
+ builder.addLink(url, "batches", "Archived Batches");
+ builder.br();
+ builder.br();
+ builder.h2("Server Info:");
+ builder.addLink(url, "config", "Current Server Configuration");
+ builder.br();
+ builder.close();
+ return builder.get();
+ }
+
+ @Path("latestbatch")
+ @GET
+ @Produces(MediaType.TEXT_HTML)
+ public String getLatestBatch() throws Exception {
+ OTEApi ote = ServiceUtility.getService(OTEApi.class);
+ File[] batches = ote.getServerFolder().getBatchesFolder().listFiles();
+
+ Arrays.sort(batches, new ReverseAlphabeticalSort());
+ if(batches.length > 0){
+ return new OteBatchResource(uriInfo, request, batches[0].getName()).getBatches();
+ } else {
+ return new OteBatchResource().getBatches();
+ }
+ }
+
+ @Path("latestbatch/content.zip")
+ @GET
+ @Produces({"application/zip"})
+ public StreamingOutput getLatestBatchContent() throws Exception {
+ OTEApi ote = ServiceUtility.getService(OTEApi.class);
+ File[] batches = ote.getServerFolder().getBatchesFolder().listFiles();
+
+ Arrays.sort(batches, new ReverseAlphabeticalSort());
+ if(batches.length > 0){
+ return new OteBatchResource(uriInfo, request, batches[0].getName()).getZip();
+ } else {
+ return new OteBatchResource().getZip();
+ }
+ }
+
+
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteRunTestCommands.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteRunTestCommands.java
new file mode 100644
index 000000000..0a2984db1
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteRunTestCommands.java
@@ -0,0 +1,9 @@
+package org.eclipse.osee.ote.rest.internal;
+
+import org.eclipse.osee.ote.core.framework.command.RunTests;
+
+public interface OteRunTestCommands {
+ RunTests getCommand(String id);
+
+ void putCommand(String string, RunTests envTestRun);
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteRunTestCommandsImpl.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteRunTestCommandsImpl.java
new file mode 100644
index 000000000..f6a4fce5f
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteRunTestCommandsImpl.java
@@ -0,0 +1,28 @@
+package org.eclipse.osee.ote.rest.internal;
+
+import java.lang.ref.WeakReference;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.osee.ote.core.framework.command.RunTests;
+
+public class OteRunTestCommandsImpl implements OteRunTestCommands {
+
+ private Map<String, WeakReference<RunTests>> tests;
+
+ public OteRunTestCommandsImpl(){
+ tests = new HashMap<>();
+ }
+
+ @Override
+ public RunTests getCommand(String id) {
+ WeakReference<RunTests> ref = tests.get(id);
+ return ref.get();
+ }
+
+ @Override
+ public void putCommand(String id, RunTests envTestRun) {
+ tests.put(id, new WeakReference<RunTests>(envTestRun));
+ }
+
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteRunTestResource.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteRunTestResource.java
new file mode 100644
index 000000000..cb3583e88
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteRunTestResource.java
@@ -0,0 +1,113 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.rest.internal;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+import java.util.concurrent.ExecutionException;
+import java.util.logging.Level;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Request;
+import javax.ws.rs.core.UriBuilderException;
+import javax.ws.rs.core.UriInfo;
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.framework.jdk.core.type.PropertyStore;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.Configuration;
+import org.eclipse.osee.ote.core.ServiceUtility;
+import org.eclipse.osee.ote.core.environment.TestEnvironmentInterface;
+import org.eclipse.osee.ote.core.framework.command.RunTests;
+import org.eclipse.osee.ote.rest.model.KeyValue;
+import org.eclipse.osee.ote.rest.model.OTEJobStatus;
+import org.eclipse.osee.ote.rest.model.OTETestRun;
+import org.eclipse.osee.ote.rest.model.Properties;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+@Path("run")
+public class OteRunTestResource {
+
+ // Allows to insert contextual objects into the class,
+ // e.g. ServletContext, Request, Response, UriInfo
+ @Context
+ UriInfo uriInfo;
+ @Context
+ Request request;
+
+ @GET
+ @Produces({MediaType.TEXT_HTML})
+ public String getCurrentRunStatus() throws MalformedURLException, IllegalArgumentException, UriBuilderException, InterruptedException, ExecutionException {
+ return "hello";//getDataStore().getConfiguration(uriInfo);
+ }
+
+ @POST
+ @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
+ @Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
+ public OTEJobStatus run(OTETestRun tests) throws IOException, InterruptedException, ExecutionException {
+ TestEnvironmentInterface env = ServiceUtility.getService(TestEnvironmentInterface.class);
+ OTEJobStatus status = new OTEJobStatus();
+ if(env == null){
+ status.setSuccess(false);
+ status.setJobComplete(true);
+ status.setErrorLog("Failed to aquire TestEnvironmentInterface.");
+ } else {
+ UUID id = UUID.randomUUID();
+ Configuration configuration = TranslateUtil.translateToOtherConfig(tests.getJarConfiguration());
+ RunTests envTestRun = new RunTests(id.toString(), id, configuration, propertyStoreConversion(tests.getGlobalProperties()), propertyStoreConversion(tests.getTests()));
+ OteRunTestCommands commands = ServiceUtility.getService(OteRunTestCommands.class);
+ if(commands != null){
+ commands.putCommand(id.toString(), envTestRun);
+ }
+ env.addCommand(envTestRun);
+ status.setJobId(id.toString());
+ }
+ return status;
+ }
+
+ @Path("{uuid}")
+ public OteRunTestResourceItem getConfiguration(@PathParam("uuid") String id) {
+ return new OteRunTestResourceItem(uriInfo, request, id);
+ }
+
+ public IPropertyStore propertyStoreConversion(Properties properties){
+ IPropertyStore store = new PropertyStore();
+ for(KeyValue pair:properties.getPairs()){
+ if(pair.getValue() != null){
+ store.put(pair.getKey(), pair.getValue());
+ } else if(pair.getValues() != null){
+ store.put(pair.getKey(), pair.getValues().toArray(new String[0]));
+ } else {
+ OseeLog.log(OteRunTestResource.class, Level.SEVERE, "For PROPERTY:" + pair.getKey() + ", the corresponding VALUE is NULL!!");
+ }
+ }
+ return store;
+ }
+
+ public List<IPropertyStore> propertyStoreConversion(List<Properties> properties){
+ List<IPropertyStore> stores = new ArrayList<>();
+ for(Properties prop:properties){
+ stores.add(propertyStoreConversion(prop));
+ }
+ return stores;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteRunTestResourceItem.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteRunTestResourceItem.java
new file mode 100644
index 000000000..62cc91f7f
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/OteRunTestResourceItem.java
@@ -0,0 +1,63 @@
+package org.eclipse.osee.ote.rest.internal;
+
+import java.io.IOException;
+import java.util.concurrent.ExecutionException;
+
+import javax.ws.rs.DELETE;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Request;
+import javax.ws.rs.core.UriInfo;
+
+import org.eclipse.osee.ote.core.ServiceUtility;
+import org.eclipse.osee.ote.core.framework.command.RunTests;
+import org.eclipse.osee.ote.rest.model.OTEJobStatus;
+
+public class OteRunTestResourceItem {
+
+ @SuppressWarnings("unused")
+ private UriInfo uriInfo;
+ @SuppressWarnings("unused")
+ private Request request;
+ private String id;
+
+ public OteRunTestResourceItem(UriInfo uriInfo, Request request, String id) {
+ this.uriInfo = uriInfo;
+ this.request = request;
+ this.id = id;
+ }
+
+ @DELETE
+ @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
+ public OTEJobStatus abortAll() throws IOException, InterruptedException, ExecutionException {
+ OteRunTestCommands commands = ServiceUtility.getService(OteRunTestCommands.class);
+ OTEJobStatus status = new OTEJobStatus();
+ status.setSuccess(false);
+ if(commands != null){
+ RunTests cmd = commands.getCommand(id);
+ if(cmd != null){
+ cmd.cancel();
+ status.setSuccess(true);
+ }
+ }
+ return status;
+ }
+
+ @PUT
+ @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
+ public OTEJobStatus abortSingle() {
+ OteRunTestCommands commands = ServiceUtility.getService(OteRunTestCommands.class);
+ OTEJobStatus status = new OTEJobStatus();
+ status.setSuccess(false);
+ if(commands != null){
+ RunTests cmd = commands.getCommand(id);
+ if(cmd != null){
+ cmd.cancelSingle();
+ status.setSuccess(true);
+ }
+ }
+ return status;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/ReverseAlphabeticalSort.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/ReverseAlphabeticalSort.java
new file mode 100644
index 000000000..9ca21ee50
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/ReverseAlphabeticalSort.java
@@ -0,0 +1,13 @@
+package org.eclipse.osee.ote.rest.internal;
+
+import java.io.File;
+import java.util.Comparator;
+
+public class ReverseAlphabeticalSort implements Comparator<File> {
+
+ @Override
+ public int compare(File arg0, File arg1) {
+ return arg1.getName().compareToIgnoreCase(arg0.getName());
+ }
+
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/TestResultSummary.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/TestResultSummary.java
new file mode 100644
index 000000000..611950c31
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/TestResultSummary.java
@@ -0,0 +1,59 @@
+package org.eclipse.osee.ote.rest.internal;
+
+class TestResultSummary {
+
+ private static final String NA = "N/A";
+ private String name;
+ private String results;
+ private String time;
+
+ public TestResultSummary(String name, String results, String time) {
+ this.name = name;
+ this.results = results;
+ this.time = time;
+ }
+
+ public TestResultSummary(String name) {
+ this.name = name;
+ this.results = NA;
+ this.time = NA;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getResult() {
+ return results;
+ }
+
+ public String getTime() {
+ return time;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((name == null) ? 0 : name.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ TestResultSummary other = (TestResultSummary) obj;
+ if (name == null) {
+ if (other.name != null)
+ return false;
+ } else if (!name.equals(other.name))
+ return false;
+ return true;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/TimeSort.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/TimeSort.java
new file mode 100644
index 000000000..96d74506c
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/TimeSort.java
@@ -0,0 +1,21 @@
+package org.eclipse.osee.ote.rest.internal;
+
+import java.io.File;
+import java.util.Comparator;
+
+public class TimeSort implements Comparator<File> {
+
+ @Override
+ public int compare(File o1, File o2) {
+ long time1 = o1.lastModified();
+ long time2 = o2.lastModified();
+ if(time1 == time2){
+ return 0;
+ } else if ( time1 > time2) {
+ return 1;
+ } else {
+ return -1;
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/TranslateUtil.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/TranslateUtil.java
new file mode 100644
index 000000000..7362eef25
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/TranslateUtil.java
@@ -0,0 +1,41 @@
+package org.eclipse.osee.ote.rest.internal;
+
+import org.eclipse.osee.ote.Configuration;
+import org.eclipse.osee.ote.ConfigurationItem;
+import org.eclipse.osee.ote.rest.model.OTEConfiguration;
+import org.eclipse.osee.ote.rest.model.OTEConfigurationItem;
+
+public class TranslateUtil {
+
+ public static Configuration translateToOtherConfig(OTEConfiguration restConfig) {
+ if(restConfig == null){
+ return null;
+ }
+ Configuration config = new Configuration();
+ for(OTEConfigurationItem item:restConfig.getItems()){
+ config.addItem(TranslateUtil.translateToOtherConfig(item));
+ }
+ return config;
+ }
+
+ public static ConfigurationItem translateToOtherConfig(OTEConfigurationItem restConfigItem) {
+ return new ConfigurationItem(restConfigItem.getLocationUrl(), restConfigItem.getBundleVersion(), restConfigItem.getBundleName(), restConfigItem.getMd5Digest(), restConfigItem.isOsgiBundle());
+ }
+
+ public static OTEConfiguration translateConfig(Configuration config){
+ if(config == null){
+ return null;
+ }
+ OTEConfiguration restConfig = new OTEConfiguration();
+ for(ConfigurationItem item:config.getItems()){
+ OTEConfigurationItem newitem = new OTEConfigurationItem();
+ newitem.setBundleName(item.getSymbolicName());
+ newitem.setBundleVersion(item.getVersion());
+ newitem.setLocationUrl(item.getLocationUrl());
+ newitem.setMd5Digest(item.getMd5Digest());
+ restConfig.addItem(newitem);
+ }
+ return restConfig;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/ZIPGenerator.java b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/ZIPGenerator.java
new file mode 100644
index 000000000..21af4eaf7
--- /dev/null
+++ b/org.eclipse.osee.ote.rest/src/org/eclipse/osee/ote/rest/internal/ZIPGenerator.java
@@ -0,0 +1,57 @@
+package org.eclipse.osee.ote.rest.internal;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.zip.Deflater;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+public class ZIPGenerator {
+
+ private File folderToZip;
+
+ public ZIPGenerator(File folderToZip) {
+ this.folderToZip = folderToZip;
+ }
+
+ public void generateZip(OutputStream output) {
+ ZipOutputStream zipOut = new ZipOutputStream(output);
+ zipOut.setLevel(Deflater.DEFAULT_COMPRESSION);
+
+ for (File file : folderToZip.listFiles()) {
+ if (!file.isDirectory()){
+ try {
+ zipFile(zipOut, file);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ try {
+ zipOut.flush();
+ zipOut.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ private void zipFile(ZipOutputStream zos, File file) throws IOException {
+ if (!file.canRead()) {
+ return;
+ }
+
+ zos.putNextEntry(new ZipEntry(file.getName()));
+ FileInputStream fis = new FileInputStream(file);
+ byte[] buffer = new byte[4092];
+ int byteCount = 0;
+ while ((byteCount = fis.read(buffer)) != -1)
+ {
+ zos.write(buffer, 0, byteCount);
+ }
+ fis.close();
+ zos.closeEntry();
+ }
+
+}
diff --git a/org.eclipse.osee.ote.runtimeManager/.classpath b/org.eclipse.osee.ote.runtimeManager/.classpath
new file mode 100644
index 000000000..1fa3e6803
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.ote.runtimeManager/.pmd b/org.eclipse.osee.ote.runtimeManager/.pmd
new file mode 100644
index 000000000..c7b0a9fb3
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/.pmd
@@ -0,0 +1,925 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<pmd>
+ <useProjectRuleSet>false</useProjectRuleSet>
+ <ruleSetFile>.ruleset</ruleSetFile>
+ <rules>
+ <rule>
+ <name>LooseCoupling</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneMethodMustImplementCloneable</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedImports</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SignatureDeclareThrowsException</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IfStmtsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>WhileLoopsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IfElseStmtsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ForLoopsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseSingleton</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanReturns</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanExpressions</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SwitchStmtsShouldHaveDefault</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDeeplyNestedIfStmts</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidReassigningParameters</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SwitchDensity</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConstructorCallsOverridableMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AccessorClassGeneration</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalFieldCouldBeStatic</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloseResource</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonStaticInitializer</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DefaultLabelNotLastInSwitchStmt</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonCaseLabelInSwitchStatement</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>OptimizableToArrayCall</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BadComparison</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EqualsNull</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConfusingTernary</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InstantiationToGetClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IdempotentOperations</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimpleDateFormatNeedsLocale</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ImmutableField</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseLocaleWithCaseConversions</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidProtectedFieldInFinalClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AssignmentToNonFinalStatic</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingStaticMethodInNonInstantiatableClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidSynchronizedAtMethodLevel</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingBreakInSwitch</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseNotifyAllInsteadOfNotify</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidInstanceofChecksInCatchClause</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractClassWithoutAbstractMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyConditional</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CompareObjectsWithEquals</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PositionLiteralsFirstInComparisons</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryLocalBeforeReturn</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonThreadSafeSingleton</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UncommentedEmptyMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UncommentedEmptyConstructor</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidConstantsInterface</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnsynchronizedStaticDateFormatter</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PreserveStackTrace</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseCollectionIsEmpty</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassWithOnlyPrivateConstructorsShouldBeFinal</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyMethodInAbstractClassShouldBeAbstract</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SingularField</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReturnEmptyArrayRatherThanNull</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractClassWithoutAnyMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooFewBranchesForASwitchStatement</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCatchingThrowable</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SignatureDeclareThrowsException</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExceptionAsFlowControl</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCatchingNPE</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingRawExceptionTypes</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingNullPointerException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidRethrowingException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotExtendJavaLangError</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotThrowExceptionInFinally</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingNewInstanceOfSameException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedPrivateField</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedLocalVariable</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedPrivateMethod</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedFormalParameter</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MoreThanOneLogger</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LoggerIsNotStaticFinal</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SystemPrintln</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidPrintStackTrace</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDuplicateLiterals</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringInstantiation</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringToString</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InefficientStringBuffering</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryCaseChange</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseStringBufferLength</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AppendCharacterWithChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConsecutiveLiteralAppends</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseIndexOfChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InefficientEmptyStringCheck</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InsufficientStringBufferDeclaration</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessStringValueOf</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringBufferInstantiationWithChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseEqualsToCompareStrings</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidStringBufferField</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceVectorWithList</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceHashtableWithMap</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceEnumerationWithIterator</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidEnumAsIdentifier</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidAssertAsIdentifier</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IntegerInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ByteInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ShortInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LongInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseBeforeAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseAfterAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseTestAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4SuitesShouldUseSuiteAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitUseExpected</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseProperClassLoader</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MDBAndSessionBeanNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>RemoteSessionInterfaceNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LocalInterfaceSessionNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LocalHomeNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>RemoteInterfaceNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotCallSystemExit</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StaticEJBFieldShouldBeFinal</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotUseThreads</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidInstantiatingObjectsInLoops</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseArrayListInsteadOfVector</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyStartsWith</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseStringBufferForStringAppends</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseArraysAsList</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidArrayLoops</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryWrapperObjectCreation</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AddEmptyString</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyCatchBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyIfStmt</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyWhileStmt</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyTryBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyFinallyBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptySwitchStatements</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JumbledIncrementer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ForLoopShouldBeWhileLoop</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryConversionTemporary</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>OverrideBothEqualsAndHashcode</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoubleCheckedLocking</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReturnFromFinallyBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptySynchronizedBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryReturn</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyStaticInitializer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnconditionalIfStatement</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyStatementNotInLoop</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanInstantiation</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryFinalModifier</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CollapsibleIfStatements</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessOverridingMethod</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassCastExceptionWithToArray</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDecimalLiteralsInBigDecimalConstructor</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessOperationOnImmutable</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MisplacedNullCheck</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedNullCheckInEquals</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThreadGroup</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BrokenNullCheck</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BigIntegerInstantiation</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingOctalValues</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingHardCodedIP</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CheckResultSet</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidMultipleUnaryOperators</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyInitializer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodReturnsInternalArray</name>
+ <ruleset>Security Code Guidelines</ruleset>
+ </rule>
+ <rule>
+ <name>ArrayIsStoredDirectly</name>
+ <ruleset>Security Code Guidelines</ruleset>
+ </rule>
+ <rule>
+ <name>CouplingBetweenObjects</name>
+ <ruleset>Coupling Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveImports</name>
+ <ruleset>Coupling Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LooseCoupling</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DuplicateImports</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DontImportJavaLang</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedImports</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ImportFromSamePackage</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyStaticImports</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitStaticSuite</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitSpelling</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitAssertionsShouldIncludeMessage</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitTestsShouldIncludeAssert</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TestClassWithoutTestCases</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryBooleanAssertion</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertEqualsInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertSameInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertNullInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanAssertion</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NullAssignment</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedModifier</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AssignmentInOperand</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AtLeastOneConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DontImportSun</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousOctalEscape</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CallSuperInConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryParentheses</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DefaultPackage</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanInversion</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DataflowAnomalyAnalysis</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFinalLocalVariable</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingShortType</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingVolatile</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingNativeCode</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidAccessibilityAlteration</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotCallGarbageCollectionExplicitly</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodNamingConventions</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassNamingConventions</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractNaming</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDollarSigns</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodWithSameNameAsEnclosingClass</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousHashcodeMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousConstantFieldName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousEqualsMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFieldNameMatchingTypeName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFieldNameMatchingMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NoPackage</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PackageCase</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MisleadingVariableName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanGetMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NPathComplexity</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveMethodLength</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveParameterList</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveClassLength</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CyclomaticComplexity</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessivePublicCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyFields</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssMethodCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssTypeCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssConstructorCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyMethods</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyFinalizer</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeOnlyCallsSuperFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeOverloaded</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeDoesNotCallSuperFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeShouldBeProtected</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCallingFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseCorrectExceptionLogging</name>
+ <ruleset>Jakarta Commons Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ProperLogger</name>
+ <ruleset>Jakarta Commons Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingSerialVersionUID</name>
+ <ruleset>JavaBean Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ProperCloneImplementation</name>
+ <ruleset>Clone Implementation Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneThrowsCloneNotSupportedException</name>
+ <ruleset>Clone Implementation Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneMethodMustImplementCloneable</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ </rules>
+ <includeDerivedFiles>false</includeDerivedFiles>
+ <violationsAsErrors>true</violationsAsErrors>
+</pmd>
diff --git a/org.eclipse.osee.ote.runtimeManager/.project b/org.eclipse.osee.ote.runtimeManager/.project
new file mode 100644
index 000000000..471d166fd
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ote.runtimeManager</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.runtimeManager/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.runtimeManager/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..e39345c75
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/META-INF/MANIFEST.MF
@@ -0,0 +1,33 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OTE Runtime Manager Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.runtimeManager;singleton:=true
+Bundle-Version: 0.25.3.qualifier
+Bundle-Activator: org.eclipse.osee.ote.runtimemanager.RuntimeManager
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Import-Package: org.eclipse.core.resources,
+ org.eclipse.core.runtime,
+ org.eclipse.core.runtime.jobs,
+ org.eclipse.jdt.core,
+ org.eclipse.jdt.ui.wizards,
+ org.eclipse.jface.wizard,
+ org.eclipse.osee.framework.core.operation,
+ org.eclipse.osee.framework.jdk.core.util,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.osee.framework.plugin.core,
+ org.eclipse.osee.framework.plugin.core.util,
+ org.eclipse.osee.framework.ui.plugin.workspace,
+ org.eclipse.osee.framework.ui.swt,
+ org.eclipse.osee.framework.ui.workspacebundleloader,
+ org.eclipse.osee.ote.classserver,
+ org.eclipse.osee.ote.core,
+ org.eclipse.swt,
+ org.eclipse.swt.layout,
+ org.eclipse.swt.widgets,
+ org.eclipse.ui,
+ org.osgi.framework
+Export-Package: org.eclipse.osee.ote.runtimemanager
+Require-Bundle: org.eclipse.osgi,
+ org.eclipse.ui
+Bundle-ActivationPolicy: lazy
+Bundle-Vendor: Eclipse Open System Engineering Environment
diff --git a/org.eclipse.osee.ote.runtimeManager/build.properties b/org.eclipse.osee.ote.runtimeManager/build.properties
new file mode 100644
index 000000000..e9863e281
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml
diff --git a/org.eclipse.osee.ote.runtimeManager/plugin.xml b/org.eclipse.osee.ote.runtimeManager/plugin.xml
new file mode 100644
index 000000000..022818d8b
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/plugin.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+ <extension
+ id="OteSystemLibsNature"
+ name="OTE System Libraries Nature"
+ point="org.eclipse.core.resources.natures">
+ <runtime>
+ <run
+ class="org.eclipse.osee.ote.runtimemanager.OteSystemLibsNature">
+ </run>
+ </runtime>
+ </extension>
+ <extension
+ id="OteUserLibsNature"
+ name="OTE User Libraries Nature"
+ point="org.eclipse.core.resources.natures">
+ <runtime>
+ <run
+ class="org.eclipse.osee.ote.runtimemanager.OteUserLibsNature">
+ </run>
+ </runtime>
+ </extension>
+
+ <extension
+ point="org.eclipse.ui.startup">
+ <startup
+ class="org.eclipse.osee.ote.runtimemanager.EarlyStartup">
+ </startup>
+ </extension>
+ <extension
+ point="org.eclipse.jdt.core.classpathContainerInitializer">
+ <classpathContainerInitializer
+ class="org.eclipse.osee.ote.runtimemanager.container.OteClasspathContainerInitializer"
+ id="OTE Library">
+ </classpathContainerInitializer>
+ </extension>
+ <extension
+ point="org.eclipse.jdt.ui.classpathContainerPage">
+ <classpathContainerPage
+ class="org.eclipse.osee.ote.runtimemanager.container.OteContainerPage"
+ id="org.eclipse.osee.ote.runtimeManager.container.OTE_CONTAINER"
+ name="OTE Library">
+ </classpathContainerPage>
+ </extension>
+
+</plugin>
diff --git a/org.eclipse.osee.ote.runtimeManager/pom.xml b/org.eclipse.osee.ote.runtimeManager/pom.xml
new file mode 100644
index 000000000..6e7653068
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/pom.xml
@@ -0,0 +1,35 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.osee</groupId>
+ <artifactId>org.eclipse.osee.ote.parent</artifactId>
+ <version>0.25.3-SNAPSHOT</version>
+ <relativePath>../org.eclipse.osee.ote.parent</relativePath>
+ </parent>
+
+ <artifactId>org.eclipse.osee.ote.runtimeManager</artifactId>
+ <packaging>eclipse-plugin</packaging>
+ <name>OTE Runtime Manager (Incubation)</name>
+
+ <build>
+ <!-- workaround for https://issues.sonatype.org/browse/TYCHO-168 -->
+ <resources>
+ <resource>
+ <directory>src</directory>
+ <excludes>
+ <exclude>**/*.java</exclude>
+ </excludes>
+ </resource>
+ </resources>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-source-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/EarlyStartup.java b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/EarlyStartup.java
new file mode 100644
index 000000000..ca2bf461f
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/EarlyStartup.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.runtimemanager;
+
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.swt.Displays;
+import org.eclipse.osee.ote.core.ServiceUtility;
+import org.eclipse.ui.IStartup;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class EarlyStartup implements IStartup {
+
+ private SafeWorkspaceTracker workspaceTracker;
+
+ @Override
+ public void earlyStartup() {
+ Displays.ensureInDisplayThread(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ workspaceTracker = new SafeWorkspaceTracker(ServiceUtility.getContext());
+ workspaceTracker.open(true);
+ } catch (Throwable ex) {
+ OseeLog.log(RuntimeManager.class, Level.SEVERE, ex);
+ }
+ }
+ });
+ }
+}
diff --git a/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/JarListenerStub.java b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/JarListenerStub.java
new file mode 100644
index 000000000..6a5cd00da
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/JarListenerStub.java
@@ -0,0 +1,139 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.runtimemanager;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.jar.JarFile;
+import java.util.jar.Manifest;
+import org.eclipse.osee.framework.ui.workspacebundleloader.IJarChangeListener;
+import org.eclipse.osee.framework.ui.workspacebundleloader.JarCollectionNature;
+import org.eclipse.osee.ote.core.BundleInfo;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class JarListenerStub<T extends JarCollectionNature> implements IJarChangeListener<T> {
+
+ private final Object bundleSynchronizer;
+ private final Set<String> newBundles;
+ private final Set<String> changedBundles;
+ private final Set<String> removedBundles;
+
+ public JarListenerStub() {
+ this.bundleSynchronizer = new Object();
+ this.newBundles = new HashSet<>();
+ this.changedBundles = new HashSet<>();
+ this.removedBundles = new HashSet<>();
+ }
+
+ @Override
+ public void handleBundleAdded(URL url) {
+ try {
+ String bundleName = getBundleNameFromJar(url);
+ synchronized (bundleSynchronizer) {
+ newBundles.add(bundleName);
+ changedBundles.remove(bundleName);
+ removedBundles.remove(bundleName);
+ }
+ System.out.println("Bundle added:" + bundleName);
+ } catch (IOException ex) {
+ }
+ }
+
+ @Override
+ public void handleBundleChanged(URL url) {
+ try {
+ String bundleName = getBundleNameFromJar(url);
+ synchronized (bundleSynchronizer) {
+ changedBundles.add(bundleName);
+ newBundles.remove(bundleName);
+ removedBundles.remove(bundleName);
+ }
+ System.out.println("Bundle changed:" + bundleName);
+ } catch (IOException ex) {
+ }
+ }
+
+ @Override
+ public void handleBundleRemoved(URL url) {
+ try {
+ String bundleName = getBundleNameFromJar(url);
+ synchronized (bundleSynchronizer) {
+ removedBundles.add(bundleName);
+ newBundles.remove(bundleName);
+ changedBundles.remove(bundleName);
+ }
+ System.out.println("Bundle removed:" + bundleName);
+ } catch (IOException ex) {
+ }
+ }
+
+ @Override
+ public void handleNatureClosed(T nature) {
+ System.out.println("Project closed: " + nature.getProject().getName());
+ for (URL url : nature.getBundles()) {
+ handleBundleRemoved(url);
+ }
+ }
+
+ @Override
+ public void handlePostChange() {
+ System.out.println("Bunch of changes just finished");
+ }
+
+ private <S extends Object> Set<S> duplicateAndClear(Set<S> set) {
+ synchronized (bundleSynchronizer) {
+ Set<S> returnBundles = new HashSet<>(set);
+ set.clear();
+ return returnBundles;
+ }
+ }
+
+ /**
+ * @return the newBundles
+ */
+ public Set<String> consumeNewBundles() {
+ return duplicateAndClear(newBundles);
+ }
+
+ /**
+ * @return the changedBundles
+ */
+ public Set<String> consumeChangedBundles() {
+ return duplicateAndClear(changedBundles);
+ }
+
+ /**
+ * @return the removedBundles
+ */
+ public Set<String> consumeRemovedBundles() {
+ return duplicateAndClear(removedBundles);
+ }
+
+ private String getBundleNameFromJar(URL url) throws IOException {
+ File file;
+ try {
+ file = new File(url.toURI());
+ } catch (URISyntaxException ex) {
+ file = new File(url.getPath());
+ }
+
+ JarFile jarFile = new JarFile(file);
+ Manifest jarManifest = jarFile.getManifest();
+ return BundleInfo.generateBundleName(jarManifest);
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/LibJarListener.java b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/LibJarListener.java
new file mode 100644
index 000000000..a743a38ea
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/LibJarListener.java
@@ -0,0 +1,159 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.runtimemanager;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.jar.JarFile;
+import java.util.jar.Manifest;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.osee.framework.ui.workspacebundleloader.FileChangeDetector;
+import org.eclipse.osee.framework.ui.workspacebundleloader.IJarChangeListener;
+import org.eclipse.osee.framework.ui.workspacebundleloader.JarCollectionNature;
+import org.eclipse.osee.ote.core.BundleInfo;
+import org.eclipse.osee.ote.runtimemanager.container.OteClasspathContainer;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class LibJarListener<T extends JarCollectionNature> implements IJarChangeListener<T> {
+
+ private static final boolean VERBOSE_DEBUG = true;
+
+ private final FileChangeDetector detector = new FileChangeDetector();
+
+ private final Object bundleSynchronizer;
+ private final Set<URL> newBundles;
+ private final Set<URL> changedBundles;
+ private final Set<URL> removedBundles;
+
+ public LibJarListener() {
+ this.bundleSynchronizer = new Object();
+ this.newBundles = new HashSet<>();
+ this.changedBundles = new HashSet<>();
+ this.removedBundles = new HashSet<>();
+ }
+
+ @Override
+ public void handleBundleAdded(URL url) {
+ synchronized (bundleSynchronizer) {
+ if (detector.isChanged(url)) {
+ newBundles.add(url);
+ changedBundles.remove(url);
+ removedBundles.remove(url);
+ debugEcho(url);
+ }
+ }
+ }
+
+ @Override
+ public void handleBundleChanged(URL url) {
+ synchronized (bundleSynchronizer) {
+ if (detector.isChanged(url)) {
+ changedBundles.add(url);
+ newBundles.remove(url);
+ removedBundles.remove(url);
+ debugEcho(url);
+ }
+ }
+ }
+
+ @Override
+ public void handleBundleRemoved(URL url) {
+ synchronized (bundleSynchronizer) {
+ detector.remove(url);
+ removedBundles.add(url);
+ newBundles.remove(url);
+ changedBundles.remove(url);
+ }
+ debugEcho(url);
+ }
+
+ private void debugEcho(URL url) {
+ if (VERBOSE_DEBUG) {
+ try {
+ String bundleName = getBundleNameFromJar(url);
+ System.out.println("Bundle changed:" + bundleName);
+ } catch (IOException ex) {
+ }
+ }
+ }
+
+ @Override
+ public void handleNatureClosed(T nature) {
+ IProject project = nature.getProject();
+ System.out.println("Project closed: " + project.getName());
+ for (URL url : nature.getBundles()) {
+ handleBundleRemoved(url);
+ }
+
+ nature.setClosing(true);
+ updateContainers();
+ nature.setClosing(false);
+ }
+
+ private void updateContainers() {
+ OteClasspathContainer.refreshAll();
+ }
+
+ @Override
+ public void handlePostChange() {
+ updateContainers();
+ System.out.println("Bunch of changes just finished");
+ }
+
+ private <S extends Object> Set<S> duplicateAndClear(Set<S> set) {
+ synchronized (bundleSynchronizer) {
+ Set<S> returnBundles = new HashSet<>(set);
+ set.clear();
+ return returnBundles;
+ }
+ }
+
+ /**
+ * @return the newBundles
+ */
+ public Set<URL> consumeNewBundles() {
+ return duplicateAndClear(newBundles);
+ }
+
+ /**
+ * @return the changedBundles
+ */
+ public Set<URL> consumeChangedBundles() {
+ return duplicateAndClear(changedBundles);
+ }
+
+ /**
+ * @return the removedBundles
+ */
+ public Set<URL> consumeRemovedBundles() {
+ return duplicateAndClear(removedBundles);
+ }
+
+ private String getBundleNameFromJar(URL url) throws IOException {
+ File file;
+ try {
+ file = new File(url.toURI());
+ } catch (URISyntaxException ex) {
+ file = new File(url.getPath());
+ }
+
+ JarFile jarFile = new JarFile(file);
+ Manifest jarManifest = jarFile.getManifest();
+ return BundleInfo.generateBundleName(jarManifest);
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/OteSystemLibsNature.java b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/OteSystemLibsNature.java
new file mode 100644
index 000000000..9d945b0ff
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/OteSystemLibsNature.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.runtimemanager;
+
+import java.util.Collection;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.osee.framework.ui.workspacebundleloader.JarCollectionNature;
+
+public class OteSystemLibsNature extends JarCollectionNature {
+ public static final String NATURE_ID = "org.eclipse.osee.ote.runtimeManager.OteSystemLibsNature";
+ private static final String BUNDLE_PATH_ATTRIBUTE = "OteBundlePath";
+
+ public OteSystemLibsNature() {
+ super(BUNDLE_PATH_ATTRIBUTE);
+ }
+
+ public static Collection<OteSystemLibsNature> getWorkspaceProjects() throws CoreException {
+ return getWorkspaceProjects(NATURE_ID, OteSystemLibsNature.class);
+ }
+}
diff --git a/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/OteUserLibsNature.java b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/OteUserLibsNature.java
new file mode 100644
index 000000000..f4334c436
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/OteUserLibsNature.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.runtimemanager;
+
+import java.util.Collection;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.osee.framework.ui.workspacebundleloader.JarCollectionNature;
+
+public class OteUserLibsNature extends JarCollectionNature {
+ public static final String NATURE_ID = "org.eclipse.osee.ote.runtimeManager.OteUserLibsNature";
+ private static final String BUNDLE_PATH_ATTRIBUTE = "OteBundlePath";
+
+ public OteUserLibsNature() {
+ super(BUNDLE_PATH_ATTRIBUTE);
+ }
+
+ public static Collection<OteUserLibsNature> getWorkspaceProjects() throws CoreException {
+ return getWorkspaceProjects(NATURE_ID, OteUserLibsNature.class);
+ }
+}
diff --git a/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/PrecompiledListener.java b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/PrecompiledListener.java
new file mode 100644
index 000000000..cb27a59ed
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/PrecompiledListener.java
@@ -0,0 +1,151 @@
+package org.eclipse.osee.ote.runtimemanager;
+
+import java.io.File;
+import java.net.URL;
+import java.util.Scanner;
+import java.util.logging.Level;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.framework.core.operation.AbstractOperation;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.ui.swt.Displays;
+import org.eclipse.osee.framework.ui.workspacebundleloader.IJarChangeListener;
+import org.eclipse.ui.PlatformUI;
+import org.osgi.framework.Version;
+
+public class PrecompiledListener implements IJarChangeListener<OteSystemLibsNature> {
+
+ private static final Matcher VERSION_MATTCHER = Pattern.compile("(\\d+.\\d+.\\d+)").matcher("");
+ private boolean firstTime = true;
+ private boolean isPrecompiledInstalled = false;
+
+ @Override
+ public void handleBundleAdded(URL url) {
+ // do nothing -- gets called for each jar in the precompiled project
+ }
+
+ @Override
+ public void handleBundleChanged(URL url) {
+ // do nothing -- gets called for each jar in the precompiled project
+ }
+
+ @Override
+ public void handleBundleRemoved(URL url) {
+ // do nothing?
+ }
+
+ @Override
+ public void handlePostChange() {
+ runCheckInThread();
+ }
+
+ @Override
+ public void handleNatureClosed(OteSystemLibsNature nature) {
+ // do nothing?
+ }
+
+ public void runCheckInThread() {
+ Jobs.runInJob(new AbstractOperation("Precompiled Version Check", RuntimeManager.BUNDLE_ID) {
+
+ @Override
+ protected void doWork(IProgressMonitor monitor) throws Exception {
+ runCheck();
+ }}, false);
+ }
+
+ private synchronized void runCheck() {
+ if(firstTime) {
+ firstTime = false;
+ URL installLocation = Platform.getInstallLocation().getURL();
+ File pluginsDir = new File(installLocation.getFile() + File.separator + "plugins");
+ for(File plugin : Lib.recursivelyListFiles(pluginsDir)) {
+ if(plugin.getName().startsWith("ote.cdb.messages")) {
+ isPrecompiledInstalled = true;
+ break;
+ }
+ }
+ }
+
+ String precompileVersion = null;
+ try {
+ for (OteSystemLibsNature nature : OteSystemLibsNature.getWorkspaceProjects()) {
+ IProject project = nature.getProject();
+ if (precompileVersion == null && project.getName().contains("precompiled")) {
+ IFile buildLabel = project.getFile("build_label.txt");
+ Scanner s = new Scanner(buildLabel.getContents());
+ try {
+ while (s.hasNextLine()) {
+ String line = s.nextLine().toLowerCase();
+ if (line.contains("osee build")) {
+ String[] tokens = line.split(":");
+ if (tokens.length == 2) {
+ precompileVersion = tokens[1].trim();
+ break;
+ }
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(RuntimeManager.class, Level.SEVERE, ex);
+ } finally {
+ Lib.close(s);
+ }
+ }
+
+ if(precompileVersion != null) {
+ break;
+ }
+
+ }
+ } catch (CoreException ex) {
+ OseeLog.log(RuntimeManager.class, Level.SEVERE, ex);
+ }
+
+ if (precompileVersion != null) {
+ final String message;
+ if(isPrecompiledInstalled) {
+ message = "Conflict: Precompiled detected in workspace of non precompiled required client!\nPlease remove it from the workspace and restart.";
+ } else {
+ Version client = RuntimeManager.getDefault().getContext().getBundle().getVersion();
+ String clientStr = "", precompileStr = "";
+ Matcher matcher = VERSION_MATTCHER.reset(client.toString());
+ if(matcher.find()) {
+ clientStr = matcher.group(1);
+ }
+ matcher = VERSION_MATTCHER.reset(precompileVersion.toString());
+ if(matcher.find()) {
+ precompileStr = matcher.group(1);
+ }
+
+ if(!clientStr.equals(precompileStr)) {
+ message = String.format(
+ "OTE IDE / Precompiled Libraries version mismatch!\nOTE[%s] != Precompiled[%s]\nPlease get the version that matches [%s].",
+ clientStr, precompileStr, clientStr);
+ } else {
+ message = null;
+ }
+
+ }
+
+ if (message != null) {
+ Displays.ensureInDisplayThread(new Runnable() {
+
+ @Override
+ public void run() {
+ MessageDialog.openError(PlatformUI.getWorkbench().getModalDialogShellProvider().getShell(), "Precompiled Version",
+ message);
+ }
+ }, true);
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/RuntimeManager.java b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/RuntimeManager.java
new file mode 100644
index 000000000..4a37a72cb
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/RuntimeManager.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.runtimemanager;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class RuntimeManager implements BundleActivator {
+ public static final String BUNDLE_ID = "org.eclipse.osee.ote.runtimeManager";
+ private static RuntimeManager instance;
+ private BundleContext context;
+
+ public static RuntimeManager getDefault() {
+ return instance;
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ instance = this;
+ this.context = context;
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ instance = null;
+ this.context = null;
+ }
+
+ public BundleContext getContext() {
+ return context;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/SafeWorkspaceTracker.java b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/SafeWorkspaceTracker.java
new file mode 100644
index 000000000..b527ed384
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/SafeWorkspaceTracker.java
@@ -0,0 +1,267 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.runtimemanager;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.Set;
+import java.util.jar.JarFile;
+import java.util.jar.Manifest;
+import java.util.logging.Level;
+
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.osee.framework.core.operation.AbstractOperation;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.eclipse.osee.framework.ui.plugin.workspace.SafeWorkspaceAccess;
+import org.eclipse.osee.framework.ui.workspacebundleloader.JarChangeResourceListener;
+import org.eclipse.osee.ote.core.BundleInfo;
+import org.eclipse.osee.ote.core.OteBundleLocator;
+import org.eclipse.osee.ote.runtimemanager.container.OteClasspathContainer;
+import org.eclipse.osee.ote.runtimemanager.internal.ProjectChangeResourceListener;
+import org.eclipse.osee.ote.runtimemanager.internal.RuntimeBundleServer;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * @author Robert A. Fisher
+ * @author Andrew M. Finkbeiner
+ */
+public class SafeWorkspaceTracker extends ServiceTracker implements OteBundleLocator {
+
+ private JarChangeResourceListener<OteSystemLibsNature> systemLibResourceListener;
+ private JarChangeResourceListener<OteSystemLibsNature> precompiledResourceListener;
+ private JarChangeResourceListener<OteUserLibsNature> userLibResourceListener;
+ private LibJarListener<OteSystemLibsNature> systemLibListener;
+ private PrecompiledListener precompiledListener;
+ private LibJarListener<OteUserLibsNature> userLibListener;
+ private ProjectChangeResourceListener projectChangeResourceListener;
+ private RuntimeBundleServer bundleServer;
+ private SafeWorkspaceAccess service;
+ private final BundleContext context;
+
+ public SafeWorkspaceTracker(BundleContext context) {
+ super(context, SafeWorkspaceAccess.class.getName(), null);
+ this.context = context;
+ }
+
+ @Override
+ public Object addingService(ServiceReference reference) {
+ this.systemLibListener = new LibJarListener<>();
+ this.userLibListener = new LibJarListener<>();
+ this.precompiledListener = new PrecompiledListener();
+ this.systemLibResourceListener =
+ new JarChangeResourceListener<OteSystemLibsNature>(OteSystemLibsNature.NATURE_ID, systemLibListener);
+ this.userLibResourceListener =
+ new JarChangeResourceListener<OteUserLibsNature>(OteUserLibsNature.NATURE_ID, userLibListener);
+ this.precompiledResourceListener = new JarChangeResourceListener<>(OteSystemLibsNature.NATURE_ID, precompiledListener);
+ this.projectChangeResourceListener = new ProjectChangeResourceListener();
+ service = (SafeWorkspaceAccess) context.getService(reference);
+ slowLoadingJars();
+ precompiledListener.runCheckInThread();
+
+ return super.addingService(reference);
+ }
+
+ private void slowLoadingJars() {
+ Jobs.runInJob(new LocateWorkspaceBundles("Locating Workspace Bundles", RuntimeManager.BUNDLE_ID), false);
+
+ }
+
+ private class LocateWorkspaceBundles extends AbstractOperation {
+ public LocateWorkspaceBundles(String operationName, String pluginId) {
+ super(operationName, pluginId);
+ }
+
+ @SuppressWarnings("rawtypes")
+ @Override
+ protected void doWork(IProgressMonitor monitor) throws Exception {
+ IWorkspace workspace = service.getWorkspace();
+ try {
+ scrapeAllLibs();
+ } catch (CoreException ex) {
+ OseeLog.log(RuntimeManager.class, Level.SEVERE, ex);
+ }
+ workspace.addResourceChangeListener(systemLibResourceListener);
+ workspace.addResourceChangeListener(userLibResourceListener);
+ workspace.addResourceChangeListener(precompiledResourceListener);
+
+ SafeWorkspaceTracker.this.bundleServer = new RuntimeBundleServer(SafeWorkspaceTracker.this);
+
+ context.registerService(OteBundleLocator.class.getName(), SafeWorkspaceTracker.this, new Hashtable());
+ OteClasspathContainer.refreshAll();
+ }
+ }
+
+ private void scrapeAllLibs() throws CoreException {
+ for (OteSystemLibsNature nature : OteSystemLibsNature.getWorkspaceProjects()) {
+ for (URL url : nature.getBundles()) {
+ systemLibListener.handleBundleAdded(url);
+ }
+
+ projectChangeResourceListener.addProject(nature.getProject());
+ }
+ for (OteUserLibsNature nature : OteUserLibsNature.getWorkspaceProjects()) {
+ for (URL url : nature.getBundles()) {
+ userLibListener.handleBundleAdded(url);
+ }
+
+ projectChangeResourceListener.addProject(nature.getProject());
+ }
+ }
+
+ @Override
+ public synchronized void close() {
+ IWorkspace workspace = service.getWorkspace();
+ if (workspace != null) {
+ workspace.removeResourceChangeListener(systemLibResourceListener);
+ workspace.removeResourceChangeListener(userLibResourceListener);
+ workspace.removeResourceChangeListener(precompiledResourceListener);
+ }
+ super.close();
+ }
+
+ /**
+ * Returns a list of URL's to workspace jars to be used for the test server. The collection returned is a combination
+ * of all the user libraries and any system libraries that weren't already supplied in the user libraries. The
+ * workspace is considered to have runtime libraries only if there are system libraries present. Subsequently, if no
+ * system libraries are in the workspace then this method will return an empty collection.
+ *
+ * @return runtime library bundle infos
+ */
+ @Override
+ public Collection<BundleInfo> getRuntimeLibs() throws IOException, CoreException {
+ Collection<URL> userLibUrls = getUserLibUrls();
+ Collection<URL> systemLibUrls = getSystemLibUrls();
+ // If there are no system libs, then claim no runtime libs
+ if (!systemLibUrls.isEmpty()) {
+ return getRuntimeLibs(systemLibUrls, userLibUrls);
+ } else {
+ return Collections.emptyList();
+ }
+ }
+
+ private Collection<BundleInfo> getRuntimeLibs(Collection<URL> systemLibUrls, Collection<URL> userLibUrls) throws IOException {
+ Map<String, BundleInfo> runtimeMap = new HashMap<>();
+ Collection<BundleInfo> runtimeInfos = new LinkedList<>();
+
+ // First add all of the system libraries to the map
+ for (URL url : systemLibUrls) {
+ String symbolicName = getBundleNameFromJar(url);
+
+ runtimeMap.put(symbolicName, new BundleInfo(url, bundleServer.getClassServerPath(), true));
+ }
+
+ // Now add the user libraries so any system library with the same name
+ // gets replaced
+ for (URL url : userLibUrls) {
+ String symbolicName = getBundleNameFromJar(url);
+
+ runtimeMap.put(symbolicName, new BundleInfo(url, bundleServer.getClassServerPath(), false));
+ }
+
+ runtimeInfos.addAll(runtimeMap.values());
+
+ return runtimeInfos;
+ }
+
+ /**
+ * Returns a list of URL's to all system libraries in the workspace regardless of ones that are supplied in user
+ * libraries.
+ *
+ * @return system library URL's
+ */
+ public Collection<URL> getSystemLibUrls() throws CoreException {
+ Collection<URL> libs = new LinkedList<>();
+ for (OteSystemLibsNature systemNature : OteSystemLibsNature.getWorkspaceProjects()) {
+ libs.addAll(systemNature.getBundles());
+ }
+
+ return libs;
+ }
+
+ /**
+ * Returns a list of URL's to all user libraries in the workspace.
+ *
+ * @return user library URL's
+ */
+ public Collection<URL> getUserLibUrls() throws CoreException {
+ Collection<URL> libs = new LinkedList<>();
+ for (OteUserLibsNature userNature : OteUserLibsNature.getWorkspaceProjects()) {
+ libs.addAll(userNature.getBundles());
+ }
+
+ return libs;
+ }
+
+ private String getBundleNameFromJar(URL url) throws IOException {
+ File file;
+ try {
+ file = new File(url.toURI());
+ } catch (URISyntaxException ex) {
+ file = new File(url.getPath());
+ }
+
+ JarFile jarFile = new JarFile(file);
+ Manifest jarManifest = jarFile.getManifest();
+ return BundleInfo.generateBundleName(jarManifest);
+ }
+
+ /**
+ * Returns a list of all bundles that have been modified since the last time this was called.
+ */
+ @Override
+ public Collection<BundleInfo> consumeModifiedLibs() throws IOException {
+ // Collection<BundleInfo> modifiedLibs = new LinkedList<>();
+
+ Set<URL> sysNewBundles = systemLibListener.consumeNewBundles();
+ Set<URL> sysChangedBundles = systemLibListener.consumeChangedBundles();
+ // Set<URL> sysRemovedBundles =
+ systemLibListener.consumeRemovedBundles();
+
+ Set<URL> userNewBundles = userLibListener.consumeNewBundles();
+ Set<URL> userChangedBundles = userLibListener.consumeChangedBundles();
+ // Set<URL> userRemovedBundles =
+ userLibListener.consumeRemovedBundles();
+
+ Collection<URL> sysNewModLibs = new ArrayList<>(sysNewBundles.size() + sysChangedBundles.size());
+ sysNewModLibs.addAll(sysNewBundles);
+ sysNewModLibs.addAll(sysChangedBundles);
+
+ Collection<URL> userNewModLibs = new ArrayList<>(userNewBundles.size() + userChangedBundles.size());
+ userNewModLibs.addAll(userNewBundles);
+ userNewModLibs.addAll(userChangedBundles);
+
+ // TODO what about removed libs?
+ return getRuntimeLibs(sysNewModLibs, userNewModLibs);
+
+ // // For now, return all user libs
+ // for (BundleInfo info : getRuntimeLibs()) {
+ // if (!info.isSystemLibrary()) {
+ // modifiedLibs.add(info);
+ // }
+ // }
+ //
+ // return modifiedLibs;
+ }
+}
diff --git a/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/UserLibResourceFinder.java b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/UserLibResourceFinder.java
new file mode 100644
index 000000000..c176b4cc6
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/UserLibResourceFinder.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.runtimemanager;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.osee.ote.classserver.ResourceFinder;
+
+/**
+ * Finds resources that
+ *
+ * @author Robert A. Fisher
+ */
+public class UserLibResourceFinder extends ResourceFinder {
+
+ public UserLibResourceFinder() {
+ }
+
+ @Override
+ public byte[] find(String path) throws IOException {
+ try {
+ for (OteUserLibsNature userLibsNature : OteUserLibsNature.getWorkspaceProjects()) {
+ IProject project = userLibsNature.getProject();
+
+ IProjectDescription description;
+ try {
+ description = project.getDescription();
+ if (description.hasNature("org.eclipse.jdt.core.javanature")) {
+
+ IJavaProject javaProject = JavaCore.create(project);
+
+ // Projects don't have to be stored in the workspace, so make sure to use the project.getLocation as the starting point
+ IPath candidate =
+ project.getLocation().removeLastSegments(1).append(javaProject.getOutputLocation().makeAbsolute()).append(
+ path);
+ if (candidate.toFile().exists()) {
+ File file = candidate.toFile();
+
+ try {
+ return getBytes(new FileInputStream(file), file.length());
+ } catch (FileNotFoundException e) {
+ }
+ }
+ }
+ } catch (CoreException ex) {
+ ex.printStackTrace();
+ }
+ }
+ } catch (CoreException ex) {
+ }
+ return null;
+ }
+
+ @Override
+ public void dispose() {
+ }
+}
diff --git a/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/container/OteClasspathContainer.java b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/container/OteClasspathContainer.java
new file mode 100644
index 000000000..08f4a568b
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/container/OteClasspathContainer.java
@@ -0,0 +1,199 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.runtimemanager.container;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.core.IClasspathContainer;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.osee.ote.core.BundleInfo;
+import org.eclipse.osee.ote.core.OteBundleLocator;
+import org.eclipse.osee.ote.runtimemanager.RuntimeManager;
+import org.osgi.framework.BundleContext;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class OteClasspathContainer implements IClasspathContainer {
+ public final static Path ID = new Path("OTE Library");
+ private ServiceTracker tracker;
+ private OteBundleLocator locator;
+ private final IJavaProject javaProject;
+ private final IPath containerPath;
+
+ private static final List<OteClasspathContainer> activeContainers = new ArrayList<>();
+
+ private static boolean classpathEnabled;
+ static {
+ classpathEnabled = System.getProperty("ote.container.activate") != null;
+ }
+
+ public OteClasspathContainer(IPath path, IJavaProject javaProject) {
+ this.javaProject = javaProject;
+ this.containerPath = path;
+
+ try {
+ BundleContext context = RuntimeManager.getDefault().getContext();
+ tracker = new ServiceTracker(context, OteBundleLocator.class.getName(), null);
+ tracker.open(true);
+ initializeBundleLocator();
+
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+
+ activeContainers.add(this);
+ }
+
+ private void initializeBundleLocator() throws InterruptedException {
+ Object obj = tracker.waitForService(1);
+ locator = (OteBundleLocator) obj;
+ }
+
+ public OteClasspathContainer(OteClasspathContainer oteClasspathContainer) {
+ this(oteClasspathContainer.containerPath, oteClasspathContainer.javaProject);
+ }
+
+ private File recursivelyFindProjectFile(File file) {
+
+ if (file == null) {
+ return file;
+ }
+
+ if (fileIsDirectoryWithBin(file)) {
+ return file;
+ } else {
+ return recursivelyFindProjectFile(file.getParentFile());
+ }
+ }
+
+ private boolean fileIsDirectoryWithBin(File file) {
+ if (file.isDirectory()) {
+ File binChildFile = new File(file.getAbsoluteFile() + "/bin");
+ if (binChildFile.exists()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public IClasspathEntry[] getClasspathEntries() {
+ List<IClasspathEntry> entries = new ArrayList<>();
+ Collection<BundleInfo> runtimeLibUrls;
+ if (classpathEnabled) {
+ try {
+ lazyLoadLocator();
+ if (locator == null) {
+ return entries.toArray(new IClasspathEntry[0]);
+ }
+
+ runtimeLibUrls = locator.getRuntimeLibs();
+ for (BundleInfo info : runtimeLibUrls) {
+ String binaryFilePath = info.getFile().getCanonicalPath();
+
+ if (info.isSystemLibrary()) {
+ entries.add(JavaCore.newLibraryEntry(new Path(binaryFilePath), new Path(binaryFilePath),
+ new Path("/")));
+ } else {
+ File projectFilePath = recursivelyFindProjectFile(new File(binaryFilePath));
+ if (!projectMatchesClasspathFile(projectFilePath)) {
+ binaryFilePath = "/" + projectFilePath.getName();
+
+ entries.add(JavaCore.newProjectEntry(new Path(binaryFilePath)));
+ }
+ }
+ }
+
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+ IClasspathEntry[] retVal = new IClasspathEntry[entries.size()];
+ return entries.toArray(retVal);
+ }
+
+ private void lazyLoadLocator() throws InterruptedException {
+ if (locator == null) {
+ initializeBundleLocator();
+ }
+ }
+
+ private boolean projectMatchesClasspathFile(File projectFilePath) {
+ String projectBeingResolvedName = javaProject.getPath().toString();
+ String classpathFilePath = projectFilePath.getName();
+ if (projectBeingResolvedName.contains(classpathFilePath)) {
+ return true;
+ }
+
+ return false;
+ }
+
+ @Override
+ public String getDescription() {
+ return ID.segment(0);
+ }
+
+ @Override
+ public int getKind() {
+ return IClasspathContainer.K_APPLICATION;
+ }
+
+ @Override
+ public IPath getPath() {
+ return ID;
+ }
+
+ public static void refreshAll() {
+ if (classpathEnabled) {
+ for (OteClasspathContainer container : activeContainers.toArray(new OteClasspathContainer[0])) {
+ container.refresh();
+ }
+ }
+ }
+
+ public void refresh() {
+ if (classpathEnabled) {
+ try {
+ activeContainers.remove(this);
+ if (javaProject.isOpen()) {
+ JavaCore.setClasspathContainer(containerPath, new IJavaProject[] {javaProject},
+ new IClasspathContainer[] {new OteClasspathContainer(this)}, null);
+ }
+ // new Thread(new Runnable() {
+ //
+ // @Override
+ // public void run() {
+ // try {
+ // Thread.sleep(10000);
+ // }
+ // catch (InterruptedException ex) {
+ // ex.printStackTrace();
+ // }
+ // catch (Exception ex) {
+ // ex.printStackTrace();
+ // }
+ // }
+ //
+ // }).start();
+ } catch (Exception ex) {
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/container/OteClasspathContainerInitializer.java b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/container/OteClasspathContainerInitializer.java
new file mode 100644
index 000000000..88c4fc5f2
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/container/OteClasspathContainerInitializer.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.runtimemanager.container;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jdt.core.ClasspathContainerInitializer;
+import org.eclipse.jdt.core.IClasspathContainer;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+
+public class OteClasspathContainerInitializer extends ClasspathContainerInitializer {
+
+ public OteClasspathContainerInitializer() {
+ }
+
+ @Override
+ public void initialize(IPath containerPath, IJavaProject project) throws CoreException {
+
+ OteClasspathContainer oteClasspathContainer = new OteClasspathContainer(containerPath, project);
+ JavaCore.setClasspathContainer(containerPath, new IJavaProject[] {project},
+ new IClasspathContainer[] {oteClasspathContainer}, null);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/container/OteContainerPage.java b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/container/OteContainerPage.java
new file mode 100644
index 000000000..b8313c47f
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/container/OteContainerPage.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.runtimemanager.container;
+
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.ui.wizards.IClasspathContainerPage;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+
+public class OteContainerPage extends WizardPage implements IClasspathContainerPage {
+
+ public OteContainerPage() {
+ super("OTE Library");
+ }
+
+ @Override
+ public boolean finish() {
+ return true;
+ }
+
+ @Override
+ public IClasspathEntry getSelection() {
+ return JavaCore.newContainerEntry(OteClasspathContainer.ID);
+ }
+
+ @Override
+ public void setSelection(IClasspathEntry containerEntry) {
+ }
+
+ @Override
+ public void createControl(Composite parent) {
+ Composite comp = new Composite(parent, SWT.None);
+ GridLayout layout = new GridLayout(1, true);
+ comp.setLayout(layout);
+
+ GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
+ comp.setLayoutData(data);
+
+ Label label = new Label(comp, SWT.NONE);
+ label.setText("Please click finish.");
+
+ data = new GridData(SWT.FILL, SWT.FILL, true, true);
+ label.setLayoutData(data);
+ setControl(comp);
+
+ }
+
+}
diff --git a/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/internal/ProjectChangeResourceListener.java b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/internal/ProjectChangeResourceListener.java
new file mode 100644
index 000000000..0a811dd06
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/internal/ProjectChangeResourceListener.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.runtimemanager.internal;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceChangeListener;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class ProjectChangeResourceListener implements IResourceChangeListener {
+
+ @Override
+ public void resourceChanged(IResourceChangeEvent event) {
+ }
+
+ public void addProject(IProject project) {
+ }
+
+}
diff --git a/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/internal/RuntimeBundleServer.java b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/internal/RuntimeBundleServer.java
new file mode 100644
index 000000000..2cdd500c4
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/internal/RuntimeBundleServer.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.runtimemanager.internal;
+
+import java.net.BindException;
+import java.net.Inet6Address;
+import java.net.InetAddress;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.CorePreferences;
+import org.eclipse.osee.ote.classserver.ClassServer;
+import org.eclipse.osee.ote.classserver.ResourceFinder;
+import org.eclipse.osee.ote.runtimemanager.RuntimeManager;
+import org.eclipse.osee.ote.runtimemanager.SafeWorkspaceTracker;
+
+public class RuntimeBundleServer {
+ private ClassServer classServer;
+ private String classServerPath;
+ private ResourceFinder resourceFinder;
+
+ /**
+ * Creates a new ClassServer which will serve all projects currently in the workspace
+ */
+ public RuntimeBundleServer(SafeWorkspaceTracker safeWorkspaceTracker) {
+ try {
+ InetAddress useHostAddress = CorePreferences.getDefaultInetAddress();
+ classServer = new ClassServer(0, useHostAddress) {
+ @Override
+ protected void fileDownloaded(String fp, InetAddress addr) {
+ System.out.println("RuntimeBundleServer: File " + fp + " downloaded to " + addr);
+ }
+ };
+ resourceFinder = new RuntimeLibResourceFinder(safeWorkspaceTracker);
+ classServer.addResourceFinder(resourceFinder);
+ classServer.start();
+ if(useHostAddress instanceof Inet6Address){
+ classServerPath = "http://[" + useHostAddress.getHostAddress() + "]:" + classServer.getPort() + "/";
+ } else {
+ classServerPath = "http://" + useHostAddress.getHostAddress() + ":" + classServer.getPort() + "/";
+ }
+
+ } catch (BindException ex) {
+ OseeLog.log(
+ RuntimeManager.class,
+ Level.SEVERE,
+ "Class Server not started. Likely the IP address used is not local. Set your IP address in the advanced page.",
+ ex);
+ } catch (Exception ex) {
+ OseeLog.log(RuntimeManager.class, Level.SEVERE, "Class Server not started.", ex);
+ }
+ }
+
+ /**
+ * @return the path to the class server, to be passed to the environment upon connection
+ */
+ public String getClassServerPath() {
+ return classServerPath;
+ }
+
+ /**
+ * Stops the class server. This should be called upon stop of the RuntimeManager
+ */
+ public void stopServer() {
+ classServer.terminate();
+ }
+}
diff --git a/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/internal/RuntimeLibResourceFinder.java b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/internal/RuntimeLibResourceFinder.java
new file mode 100644
index 000000000..79c858f4a
--- /dev/null
+++ b/org.eclipse.osee.ote.runtimeManager/src/org/eclipse/osee/ote/runtimemanager/internal/RuntimeLibResourceFinder.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.runtimemanager.internal;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.Collection;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.ote.classserver.ResourceFinder;
+import org.eclipse.osee.ote.core.BundleInfo;
+import org.eclipse.osee.ote.runtimemanager.SafeWorkspaceTracker;
+
+/**
+ * @author Robert A. Fisher
+ */
+public class RuntimeLibResourceFinder extends ResourceFinder {
+ private final SafeWorkspaceTracker safeWorkspaceTracker;
+
+ public RuntimeLibResourceFinder(SafeWorkspaceTracker safeWorkspaceTracker) {
+ super();
+ this.safeWorkspaceTracker = safeWorkspaceTracker;
+ }
+
+ @Override
+ public byte[] find(String path) throws IOException {
+ try {
+ Collection<BundleInfo> runtimeLibs = safeWorkspaceTracker.getRuntimeLibs();
+ for (BundleInfo info : runtimeLibs) {
+ if (info.getSymbolicName().equals(path)) {
+ return Lib.inputStreamToBytes(new FileInputStream(info.getFile()));
+ }
+ }
+ } catch (CoreException ex) {
+ // TODO
+ ex.printStackTrace();
+ }
+ return null;
+ }
+
+ @Override
+ public void dispose() {
+ }
+}
diff --git a/org.eclipse.osee.ote.server.external.feature/.project b/org.eclipse.osee.ote.server.external.feature/.project
new file mode 100644
index 000000000..412839abb
--- /dev/null
+++ b/org.eclipse.osee.ote.server.external.feature/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ote.server.external.feature</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.pde.FeatureBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.FeatureNature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.server.external.feature/build.properties b/org.eclipse.osee.ote.server.external.feature/build.properties
new file mode 100644
index 000000000..64f93a9f0
--- /dev/null
+++ b/org.eclipse.osee.ote.server.external.feature/build.properties
@@ -0,0 +1 @@
+bin.includes = feature.xml
diff --git a/org.eclipse.osee.ote.server.external.feature/feature.xml b/org.eclipse.osee.ote.server.external.feature/feature.xml
new file mode 100644
index 000000000..ca979dbb6
--- /dev/null
+++ b/org.eclipse.osee.ote.server.external.feature/feature.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+ id="org.eclipse.osee.ote.server.external.feature"
+ label="OTE Server External Feature"
+ version="0.25.3.qualifier"
+ provider-name="Eclipse Open System Engineering Environment">
+
+ <description url="http://www.example.com/description">
+ [Enter Feature Description here.]
+ </description>
+
+ <copyright url="http://www.example.com/copyright">
+ [Enter Copyright Description here.]
+ </copyright>
+
+ <license url="http://www.example.com/license">
+ [Enter License Description here.]
+ </license>
+
+ <plugin
+ id="org.eclipse.core.runtime"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.core.contenttype"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.eclipse.core.jobs"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.apache.commons.dbcp"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="org.apache.commons.pool"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="com.google.guava"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="com.google.inject"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+ <plugin
+ id="javax.inject"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
+</feature>
diff --git a/org.eclipse.osee.ote.server.external.feature/pom.xml b/org.eclipse.osee.ote.server.external.feature/pom.xml
new file mode 100644
index 000000000..7a0b45cf2
--- /dev/null
+++ b/org.eclipse.osee.ote.server.external.feature/pom.xml
@@ -0,0 +1,36 @@
+<project
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.eclipse.osee</groupId>
+ <artifactId>org.eclipse.osee.ote.parent</artifactId>
+ <version>0.25.3-SNAPSHOT</version>
+ <relativePath>../org.eclipse.osee.ote.parent</relativePath>
+ </parent>
+ <artifactId>org.eclipse.osee.ote.server.external.feature</artifactId>
+ <packaging>eclipse-feature</packaging>
+ <name>OSEE OTE Server External Feature - (Incubation)</name>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho.extras</groupId>
+ <artifactId>tycho-source-feature-plugin</artifactId>
+ <executions>
+ <execution>
+ <phase>package</phase>
+ <id>source-feature</id>
+ <goals>
+ <goal>source-feature</goal>
+ </goals>
+ <configuration>
+ <excludes>
+ <plugin id="com.google.guava" />
+ </excludes>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.server.external.feature/sourceTemplateFeature/.gitkeep b/org.eclipse.osee.ote.server.external.feature/sourceTemplateFeature/.gitkeep
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/org.eclipse.osee.ote.server.external.feature/sourceTemplateFeature/.gitkeep
diff --git a/org.eclipse.osee.ote.server/.classpath b/org.eclipse.osee.ote.server/.classpath
new file mode 100644
index 000000000..1fa3e6803
--- /dev/null
+++ b/org.eclipse.osee.ote.server/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.ote.server/.pmd b/org.eclipse.osee.ote.server/.pmd
new file mode 100644
index 000000000..c7b0a9fb3
--- /dev/null
+++ b/org.eclipse.osee.ote.server/.pmd
@@ -0,0 +1,925 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<pmd>
+ <useProjectRuleSet>false</useProjectRuleSet>
+ <ruleSetFile>.ruleset</ruleSetFile>
+ <rules>
+ <rule>
+ <name>LooseCoupling</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneMethodMustImplementCloneable</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedImports</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SignatureDeclareThrowsException</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IfStmtsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>WhileLoopsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IfElseStmtsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ForLoopsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseSingleton</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanReturns</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanExpressions</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SwitchStmtsShouldHaveDefault</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDeeplyNestedIfStmts</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidReassigningParameters</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SwitchDensity</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConstructorCallsOverridableMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AccessorClassGeneration</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalFieldCouldBeStatic</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloseResource</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonStaticInitializer</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DefaultLabelNotLastInSwitchStmt</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonCaseLabelInSwitchStatement</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>OptimizableToArrayCall</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BadComparison</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EqualsNull</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConfusingTernary</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InstantiationToGetClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IdempotentOperations</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimpleDateFormatNeedsLocale</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ImmutableField</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseLocaleWithCaseConversions</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidProtectedFieldInFinalClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AssignmentToNonFinalStatic</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingStaticMethodInNonInstantiatableClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidSynchronizedAtMethodLevel</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingBreakInSwitch</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseNotifyAllInsteadOfNotify</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidInstanceofChecksInCatchClause</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractClassWithoutAbstractMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyConditional</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CompareObjectsWithEquals</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PositionLiteralsFirstInComparisons</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryLocalBeforeReturn</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonThreadSafeSingleton</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UncommentedEmptyMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UncommentedEmptyConstructor</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidConstantsInterface</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnsynchronizedStaticDateFormatter</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PreserveStackTrace</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseCollectionIsEmpty</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassWithOnlyPrivateConstructorsShouldBeFinal</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyMethodInAbstractClassShouldBeAbstract</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SingularField</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReturnEmptyArrayRatherThanNull</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractClassWithoutAnyMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooFewBranchesForASwitchStatement</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCatchingThrowable</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SignatureDeclareThrowsException</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExceptionAsFlowControl</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCatchingNPE</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingRawExceptionTypes</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingNullPointerException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidRethrowingException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotExtendJavaLangError</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotThrowExceptionInFinally</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingNewInstanceOfSameException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedPrivateField</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedLocalVariable</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedPrivateMethod</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedFormalParameter</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MoreThanOneLogger</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LoggerIsNotStaticFinal</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SystemPrintln</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidPrintStackTrace</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDuplicateLiterals</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringInstantiation</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringToString</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InefficientStringBuffering</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryCaseChange</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseStringBufferLength</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AppendCharacterWithChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConsecutiveLiteralAppends</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseIndexOfChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InefficientEmptyStringCheck</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InsufficientStringBufferDeclaration</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessStringValueOf</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringBufferInstantiationWithChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseEqualsToCompareStrings</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidStringBufferField</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceVectorWithList</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceHashtableWithMap</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceEnumerationWithIterator</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidEnumAsIdentifier</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidAssertAsIdentifier</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IntegerInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ByteInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ShortInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LongInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseBeforeAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseAfterAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseTestAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4SuitesShouldUseSuiteAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitUseExpected</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseProperClassLoader</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MDBAndSessionBeanNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>RemoteSessionInterfaceNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LocalInterfaceSessionNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LocalHomeNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>RemoteInterfaceNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotCallSystemExit</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StaticEJBFieldShouldBeFinal</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotUseThreads</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidInstantiatingObjectsInLoops</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseArrayListInsteadOfVector</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyStartsWith</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseStringBufferForStringAppends</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseArraysAsList</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidArrayLoops</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryWrapperObjectCreation</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AddEmptyString</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyCatchBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyIfStmt</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyWhileStmt</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyTryBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyFinallyBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptySwitchStatements</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JumbledIncrementer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ForLoopShouldBeWhileLoop</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryConversionTemporary</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>OverrideBothEqualsAndHashcode</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoubleCheckedLocking</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReturnFromFinallyBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptySynchronizedBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryReturn</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyStaticInitializer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnconditionalIfStatement</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyStatementNotInLoop</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanInstantiation</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryFinalModifier</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CollapsibleIfStatements</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessOverridingMethod</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassCastExceptionWithToArray</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDecimalLiteralsInBigDecimalConstructor</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessOperationOnImmutable</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MisplacedNullCheck</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedNullCheckInEquals</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThreadGroup</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BrokenNullCheck</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BigIntegerInstantiation</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingOctalValues</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingHardCodedIP</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CheckResultSet</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidMultipleUnaryOperators</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyInitializer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodReturnsInternalArray</name>
+ <ruleset>Security Code Guidelines</ruleset>
+ </rule>
+ <rule>
+ <name>ArrayIsStoredDirectly</name>
+ <ruleset>Security Code Guidelines</ruleset>
+ </rule>
+ <rule>
+ <name>CouplingBetweenObjects</name>
+ <ruleset>Coupling Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveImports</name>
+ <ruleset>Coupling Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LooseCoupling</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DuplicateImports</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DontImportJavaLang</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedImports</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ImportFromSamePackage</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyStaticImports</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitStaticSuite</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitSpelling</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitAssertionsShouldIncludeMessage</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitTestsShouldIncludeAssert</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TestClassWithoutTestCases</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryBooleanAssertion</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertEqualsInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertSameInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertNullInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanAssertion</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NullAssignment</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedModifier</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AssignmentInOperand</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AtLeastOneConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DontImportSun</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousOctalEscape</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CallSuperInConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryParentheses</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DefaultPackage</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanInversion</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DataflowAnomalyAnalysis</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFinalLocalVariable</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingShortType</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingVolatile</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingNativeCode</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidAccessibilityAlteration</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotCallGarbageCollectionExplicitly</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodNamingConventions</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassNamingConventions</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractNaming</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDollarSigns</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodWithSameNameAsEnclosingClass</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousHashcodeMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousConstantFieldName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousEqualsMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFieldNameMatchingTypeName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFieldNameMatchingMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NoPackage</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PackageCase</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MisleadingVariableName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanGetMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NPathComplexity</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveMethodLength</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveParameterList</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveClassLength</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CyclomaticComplexity</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessivePublicCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyFields</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssMethodCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssTypeCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssConstructorCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyMethods</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyFinalizer</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeOnlyCallsSuperFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeOverloaded</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeDoesNotCallSuperFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeShouldBeProtected</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCallingFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseCorrectExceptionLogging</name>
+ <ruleset>Jakarta Commons Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ProperLogger</name>
+ <ruleset>Jakarta Commons Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingSerialVersionUID</name>
+ <ruleset>JavaBean Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ProperCloneImplementation</name>
+ <ruleset>Clone Implementation Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneThrowsCloneNotSupportedException</name>
+ <ruleset>Clone Implementation Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneMethodMustImplementCloneable</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ </rules>
+ <includeDerivedFiles>false</includeDerivedFiles>
+ <violationsAsErrors>true</violationsAsErrors>
+</pmd>
diff --git a/org.eclipse.osee.ote.server/.project b/org.eclipse.osee.ote.server/.project
new file mode 100644
index 000000000..e2da42a10
--- /dev/null
+++ b/org.eclipse.osee.ote.server/.project
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ote.server</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ds.core.builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.server/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.server/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..c979b6f20
--- /dev/null
+++ b/org.eclipse.osee.ote.server/META-INF/MANIFEST.MF
@@ -0,0 +1,46 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OTE Server Launching Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.server;singleton:=true
+Bundle-Version: 0.25.3.qualifier
+Bundle-Description: OTE Server
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-ActivationPolicy: lazy
+Import-Package: org.apache.felix.service.command;status=provisional;version="0.8.0",
+ org.eclipse.core.runtime,
+ org.eclipse.osee.connection.service,
+ org.eclipse.osee.framework.core.exception,
+ org.eclipse.osee.framework.core.util,
+ org.eclipse.osee.framework.jdk.core.reportdata,
+ org.eclipse.osee.framework.jdk.core.type,
+ org.eclipse.osee.framework.jdk.core.util,
+ org.eclipse.osee.framework.jdk.core.util.io.streams,
+ org.eclipse.osee.framework.jdk.core.util.network,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.osee.framework.plugin.core.util,
+ org.eclipse.osee.ote,
+ org.eclipse.osee.ote.connection.jini,
+ org.eclipse.osee.ote.core,
+ org.eclipse.osee.ote.core.cmd,
+ org.eclipse.osee.ote.core.environment,
+ org.eclipse.osee.ote.core.environment.console,
+ org.eclipse.osee.ote.core.environment.interfaces,
+ org.eclipse.osee.ote.core.environment.status,
+ org.eclipse.osee.ote.core.framework.command,
+ org.eclipse.osee.ote.core.model,
+ org.eclipse.osee.ote.endpoint,
+ org.eclipse.osee.ote.io,
+ org.eclipse.osee.ote.master.rest.client,
+ org.eclipse.osee.ote.master.rest.model,
+ org.eclipse.osee.ote.message,
+ org.eclipse.osee.ote.message.instrumentation,
+ org.eclipse.osee.ote.message.interfaces,
+ org.eclipse.osee.ote.properties,
+ org.osgi.framework,
+ org.osgi.service.packageadmin,
+ org.osgi.util.tracker
+Export-Package: org.eclipse.osee.ote.server
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Service-Component: OSGI-INF/*.xml
+Require-Bundle: net.jini,
+ jms.libraries
diff --git a/org.eclipse.osee.ote.server/OSGI-INF/ConsoleCmd.xml b/org.eclipse.osee.ote.server/OSGI-INF/ConsoleCmd.xml
new file mode 100644
index 000000000..73925cf54
--- /dev/null
+++ b/org.eclipse.osee.ote.server/OSGI-INF/ConsoleCmd.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="start" immediate="true" name="org.eclipse.osee.ote.server">
+ <implementation class="org.eclipse.osee.ote.server.OteClose"/>
+ <service>
+ <provide interface="org.eclipse.osee.ote.server.OteClose"/>
+ </service>
+</scr:component>
diff --git a/org.eclipse.osee.ote.server/OSGI-INF/ote.server.start.xml b/org.eclipse.osee.ote.server/OSGI-INF/ote.server.start.xml
new file mode 100644
index 000000000..512ff614d
--- /dev/null
+++ b/org.eclipse.osee.ote.server/OSGI-INF/ote.server.start.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="start" deactivate="stop" name="org.eclipse.osee.ote.server.startServer">
+ <implementation class="org.eclipse.osee.ote.server.internal.OTEServerCreationComponent"/>
+ <reference bind="bindOteServiceStarter" cardinality="1..1" interface="org.eclipse.osee.ote.server.OteServiceStarter" name="OteServiceStarter" policy="static" unbind="unbindOteServiceStarter"/>
+</scr:component>
diff --git a/org.eclipse.osee.ote.server/OSGI-INF/ote.service.starter.xml b/org.eclipse.osee.ote.server/OSGI-INF/ote.service.starter.xml
new file mode 100644
index 000000000..3f3f55a6d
--- /dev/null
+++ b/org.eclipse.osee.ote.server/OSGI-INF/ote.service.starter.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="org.eclipse.osee.ote.server.starter">
+ <implementation class="org.eclipse.osee.ote.server.internal.OteServiceStarterImpl"/>
+ <service>
+ <provide interface="org.eclipse.osee.ote.server.OteServiceStarter"/>
+ </service>
+ <reference unbind="unbindIRuntimeLibraryManager" bind="bindIRuntimeLibraryManager" cardinality="1..1" interface="org.eclipse.osee.ote.core.environment.interfaces.IRuntimeLibraryManager" name="IRuntimeLibraryManager" policy="static"/>
+ <reference unbind="unbindIConnectionService" bind="bindIConnectionService" cardinality="1..1" interface="org.eclipse.osee.connection.service.IConnectionService" name="IConnectionService" policy="static"/>
+ <reference bind="bindOTESessionManager" cardinality="1..1" interface="org.eclipse.osee.ote.core.OTESessionManager" name="OTESessionManager" policy="static" unbind="unbindOTESessionManager"/>
+ <reference bind="bindOTEMasterServer" cardinality="1..1" interface="org.eclipse.osee.ote.master.rest.client.OTEMasterServer" name="OTEMasterServer" policy="static" unbind="unbindOTEMasterServer"/>
+ <reference bind="bindOteUdpEndpoint" cardinality="1..1" interface="org.eclipse.osee.ote.endpoint.OteUdpEndpoint" name="OteUdpEndpoint" policy="static" unbind="unbindOteUdpEndpoint"/>
+</scr:component>
diff --git a/org.eclipse.osee.ote.server/build.properties b/org.eclipse.osee.ote.server/build.properties
new file mode 100644
index 000000000..6210e849b
--- /dev/null
+++ b/org.eclipse.osee.ote.server/build.properties
@@ -0,0 +1,5 @@
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ OSGI-INF/
+source.. = src/
diff --git a/org.eclipse.osee.ote.server/pom.xml b/org.eclipse.osee.ote.server/pom.xml
new file mode 100644
index 000000000..3c0fa81c8
--- /dev/null
+++ b/org.eclipse.osee.ote.server/pom.xml
@@ -0,0 +1,35 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.osee</groupId>
+ <artifactId>org.eclipse.osee.ote.parent</artifactId>
+ <version>0.25.3-SNAPSHOT</version>
+ <relativePath>../org.eclipse.osee.ote.parent</relativePath>
+ </parent>
+
+ <artifactId>org.eclipse.osee.ote.server</artifactId>
+ <packaging>eclipse-plugin</packaging>
+ <name>OTE Server (Incubation)</name>
+
+ <build>
+ <!-- workaround for https://issues.sonatype.org/browse/TYCHO-168 -->
+ <resources>
+ <resource>
+ <directory>src</directory>
+ <excludes>
+ <exclude>**/*.java</exclude>
+ </excludes>
+ </resource>
+ </resources>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-source-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/OteClose.java b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/OteClose.java
new file mode 100644
index 000000000..346365f5f
--- /dev/null
+++ b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/OteClose.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.server;
+
+import java.util.Dictionary;
+import java.util.Hashtable;
+
+import org.apache.felix.service.command.CommandProcessor;
+import org.apache.felix.service.command.Descriptor;
+import org.eclipse.osee.ote.core.ServiceUtility;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+
+public class OteClose {
+
+ public void start(){
+ BundleContext context = FrameworkUtil.getBundle(getClass()).getBundleContext();
+ Dictionary<String, Object> dict = new Hashtable<>();
+ dict.put(CommandProcessor.COMMAND_SCOPE, "ote");
+ dict.put(CommandProcessor.COMMAND_FUNCTION, new String[]{"x"});
+ context.registerService(OteClose.class, this, dict);
+ }
+
+
+ @Descriptor ("Shutdown the OTE Server")
+ public void x() throws Exception {
+ OteServiceStarter service = ServiceUtility.getService(OteServiceStarter.class);
+ if(service != null){
+ service.stop();
+ }
+ BundleContext context = FrameworkUtil.getBundle(getClass()).getBundleContext();
+ Bundle systemBundle = context.getBundle(0);
+ systemBundle.stop();
+ boolean canExit = false;
+ while(!canExit){
+ try{
+ Thread.sleep(20);
+ } catch (Throwable th){
+ }
+ canExit = true;
+ try{
+ for(Bundle b:context.getBundles()){
+ if(b.getState() != Bundle.ACTIVE){
+ canExit = false;
+ }
+ }
+ } catch (Throwable th){
+ canExit = true;
+ }
+ }
+ System.exit(0);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/OteServiceStarter.java b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/OteServiceStarter.java
new file mode 100644
index 000000000..a398f9c79
--- /dev/null
+++ b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/OteServiceStarter.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.server;
+
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentServiceConfig;
+
+public interface OteServiceStarter {
+
+ public IHostTestEnvironment start(IServiceConnector serviceSideConnector, ITestEnvironmentServiceConfig config, PropertyParamter propertyParameter, String environmentFactoryClass) throws Exception;
+
+ public IHostTestEnvironment start(IServiceConnector serviceSideConnector, ITestEnvironmentServiceConfig config, PropertyParamter propertyParameter, TestEnvironmentFactory factory) throws Exception;
+
+ public void stop() throws Exception;
+
+}
diff --git a/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/PropertyParamter.java b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/PropertyParamter.java
new file mode 100644
index 000000000..54ec8c2d9
--- /dev/null
+++ b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/PropertyParamter.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.server;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class PropertyParamter {
+ private final String type;
+ private final String version;
+ private final String comment;
+ private final String station;
+ private final boolean useJiniLookup;
+ private final boolean isLocalConnector;
+
+ public PropertyParamter(String version, String comment, String station, String type, boolean useJiniLookup, boolean isLocalConnector) {
+ this.version = version;
+ this.comment = comment;
+ this.station = station;
+ this.type = type;
+ this.useJiniLookup = useJiniLookup;
+ this.isLocalConnector = isLocalConnector;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public String getVersion() {
+ return version;
+ }
+
+ public String getComment() {
+ return comment;
+ }
+
+ public String getStation() {
+ return station;
+ }
+
+ public boolean isLocalConnector() {
+ return isLocalConnector;
+ }
+
+ public boolean useJiniLookup() {
+ return useJiniLookup;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/RemoteShell.java b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/RemoteShell.java
new file mode 100644
index 000000000..486883252
--- /dev/null
+++ b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/RemoteShell.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.server;
+
+import java.rmi.RemoteException;
+import org.eclipse.osee.ote.core.environment.console.ConsoleShell;
+import org.eclipse.osee.ote.core.environment.console.ICommandManager;
+import org.eclipse.osee.ote.core.environment.interfaces.IRemoteCommandConsole;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class RemoteShell extends ConsoleShell implements IRemoteCommandConsole {
+
+// private static final long serialVersionUID = -4931966494670170915L;
+ private final StringBuffer buffer = new StringBuffer(32000);
+
+ @Override
+ public synchronized String doCommand(String line) throws RemoteException {
+ buffer.setLength(0);
+ buffer.append('>').append(line).append('\n');
+ try {
+ parseAndExecuteCmd(line);
+ } catch (Throwable t) {
+ printStackTrace(t);
+ }
+ return buffer.toString();
+ }
+
+ public RemoteShell(ICommandManager manager) {
+ super(manager);
+ }
+
+ @Override
+ public void println(String string) {
+ buffer.append(string).append('\n');
+ }
+
+ @Override
+ public void print(String string) {
+ buffer.append(string);
+ }
+
+ @Override
+ public void println() {
+ buffer.append('\n');
+ }
+}
diff --git a/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/TestEnvironmentFactory.java b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/TestEnvironmentFactory.java
new file mode 100644
index 000000000..3dd4c297b
--- /dev/null
+++ b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/TestEnvironmentFactory.java
@@ -0,0 +1,18 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.server;
+
+import org.eclipse.osee.ote.core.environment.interfaces.IRuntimeLibraryManager;
+import org.eclipse.osee.ote.message.MessageSystemTestEnvironment;
+
+public interface TestEnvironmentFactory {
+ MessageSystemTestEnvironment createEnvironment(IRuntimeLibraryManager runtimeLibraryManager) throws Throwable;
+}
diff --git a/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/TestEnvironmentServiceConfigImpl.java b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/TestEnvironmentServiceConfigImpl.java
new file mode 100644
index 000000000..8c130175d
--- /dev/null
+++ b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/TestEnvironmentServiceConfigImpl.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.server;
+
+import java.lang.reflect.Constructor;
+import org.eclipse.osee.ote.core.environment.TestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentServiceConfig;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class TestEnvironmentServiceConfigImpl implements ITestEnvironmentServiceConfig {
+
+ private final boolean keepAliveWithNoUsers;
+ private final String title;
+ private final String name;
+ private final String outfileLocation;
+ private final Constructor<? extends TestEnvironment> constructor;
+
+ public TestEnvironmentServiceConfigImpl(boolean keepAliveWithNoUsers, String title, String name, String outfileLocation, Constructor<? extends TestEnvironment> constructor) {
+ this.keepAliveWithNoUsers = keepAliveWithNoUsers;
+ this.title = title;
+ this.name = name;
+ this.outfileLocation = outfileLocation;
+ this.constructor = constructor;
+ }
+
+ @Override
+ public Object[] getConstructorParameters() {
+ return new Object[0];
+ }
+
+ @Override
+ public Constructor<? extends TestEnvironment> getEnvironmentConstructor() {
+ return constructor;
+ }
+
+ @Override
+ public int getMaxEnvironments() {
+ return 1;
+ }
+
+ @Override
+ public int getMaxUsersPerEnvironment() {
+ return Integer.MAX_VALUE;
+ }
+
+ @Override
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public String getOutfileLocation() {
+ return outfileLocation;
+ }
+
+ @Override
+ public String getServerTitle() {
+ return title;
+ }
+
+ @Override
+ public boolean keepEnvAliveWithNoUsers() {
+ return keepAliveWithNoUsers;
+ }
+
+ @Override
+ public boolean startEnvionrmnetOnServiceInit() {
+ return true;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/internal/EnvironmentCreationParameter.java b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/internal/EnvironmentCreationParameter.java
new file mode 100644
index 000000000..6a911cadc
--- /dev/null
+++ b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/internal/EnvironmentCreationParameter.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.server.internal;
+
+import java.io.Serializable;
+import java.rmi.server.ExportException;
+
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.framework.plugin.core.util.ExportClassLoader;
+import org.eclipse.osee.ote.core.environment.interfaces.IRuntimeLibraryManager;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentServiceConfig;
+import org.eclipse.osee.ote.message.MessageSystemTestEnvironment;
+import org.eclipse.osee.ote.server.TestEnvironmentFactory;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+class EnvironmentCreationParameter {
+// private final NodeInfo oteEmbeddedBroker;
+ private final IServiceConnector serviceConnector;
+ private final ITestEnvironmentServiceConfig config;
+ private final IRuntimeLibraryManager runtimeLibraryManager;
+ private ITestEnvironment remoteTestEnvironment;
+ private ITestEnvironment exportedRemoteTestEnvironment;
+ private TestEnvironmentFactory factory;
+ private final String environmentFactoryClass;
+
+ public EnvironmentCreationParameter(IRuntimeLibraryManager runtimeLibraryManager,/* NodeInfo oteEmbeddedBroker,*/ IServiceConnector serviceConnector, ITestEnvironmentServiceConfig config, TestEnvironmentFactory factory, String environmentFactoryClass) {
+// this.oteEmbeddedBroker = oteEmbeddedBroker;
+ this.serviceConnector = serviceConnector;
+ this.config = config;
+ this.runtimeLibraryManager = runtimeLibraryManager;
+ this.factory = factory;
+ this.environmentFactoryClass = environmentFactoryClass;
+
+ }
+
+// public NodeInfo getBroker(){
+// return oteEmbeddedBroker;
+// }
+
+ public Serializable getServerTitle() {
+ return config.getServerTitle();
+ }
+
+ public int getMaxUsersPerEnvironment() {
+ return config.getMaxUsersPerEnvironment();
+ }
+
+ public String getOutfileLocation() {
+ return config.getOutfileLocation();
+ }
+
+ public boolean isSimulated() {
+ String toCheck = factory == null ? environmentFactoryClass : factory.getClass().getName();
+ return toCheck.contains("Sun");
+ }
+
+ public MessageSystemTestEnvironment createEnvironment() throws Throwable {
+ if (factory == null) {
+ ExportClassLoader exportClassLoader = ExportClassLoader.getInstance();
+ Class<? extends TestEnvironmentFactory> clazz =
+ exportClassLoader.loadClass(environmentFactoryClass).asSubclass(TestEnvironmentFactory.class);
+ factory = clazz.newInstance();
+ }
+ MessageSystemTestEnvironment testEnvironment = factory.createEnvironment(runtimeLibraryManager);
+ // testEnvironment.setOteNodeInfo(oteEmbeddedBroker);
+ testEnvironment.init(serviceConnector);
+ return testEnvironment;
+ }
+
+ public ITestEnvironment createRemoteTestEnvironment(MessageSystemTestEnvironment currentEnvironment) throws ExportException {
+ remoteTestEnvironment =
+ new RemoteTestEnvironment(currentEnvironment, serviceConnector, config.keepEnvAliveWithNoUsers());
+ exportedRemoteTestEnvironment = (ITestEnvironment) serviceConnector.export(remoteTestEnvironment);
+ return exportedRemoteTestEnvironment;
+ }
+
+ public IServiceConnector getServiceConnector() {
+ return serviceConnector;
+ }
+
+ public boolean isKeepAliveWithNoUsers() {
+ return config.keepEnvAliveWithNoUsers();
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/internal/OTEServerCreationComponent.java b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/internal/OTEServerCreationComponent.java
new file mode 100644
index 000000000..1a797f702
--- /dev/null
+++ b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/internal/OTEServerCreationComponent.java
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.server.internal;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.connection.jini.JiniServiceSideConnector;
+import org.eclipse.osee.ote.properties.OtePropertiesCore;
+import org.eclipse.osee.ote.server.OteServiceStarter;
+import org.eclipse.osee.ote.server.PropertyParamter;
+import org.eclipse.osee.ote.server.TestEnvironmentServiceConfigImpl;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+
+public class OTEServerCreationComponent {
+
+ private OteServiceStarter oteServiceStart;
+
+ public void bindOteServiceStarter(OteServiceStarter oteServiceStart){
+ this.oteServiceStart = oteServiceStart;
+ }
+
+ public void unbindOteServiceStarter(OteServiceStarter oteServiceStart){
+ this.oteServiceStart = null;
+ }
+
+ public void start() {
+
+ final String oteServerFactoryClass = OtePropertiesCore.serverFactoryClass.getValue();
+ if (oteServerFactoryClass != null) {
+ try{
+ String outfileLocation = OtePropertiesCore.outfilesLocation.getValue();
+ if (outfileLocation == null) {
+ outfileLocation = OtePropertiesCore.javaIoTmpdir.getValue();
+ }
+ String title = OtePropertiesCore.serverTitle.getValue();
+ String name = OtePropertiesCore.userName.getValue();
+ String keepEnvAliveWithNoUsersStr = OtePropertiesCore.serverKeepalive.getValue();
+ boolean keepEnvAliveWithNoUsers = true;
+ if (keepEnvAliveWithNoUsersStr != null) {
+ keepEnvAliveWithNoUsers = Boolean.parseBoolean(keepEnvAliveWithNoUsersStr);
+ }
+ final TestEnvironmentServiceConfigImpl config =
+ new TestEnvironmentServiceConfigImpl(keepEnvAliveWithNoUsers, title, name, outfileLocation, null);
+
+ String version = "unknown";
+ String comment = "";
+ Bundle bundle = FrameworkUtil.getBundle(OTEServerCreationComponent.class);
+ if(bundle != null){
+ BundleContext context = bundle.getBundleContext();
+ if(context != null){
+ version = context.getBundle().getHeaders().get("Bundle-Version").toString();
+ comment = context.getBundle().getHeaders().get("Bundle-Description").toString();
+ }
+ }
+ String station = "unknown";
+ try {
+ station = InetAddress.getLocalHost().getHostName();
+ } catch (UnknownHostException ex) {
+ OseeLog.log(OTEServerCreationComponent.class, Level.SEVERE, ex);
+ }
+ boolean useJiniLookup = OtePropertiesCore.useLookup.getValue() != null;
+ boolean isLocalConnector = false;
+
+ int index = oteServerFactoryClass.indexOf('.');
+ String type = oteServerFactoryClass.substring(index > 0 ? index + 1 : 0);
+ final PropertyParamter propertyParameter =
+ new PropertyParamter(version, comment, station, type, useJiniLookup, isLocalConnector);
+
+ Thread th = new Thread(new Runnable(){
+ @Override
+ public void run(){
+ try {
+ oteServiceStart.start(new JiniServiceSideConnector(), config, propertyParameter, oteServerFactoryClass);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ });
+ th.start();
+ } catch (Exception ex){
+ OseeLog.log(getClass(), Level.SEVERE, ex);
+ }
+ }
+ }
+
+ public void stop() {
+ try {
+ oteServiceStart.stop();
+ } catch (Exception ex) {
+ OseeLog.log(getClass(), Level.SEVERE, ex);
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/internal/OteService.java b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/internal/OteService.java
new file mode 100644
index 000000000..a5c3ce38a
--- /dev/null
+++ b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/internal/OteService.java
@@ -0,0 +1,206 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.server.internal;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.rmi.RemoteException;
+import java.util.Collection;
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.Properties;
+import java.util.UUID;
+import java.util.logging.Level;
+
+import net.jini.core.lookup.ServiceID;
+import net.jini.id.Uuid;
+import net.jini.id.UuidFactory;
+
+import org.eclipse.osee.framework.jdk.core.util.EnhancedProperties;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.HostServerProperties;
+import org.eclipse.osee.ote.core.ConnectionRequestResult;
+import org.eclipse.osee.ote.core.IRemoteUserSession;
+import org.eclipse.osee.ote.core.IUserSession;
+import org.eclipse.osee.ote.core.OSEEPerson1_4;
+import org.eclipse.osee.ote.core.OTESessionManager;
+import org.eclipse.osee.ote.core.ReturnStatus;
+import org.eclipse.osee.ote.core.ServiceUtility;
+import org.eclipse.osee.ote.core.environment.TestEnvironmentConfig;
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironment;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpoint;
+import org.eclipse.osee.ote.io.OTEServerFolder;
+import org.eclipse.osee.ote.message.MessageSystemTestEnvironment;
+import org.eclipse.osee.ote.properties.OtePropertiesCore;
+import org.eclipse.osee.ote.server.PropertyParamter;
+
+public class OteService implements IHostTestEnvironment {
+
+ private final ServiceID serviceID;
+ private final EnhancedProperties enhancedProperties;
+ private MessageSystemTestEnvironment currentEnvironment;
+ private ITestEnvironment remoteEnvironment;
+ private final EnvironmentCreationParameter environmentCreation;
+// private final IRuntimeLibraryManager runtimeLibraryManager;
+// private RegisteredServiceReference registeredServiceReference;
+ private OTESessionManager oteSessions;
+
+
+ public OteService(EnvironmentCreationParameter environmentCreation, OTESessionManager oteSessions, PropertyParamter parameterObject, EnhancedProperties properties, OteUdpEndpoint receiver) {
+// this.runtimeLibraryManager = runtimeLibraryManager;
+ this.environmentCreation = environmentCreation;
+ this.oteSessions = oteSessions;
+
+ Uuid uuid = UuidFactory.generate();
+ Long lsb = Long.valueOf(uuid.getLeastSignificantBits());
+ Long msb = Long.valueOf(uuid.getMostSignificantBits());
+ serviceID = new ServiceID(msb.longValue(), lsb.longValue());
+
+ enhancedProperties = properties;
+ enhancedProperties.setProperty(HostServerProperties.name.name(), environmentCreation.getServerTitle());
+ enhancedProperties.setProperty(HostServerProperties.station.name(), parameterObject.getStation());
+ enhancedProperties.setProperty(HostServerProperties.version.name(), parameterObject.getVersion());
+ enhancedProperties.setProperty(HostServerProperties.type.name(), parameterObject.getType());
+ enhancedProperties.setProperty(HostServerProperties.maxUsers.name(), Integer.toString(environmentCreation.getMaxUsersPerEnvironment()));
+ enhancedProperties.setProperty(HostServerProperties.comment.name(), parameterObject.getComment());
+ enhancedProperties.setProperty(HostServerProperties.date.name(), new Date().toString());
+ enhancedProperties.setProperty(HostServerProperties.group.name(), "OSEE Test Environment");
+ enhancedProperties.setProperty(HostServerProperties.owner.name(), OtePropertiesCore.userName.getValue());
+ enhancedProperties.setProperty(HostServerProperties.id.name(), serviceID.toString());
+ enhancedProperties.setProperty(HostServerProperties.isSim.name(), Boolean.toString(environmentCreation.isSimulated()));
+// enhancedProperties.setProperty(HostServerProperties.activeMq.name(), environmentCreation.getBroker().getUri().toString());
+ try {
+ String format = String.format("tcp://%s:%d", receiver.getLocalEndpoint().getAddress().getHostAddress(), receiver.getLocalEndpoint().getPort());
+ if(OtePropertiesCore.httpPort.getValue() == null){
+ enhancedProperties.setProperty(HostServerProperties.appServerURI.name(), format);
+ } else {
+ enhancedProperties.setProperty(HostServerProperties.appServerURI.name(), format);
+ }
+ enhancedProperties.setProperty(HostServerProperties.oteUdpEndpoint.name(), format);
+ } catch (Exception e) {
+ OseeLog.log(OteService.class, Level.SEVERE, "Failed to set the appServerURI", e);
+ }
+
+ OTEServerFolder service = ServiceUtility.getService(OTEServerFolder.class);
+ if(service != null){
+ File dir = service.getCurrentServerFolder();
+ dir.mkdirs();
+ if(dir.exists() && dir.isDirectory()){
+ try{
+ Properties serverProperties = new Properties();
+ serverProperties.putAll(enhancedProperties.asMap());
+ serverProperties.store(new FileOutputStream(new File(dir, "server.properties")), "");
+ File running = new File(dir, ".running");
+ running.createNewFile();
+ running.deleteOnExit();
+ } catch (Throwable th){
+ th.printStackTrace();
+ }
+ }
+ }
+ }
+
+// @Override
+// public NodeInfo getBroker(){
+// return environmentCreation.getBroker();
+// }
+
+ @Override
+ public EnhancedProperties getProperties() throws RemoteException {
+ return enhancedProperties;
+ }
+
+ @Override
+ public ConnectionRequestResult requestEnvironment(IRemoteUserSession session, UUID sessionId, TestEnvironmentConfig config) throws RemoteException {
+ try {
+ OseeLog.log(OteService.class, Level.INFO,
+ "received request for test environment from user " + session.getUser().getName());
+ if (!isEnvironmentAvailable()) {
+ createEnvironment();
+ }
+
+ oteSessions.add(sessionId, session);
+ updateDynamicInfo();
+ return new ConnectionRequestResult(remoteEnvironment, sessionId, new ReturnStatus("Success", true));
+ } catch (Throwable ex) {
+ OseeLog.log(OteService.class, Level.SEVERE,
+ "Exception while requesting environment for user " + session.getUser().getName(), ex);
+ throw new RemoteException("Exception while requesting environment for user ", ex);
+ }
+ }
+
+ private void createEnvironment() throws Throwable {
+ currentEnvironment = environmentCreation.createEnvironment();
+ remoteEnvironment = environmentCreation.createRemoteTestEnvironment(currentEnvironment);
+ currentEnvironment.startup(environmentCreation.getOutfileLocation());
+ }
+
+ private boolean isEnvironmentAvailable() {
+ return remoteEnvironment != null;
+ }
+
+ public void updateDynamicInfo() throws RemoteException {
+ Collection<OSEEPerson1_4> userList = new LinkedList<>();
+ StringBuilder sb = new StringBuilder();
+ if (isEnvironmentAvailable()) {
+ for(UUID sessionId:oteSessions.get()){
+ IUserSession session = oteSessions.get(sessionId);
+ try {
+ userList.add(session.getUser());
+ } catch (Exception e) {
+ OseeLog.log(OteService.class, Level.WARNING, e);
+ }
+ }
+ }
+ for (OSEEPerson1_4 person : userList) {
+ sb.append(person.getName());
+ sb.append(", ");
+ }
+ if (sb.length() > 2) {
+ String list = sb.toString().substring(0, sb.length() - 2);
+ environmentCreation.getServiceConnector().setProperty("user_list", list);
+ } else {
+ environmentCreation.getServiceConnector().setProperty("user_list", "N/A");
+ }
+// if (registeredServiceReference != null) {
+// registeredServiceReference.update();
+// }
+ }
+
+ public ServiceID getServiceID() throws RemoteException {
+ return serviceID;
+ }
+
+ public void kill() throws RemoteException {
+ if(currentEnvironment != null){
+ currentEnvironment.shutdown();
+ }
+ }
+
+// public void set(RegisteredServiceReference ref) {
+// this.registeredServiceReference = ref;
+// }
+
+ @Override
+ public void disconnect(UUID sessionId) throws RemoteException {
+ if (currentEnvironment != null) {
+ oteSessions.remove(sessionId);
+ updateDynamicInfo();
+ }
+ }
+
+ @Override
+ public String getHttpURL() throws RemoteException {
+ return (String)enhancedProperties.getProperty("appServerURI");
+ }
+
+}
diff --git a/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/internal/OteServiceStarterImpl.java b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/internal/OteServiceStarterImpl.java
new file mode 100644
index 000000000..015ee6599
--- /dev/null
+++ b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/internal/OteServiceStarterImpl.java
@@ -0,0 +1,424 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.server.internal;
+
+import java.net.HttpURLConnection;
+import java.net.URI;
+import java.net.UnknownHostException;
+import java.util.Date;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import java.util.logging.Level;
+
+import org.apache.activemq.broker.BrokerService;
+import org.eclipse.osee.connection.service.IConnectionService;
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.framework.jdk.core.type.OseeStateException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.OTESessionManager;
+import org.eclipse.osee.ote.core.ServiceUtility;
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.IRuntimeLibraryManager;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironmentServiceConfig;
+import org.eclipse.osee.ote.endpoint.OteUdpEndpoint;
+import org.eclipse.osee.ote.master.rest.client.OTEMasterServer;
+import org.eclipse.osee.ote.master.rest.client.OTEMasterServerResult;
+import org.eclipse.osee.ote.master.rest.model.OTEServer;
+import org.eclipse.osee.ote.properties.OtePropertiesCore;
+import org.eclipse.osee.ote.server.OteServiceStarter;
+import org.eclipse.osee.ote.server.PropertyParamter;
+import org.eclipse.osee.ote.server.TestEnvironmentFactory;
+import org.osgi.framework.FrameworkUtil;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class OteServiceStarterImpl implements OteServiceStarter {
+
+// private PackageAdmin packageAdmin;
+ private IRuntimeLibraryManager runtimeLibraryManager;
+ private IConnectionService connectionService;
+// private MessageService messageService;
+
+ private BrokerService brokerService;
+ private OteService service;
+// private final ListenForHostRequest listenForHostRequest;
+
+ private IServiceConnector serviceSideConnector;
+ private OTESessionManager oteSessions;
+ private OTEMasterServer masterServer;
+
+ private ScheduledExecutorService executor;
+ private OTEServer oteServerEntry;
+ private ScheduledFuture<?> taskToCancel;
+ private LookupRegistration lookupRegistration;
+ private URI masterURI;
+// private NodeInfo nodeInfo;
+// private int brokerPort = 0;
+ private OteUdpEndpoint receiver;
+// private boolean ENABLE_BROKER;
+
+ public OteServiceStarterImpl() {
+// listenForHostRequest = new ListenForHostRequest();
+ executor = Executors.newSingleThreadScheduledExecutor(new ThreadFactory(){
+
+ @Override
+ public Thread newThread(Runnable arg0) {
+ Thread th = new Thread(arg0);
+ th.setName("OTE Lookup Registration");
+ th.setDaemon(true);
+ return th;
+ }
+
+ });
+ }
+
+ public void bindOTESessionManager(OTESessionManager oteSessions){
+ this.oteSessions = oteSessions;
+ }
+
+ public void unbindOTESessionManager(OTESessionManager oteSessions){
+ this.oteSessions = null;
+ }
+
+ public void bindIRuntimeLibraryManager(IRuntimeLibraryManager runtimeLibraryManager){
+ this.runtimeLibraryManager = runtimeLibraryManager;
+ }
+
+ public void unbindIRuntimeLibraryManager(IRuntimeLibraryManager runtimeLibraryManager){
+ this.runtimeLibraryManager = null;
+ }
+
+// public void bindMessageService(MessageService messageService){
+// this.messageService = messageService;
+// }
+//
+// public void unbindMessageService(MessageService messageService){
+// this.messageService = null;
+// }
+
+ public void bindIConnectionService(IConnectionService connectionService){
+ this.connectionService = connectionService;
+ }
+
+ public void unbindIConnectionService(IConnectionService connectionService){
+ this.connectionService = null;
+ }
+
+ public void bindOTEMasterServer(OTEMasterServer masterServer){
+ this.masterServer = masterServer;
+ }
+
+ public void unbindOTEMasterServer(OTEMasterServer masterServer){
+ this.masterServer = null;
+ }
+
+// public void bindPackageAdmin(PackageAdmin packageAdmin){
+// this.packageAdmin = packageAdmin;
+// }
+//
+// public void unbindPackageAdmin(PackageAdmin packageAdmin){
+// this.packageAdmin = null;
+// }
+
+ public void bindOteUdpEndpoint(OteUdpEndpoint receiver){
+ this.receiver = receiver;
+ }
+
+ public void unbindOteUdpEndpoint(OteUdpEndpoint receiver){
+ this.receiver = receiver;
+ }
+
+ @Override
+ public IHostTestEnvironment start(IServiceConnector serviceSideConnector, ITestEnvironmentServiceConfig config, PropertyParamter propertyParameter, String environmentFactoryClass) throws Exception {
+ return start(serviceSideConnector, config, propertyParameter, null, environmentFactoryClass);
+ }
+
+ @Override
+ public IHostTestEnvironment start(IServiceConnector serviceSideConnector, ITestEnvironmentServiceConfig config, PropertyParamter propertyParameter, TestEnvironmentFactory factory) throws Exception {
+ return start(serviceSideConnector, config, propertyParameter, factory, null);
+ }
+
+ private IHostTestEnvironment start(IServiceConnector serviceSideConnector, ITestEnvironmentServiceConfig config, PropertyParamter propertyParameter, TestEnvironmentFactory factory, String environmentFactoryClass) throws Exception {
+ if (service != null) {
+ throw new OseeStateException("An ote Server has already been started.");
+ }
+ this.serviceSideConnector = serviceSideConnector;
+// ENABLE_BROKER = Boolean.parseBoolean(System.getProperty("ote.enable.broker", "true"));
+// if(ENABLE_BROKER){
+//// brokerService = new BrokerService();
+//
+// String strUri;
+// try {
+// String addressAsString = getAddress();
+// if(brokerPort <= 0){
+// brokerPort = getServerPort();
+// }
+// strUri = String.format("tcp://%s:%d", addressAsString, brokerPort);
+// try {
+// brokerService.addConnector(strUri);
+// OseeLog.log(getClass(), Level.INFO, "Added TCP connector: " + strUri);
+// } catch (Exception e) {
+// OseeLog.log(getClass(), Level.SEVERE, "could not add connector for " + strUri, e);
+// strUri = "vm://localhost?broker.persistent=false";
+// }
+// } catch (Exception e) {
+// OseeLog.log(getClass(), Level.SEVERE, "could acquire a TCP address", e);
+// strUri = "vm://localhost?broker.persistent=false";
+// }
+// //necessary for rmi/jini classloading
+// Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+//
+// brokerService.setEnableStatistics(false);
+// brokerService.setBrokerName("OTEServer");
+// brokerService.setPersistent(false);
+// brokerService.setUseJmx(false);
+// brokerService.start();
+// URI uri = new URI(strUri);
+//
+//// nodeInfo = new NodeInfo("OTEEmbeddedBroker", uri);
+// } else {
+//// URI uri = new URI(String.format("tcp://%s:%d", "nohost", 0));
+//// nodeInfo = new NodeInfo("OTEEmbeddedBroker", uri);
+// }
+ OteUdpEndpoint oteEndpoint = ServiceUtility.getService(OteUdpEndpoint.class);
+ System.out.printf("SERVER CONNECTION URI[\n\ttcp://%s:%d\n]\n", oteEndpoint.getLocalEndpoint().getAddress().getHostAddress(), oteEndpoint.getLocalEndpoint().getPort());
+
+ EnvironmentCreationParameter environmentCreationParameter =
+ new EnvironmentCreationParameter(runtimeLibraryManager, serviceSideConnector, config, factory,
+ environmentFactoryClass);
+
+ service =
+ new OteService(environmentCreationParameter, oteSessions, propertyParameter,
+ serviceSideConnector.getProperties(), receiver);
+
+ serviceSideConnector.init(service);
+
+
+
+ if (propertyParameter.isLocalConnector()) {
+ connectionService.addConnector(serviceSideConnector);
+ }
+ if (!propertyParameter.isLocalConnector()) {
+ String masterURIStr = OtePropertiesCore.masterURI.getValue();
+ if(masterURIStr != null){
+ try{
+ masterURI = new URI(masterURIStr);
+ oteServerEntry = createOTEServer(environmentCreationParameter, propertyParameter, service.getServiceID().toString());
+ lookupRegistration = new LookupRegistration(masterURI, masterServer, oteServerEntry, service);
+ taskToCancel = executor.scheduleWithFixedDelay(lookupRegistration, 0, 30, TimeUnit.SECONDS);
+ } catch(Throwable th){
+ OseeLog.log(getClass(), Level.SEVERE, th);
+ }
+ } else {
+ OseeLog.log(getClass(), Level.WARNING, "'ote.master.uri' was not set. You must use direct connect from the client.");
+ }
+
+ } else {
+// serviceSideConnector.setProperty("OTEEmbeddedBroker", nodeInfo);
+ }
+
+ FrameworkUtil.getBundle(getClass()).getBundleContext().registerService(IHostTestEnvironment.class, service, null);
+ System.out.printf("TEST SERVER INITIALIZATION COMPLETE\n");
+
+ return service;
+ }
+
+ private OTEServer createOTEServer(EnvironmentCreationParameter environmentCreationParameter, PropertyParamter propertyParameter, String uuid) throws NumberFormatException, UnknownHostException{
+ OTEServer server = new OTEServer();
+ server.setName(environmentCreationParameter.getServerTitle().toString());
+ server.setStation(propertyParameter.getStation());
+ server.setVersion(propertyParameter.getVersion());
+ server.setType(propertyParameter.getType());
+ server.setComment(propertyParameter.getComment());
+ server.setStartTime(new Date().toString());
+ server.setOwner(OtePropertiesCore.userName.getValue());
+ server.setUUID(uuid);
+ server.setOteRestServer(String.format("tcp://%s:%d", receiver.getLocalEndpoint().getAddress().getHostAddress(), receiver.getLocalEndpoint().getPort()));
+ server.setOteActivemqServer(String.format("tcp://%s:%d", receiver.getLocalEndpoint().getAddress().getHostAddress(), receiver.getLocalEndpoint().getPort()));
+ return server;
+ }
+
+// private int getServerPort() throws IOException {
+// String portFromLaunch = OtePropertiesCore.brokerUriPort.getValue();
+// int port = 0;
+// if (portFromLaunch != null) {
+// try {
+// port = Integer.parseInt(portFromLaunch);
+// } catch (NumberFormatException ex) {
+// }
+// }
+// if (port == 0) {
+// port = PortUtil.getInstance().getValidPort();
+// }
+// return port;
+// }
+
+ @Override
+ public void stop() {
+// if(messageService != null && nodeInfo != null && service != null){
+// try {
+// messageService.get(nodeInfo).send(OteBaseMessages.OteHostShutdown, service.getServiceID().toString());
+// } catch (OseeCoreException e) {
+// OseeLog.log(getClass(), Level.SEVERE, e);
+// } catch (RemoteException e) {
+// OseeLog.log(getClass(), Level.SEVERE, e);
+// }
+// }
+ if (service != null) {
+ try {
+ service.updateDynamicInfo();
+ service.kill();
+ service = null;
+ } catch (Exception ex) {
+ OseeLog.log(getClass(), Level.SEVERE, ex);
+ }
+ }
+ if (brokerService != null) {
+ try {
+ brokerService.stopGracefully(".*", ".*", 10000, 500);
+ brokerService.stop();
+ } catch (Exception ex) {
+ OseeLog.log(getClass(), Level.SEVERE, ex);
+ }
+ }
+ if (serviceSideConnector != null) {
+ try {
+ connectionService.removeConnector(serviceSideConnector);
+ } catch (Exception ex) {
+ OseeLog.log(getClass(), Level.SEVERE, ex);
+ }
+ }
+ if(oteServerEntry != null) {
+ try{
+ lookupRegistration.stop();
+ taskToCancel.cancel(true);
+ } finally {
+ Future<OTEMasterServerResult> removeServer = masterServer.removeServer(masterURI, oteServerEntry);
+ try {
+ removeServer.get(1000, TimeUnit.MILLISECONDS);
+ } catch (InterruptedException e) {
+ OseeLog.log(getClass(), Level.INFO, e);
+ } catch (ExecutionException e) {
+ OseeLog.log(getClass(), Level.INFO, e);
+ } catch (TimeoutException e) {
+ OseeLog.log(getClass(), Level.INFO, e);
+ }
+ }
+ }
+ brokerService = null;
+ }
+
+// private String getAddress() throws UnknownHostException {
+// InetAddress[] all = InetAddress.getAllByName(InetAddress.getLocalHost().getHostName());
+// String defaultAddress = all[0].getHostAddress();
+// for (InetAddress address : all ) {
+// if(!address.isSiteLocalAddress())
+// {
+// String firstRealLocalAddress = address.getHostAddress();
+// if (address instanceof Inet6Address) {
+// firstRealLocalAddress = "[" + firstRealLocalAddress + "]";
+// }
+// return firstRealLocalAddress;
+// }
+// }
+// return defaultAddress;
+// }
+
+// private class ListenForHostRequest extends OseeMessagingListener {
+//
+// @Override
+// public void process(Object message, Map<String, Object> headers, ReplyConnection replyConnection) {
+// if (replyConnection.isReplyRequested()) {
+// try {
+// ByteArrayOutputStream baos = new ByteArrayOutputStream();
+// ObjectOutputStream oos = new ObjectOutputStream(baos);
+// oos.writeObject(message);
+// oos.writeObject(serviceSideConnector.getService());
+// replyConnection.send(baos.toByteArray(), null, OteServiceStarterImpl.this);
+// } catch (OseeCoreException ex) {
+// OseeLog.log(getClass(), Level.SEVERE, ex);
+// } catch (IOException ex) {
+// OseeLog.log(getClass(), Level.SEVERE, ex);
+// }
+// }
+// }
+// }
+//
+// @Override
+// public void updateServiceInfo(List<ServiceDescriptionPair> serviceDescription) {
+// for (Entry<String, Serializable> entry : serviceSideConnector.getProperties().entrySet()) {
+// ServiceDescriptionPair pair = new ServiceDescriptionPair();
+// if (entry.getKey() != null && entry.getValue() != null) {
+// pair.setName(entry.getKey());
+// pair.setValue(entry.getValue().toString());
+// serviceDescription.add(pair);
+// }
+// }
+// }
+//
+// @Override
+// public void fail(Throwable th) {
+// OseeLog.log(getClass(), Level.SEVERE, th);
+// }
+//
+// @Override
+// public void success() {
+// }
+//
+ private static class LookupRegistration implements Runnable {
+
+ private final OTEMasterServer masterServer;
+ private final OTEServer server;
+ private final URI uri;
+ private volatile boolean run = true;
+ private final OteService service;
+
+ public LookupRegistration(URI uri, OTEMasterServer masterServer, OTEServer server, OteService service) {
+ this.masterServer = masterServer;
+ this.server = server;
+ this.uri = uri;
+ this.service = service;
+ }
+
+ @Override
+ public void run() {
+ try{
+ if(run){
+ server.setConnectedUsers(service.getProperties().getProperty("user_list", "N.A.").toString());
+ Future<OTEMasterServerResult> result = masterServer.addServer(uri, server);
+ OTEMasterServerResult addServerResult = result.get(30, TimeUnit.SECONDS);
+ if(!(addServerResult != null && addServerResult.isSuccess())){
+ try{
+ Thread.sleep(1000*60*3);//wait 3 minutes before trying again
+ } catch(Throwable th){
+ //don't care if we're woken up
+ }
+ }
+ }
+ } catch (Throwable th){
+ th.printStackTrace();
+ }
+ }
+
+ public void stop(){
+ run = false;
+ }
+
+ }
+
+}
diff --git a/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/internal/RemoteTestEnvironment.java b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/internal/RemoteTestEnvironment.java
new file mode 100644
index 000000000..dc30a36c1
--- /dev/null
+++ b/org.eclipse.osee.ote.server/src/org/eclipse/osee/ote/server/internal/RemoteTestEnvironment.java
@@ -0,0 +1,262 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.server.internal;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.concurrent.locks.ReentrantLock;
+import java.util.logging.Level;
+
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.ExportClassLoader;
+import org.eclipse.osee.ote.core.ServiceUtility;
+import org.eclipse.osee.ote.core.environment.console.ICommandManager;
+import org.eclipse.osee.ote.core.environment.interfaces.IRemoteCommandConsole;
+import org.eclipse.osee.ote.core.model.IModel;
+import org.eclipse.osee.ote.core.model.IModelListener;
+import org.eclipse.osee.ote.core.model.IModelManagerRemote;
+import org.eclipse.osee.ote.core.model.ModelKey;
+import org.eclipse.osee.ote.core.model.ModelState;
+import org.eclipse.osee.ote.message.IInstrumentationRegistrationListener;
+import org.eclipse.osee.ote.message.MessageSystemTestEnvironment;
+import org.eclipse.osee.ote.message.interfaces.ITestEnvironmentMessageSystem;
+import org.eclipse.osee.ote.server.RemoteShell;
+
+public class RemoteTestEnvironment implements ITestEnvironmentMessageSystem {
+
+ private final MessageSystemTestEnvironment env;
+ private final IServiceConnector serviceConnector;
+ private RemoteModelManager modelManager;
+ private final HashMap<IRemoteCommandConsole, RemoteShell> exportedConsoles =
+ new HashMap<IRemoteCommandConsole, RemoteShell>(32);
+
+ private final ReentrantLock lock = new ReentrantLock();
+
+ // private IRemoteMessageService exportedRemoteMessageService;
+
+ public RemoteTestEnvironment(MessageSystemTestEnvironment currentEnvironment, IServiceConnector serviceConnector, boolean keepEnvAliveWithNoUsers) {
+ if (serviceConnector == null) {
+ throw new NullPointerException("Servce connector cannot be null");
+ }
+ this.env = currentEnvironment;
+ this.serviceConnector = serviceConnector;
+ }
+
+ @Override
+ public Remote getControlInterface(String controlInterfaceID) throws RemoteException {
+ Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+ Remote controlInterface = env.getControlInterface(controlInterfaceID);
+ if (controlInterface != null) {
+ try {
+ controlInterface = (Remote) serviceConnector.export(controlInterface);
+ } catch (Exception ex) {
+ OseeLog.log(RemoteTestEnvironment.class, Level.SEVERE,
+ "exception exporting control interface " + controlInterfaceID, ex);
+ throw new RemoteException("exception exporting control interface " + controlInterfaceID, ex);
+ }
+ }
+ return controlInterface;
+ }
+
+ @Override
+ public void addInstrumentationRegistrationListener(IInstrumentationRegistrationListener listener) throws RemoteException {
+ Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+ env.addInstrumentationRegistrationListener(listener);
+ }
+
+ @Override
+ public void removeInstrumentationRegistrationListener(IInstrumentationRegistrationListener listener) throws RemoteException {
+ Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+ env.removeInstrumentationRegistrationListener(listener);
+ }
+
+ // @Override
+ // public IRemoteMessageService getMessageToolServiceProxy() throws RemoteException {
+ // if(exportedRemoteMessageService == null){
+ // IRemoteMessageService service = ServiceUtility.getService(IRemoteMessageService.class, 30000);
+ // exportedRemoteMessageService = (IRemoteMessageService)this.serviceConnector.export(service);
+ // }
+ // return exportedRemoteMessageService;
+ // }
+
+ @Override
+ public IRemoteCommandConsole getCommandConsole() throws RemoteException {
+ Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+ OseeLog.log(RemoteTestEnvironment.class, Level.FINE, "Remote command onsole requested");
+ ICommandManager commandManager = ServiceUtility.getService(ICommandManager.class);
+ RemoteShell shell = new RemoteShell(commandManager);
+
+ IRemoteCommandConsole exportedConsole;
+ try {
+ exportedConsole = (IRemoteCommandConsole) serviceConnector.export(shell);
+ } catch (Exception ex) {
+ throw new RemoteException("failed to export remote console", ex);
+ }
+ lock.lock();
+ try {
+ exportedConsoles.put(exportedConsole, shell);
+ } finally {
+ lock.unlock();
+ }
+ return exportedConsole;
+ }
+
+ @Override
+ public void closeCommandConsole(IRemoteCommandConsole console) throws RemoteException {
+ Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+ RemoteShell shell;
+ lock.lock();
+ try {
+ shell = exportedConsoles.remove(console);
+ } finally {
+ lock.unlock();
+ }
+ if (shell != null) {
+ try {
+ serviceConnector.unexport(shell);
+ } catch (Exception ex) {
+ throw new RemoteException("failed to unexport remote shell", ex);
+ }
+
+ OseeLog.log(RemoteTestEnvironment.class, Level.FINE, "closed command console");
+ } else {
+ OseeLog.log(RemoteTestEnvironment.class, Level.FINE, "trying to remove non existing console");
+ }
+ }
+
+ @Override
+ public IModelManagerRemote getModelManager() throws RemoteException {
+ Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+ if (modelManager == null) {
+ modelManager = new RemoteModelManager();
+ }
+ try {
+ return (IModelManagerRemote) serviceConnector.export(modelManager);
+ } catch (Throwable t) {
+ throw new RemoteException("Could not load get model manager" + t.getMessage());
+ }
+ }
+
+ @Override
+ public byte[] getScriptOutfile(String outfilePath) throws RemoteException {
+ Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+ return env.getScriptOutfile(outfilePath);
+ }
+
+ @Override
+ public int getUniqueId() throws RemoteException {
+ Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+ return env.getUniqueId();
+ }
+
+ private class RemoteModelManager implements IModelManagerRemote {
+
+ @Override
+ public void addModelActivityListener(IModelListener listener) throws RemoteException {
+ Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+ env.getModelManager().addModelActivityListener(listener);
+ }
+
+ @Override
+ public void removeModelActivityListener(IModelListener listener) throws RemoteException {
+ Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+ env.getModelManager().removeModelActivityListener(listener);
+ }
+
+ @Override
+ public void addModelActivityListener(IModelListener listener, ModelKey<?> key) throws RemoteException {
+ Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+ env.getModelManager().addModelActivityListener(listener, key);
+ }
+
+ @Override
+ public void removeModelActivityListener(IModelListener listener, ModelKey<?> key) throws RemoteException {
+ Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+ env.getModelManager().removeModelActivityListener(listener, key);
+ }
+
+ @SuppressWarnings("rawtypes")
+ @Override
+ public List<ModelKey> getRegisteredModels() throws RemoteException {
+ Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+ return env.getModelManager().getRegisteredModels();
+ }
+
+ @Override
+ @SuppressWarnings({"unchecked", "rawtypes"})
+ public Remote getRemoteModel(ModelKey<?> key) throws RemoteException {
+ Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+ try {
+ Class modelClass;
+ try {
+ modelClass = env.loadClassFromMessageLoader(key.getClassName());
+ } catch (ClassNotFoundException ex) {
+ throw new RemoteException("Could not load model class: " + key.getClassName(), ex);
+ }
+ key.setModelClass(modelClass);
+ IModel model = env.getModelManager().getModel(key);
+ return (Remote) serviceConnector.export(model);
+ } catch (Throwable t) {
+ throw new RemoteException("Could not load model " + key.getClassName(), t);
+ }
+ }
+
+ @Override
+ public void releaseReference(ModelKey<?> key) throws RemoteException {
+ Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+ env.getModelManager().releaseReference(key);
+ }
+
+ @Override
+ @SuppressWarnings({"unchecked", "rawtypes"})
+ public void changeModelState(ModelKey<?> key, ModelState state) throws RemoteException {
+ Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+ Class modelClass;
+ try {
+ modelClass = env.loadClassFromMessageLoader(key.getClassName());
+ } catch (ClassNotFoundException ex) {
+ throw new RemoteException("Could not load model class: " + key.getClassName());
+ }
+ key.setModelClass(modelClass);
+ env.getModelManager().changeModelState(key, state);
+ }
+
+ @Override
+ public ModelState getModelState(ModelKey<?> key) throws RemoteException {
+ Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+ return env.getModelManager().getModelState(key);
+ }
+
+ @SuppressWarnings("rawtypes")
+ @Override
+ public void releaseAllReferences(ModelKey key) throws RemoteException {
+ Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+ env.getModelManager().releaseAllReferences(key);
+ }
+
+ }
+
+ @Override
+ public void setBatchMode(boolean isInBatchMode) throws RemoteException {
+ Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+ env.setBatchMode(isInBatchMode);
+ }
+//
+// @Override
+// public void sendMessage(Message message) throws RemoteException {
+// Thread.currentThread().setContextClassLoader(ExportClassLoader.getInstance());
+// env.sendMessageToServer(message);
+// }
+
+}
diff --git a/org.eclipse.osee.ote.ui.builder/.classpath b/org.eclipse.osee.ote.ui.builder/.classpath
new file mode 100644
index 000000000..1fa3e6803
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.builder/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.ote.ui.builder/.project b/org.eclipse.osee.ote.ui.builder/.project
new file mode 100644
index 000000000..931030f0e
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.builder/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ote.ui.builder</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.ui.builder/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.ui.builder/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..1ac69124a
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.builder/META-INF/MANIFEST.MF
@@ -0,0 +1,17 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OTE Builder Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.ui.builder;singleton:=true
+Bundle-Version: 0.25.3.qualifier
+Bundle-Activator: org.eclipse.osee.ote.ui.builder.Activator
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.jdt.core
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-ActivationPolicy: lazy
+Import-Package: org.eclipse.core.resources,
+ org.eclipse.osee.framework.jdk.core.util,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.osee.framework.plugin.core.util
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Export-Package: org.eclipse.osee.ote.ui.builder
diff --git a/org.eclipse.osee.ote.ui.builder/build.properties b/org.eclipse.osee.ote.ui.builder/build.properties
new file mode 100644
index 000000000..e9863e281
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.builder/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml
diff --git a/org.eclipse.osee.ote.ui.builder/plugin.xml b/org.eclipse.osee.ote.ui.builder/plugin.xml
new file mode 100644
index 000000000..8cb6eba10
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.builder/plugin.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+ <extension
+ id="OTEPackagingBuilder"
+ name="OTE Packaging Builder"
+ point="org.eclipse.core.resources.builders">
+ <builder
+ hasNature="true">
+ <run
+ class="org.eclipse.osee.ote.ui.builder.OTEPackagingBuilder">
+ </run>
+ </builder>
+ </extension>
+ <extension
+ id="OTEPackagingNature"
+ point="org.eclipse.core.resources.natures">
+ <runtime>
+ <run
+ class="org.eclipse.osee.ote.ui.builder.OTEPackagingNature">
+ </run>
+ </runtime>
+ <builder
+ id="org.eclipse.osee.ote.ui.builder.OTEPackagingBuilder">
+ </builder>
+ </extension>
+ <extension
+ point="org.eclipse.ui.menus">
+ <menuContribution
+ locationURI="popup:org.eclipse.ui.navigator.ProjectExplorer#PopupMenu?after=additions">
+ <command
+ commandId="org.eclipse.osee.ote.ui.builder.addRemoveNatureCommand"
+ label="Add/Remove OTE Packaging Nature">
+ </command>
+ </menuContribution>
+ </extension>
+
+ <extension
+ point="org.eclipse.ui.commands">
+ <command
+ defaultHandler="org.eclipse.osee.ote.ui.builder.ToggleNatureHandler"
+ id="org.eclipse.osee.ote.ui.builder.addRemoveNatureCommand"
+ name="addRemoveNatureCommand">
+ </command>
+ </extension>
+
+ <extension
+ point="org.eclipse.ui.preferencePages">
+ <page
+ category="org.eclipse.osee.framework.ui.skynet.OseePreferencePage"
+ class="org.eclipse.osee.ote.ui.builder.OTEBuilderPreferencePage"
+ id="org.eclipse.osee.ote.ui.builder.OTEBuilderPreferencePage"
+ name="OTE Builder">
+ </page>
+ </extension>
+
+</plugin>
diff --git a/org.eclipse.osee.ote.ui.builder/pom.xml b/org.eclipse.osee.ote.ui.builder/pom.xml
new file mode 100644
index 000000000..6ada9ac53
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.builder/pom.xml
@@ -0,0 +1,35 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.osee</groupId>
+ <artifactId>org.eclipse.osee.ote.parent</artifactId>
+ <version>0.25.3-SNAPSHOT</version>
+ <relativePath>../org.eclipse.osee.ote.parent</relativePath>
+ </parent>
+
+ <artifactId>org.eclipse.osee.ote.ui.builder</artifactId>
+ <packaging>eclipse-plugin</packaging>
+ <name>OTE Ui (Incubation)</name>
+
+ <build>
+ <!-- workaround for https://issues.sonatype.org/browse/TYCHO-168 -->
+ <resources>
+ <resource>
+ <directory>src</directory>
+ <excludes>
+ <exclude>**/*.java</exclude>
+ </excludes>
+ </resource>
+ </resources>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-source-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/Activator.java b/org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/Activator.java
new file mode 100644
index 000000000..a042a8a7d
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/Activator.java
@@ -0,0 +1,50 @@
+package org.eclipse.osee.ote.ui.builder;
+
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends AbstractUIPlugin {
+
+ // The plug-in ID
+ public static final String PLUGIN_ID = "org.eclipse.osee.ote.ui.builder"; //$NON-NLS-1$
+
+ // The shared instance
+ private static Activator plugin;
+
+ /**
+ * The constructor
+ */
+ public Activator() {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+ */
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ plugin = this;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ super.stop(context);
+ }
+
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static Activator getDefault() {
+ return plugin;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/ArchiveBuilder.java b/org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/ArchiveBuilder.java
new file mode 100644
index 000000000..6c7d11879
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/ArchiveBuilder.java
@@ -0,0 +1,93 @@
+package org.eclipse.osee.ote.ui.builder;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+
+/**
+ * This class writes class files to a jar file. This is used as part of the OTE Builder that will package up
+ * java test classes and then ship them to a server to be executed.
+ *
+ * @author Andrew M. Finkbeiner
+ *
+ */
+class ArchiveBuilder {
+
+ private List<IPath> outputLocations;
+ private Set<IContainer> packages;
+ private File workspaceArchiveHome;
+
+ public ArchiveBuilder(File workspaceArchiveHome, List<IPath> outputLocations) {
+ this.workspaceArchiveHome = workspaceArchiveHome;
+ this.outputLocations = outputLocations;
+ this.packages = new HashSet<>();
+ }
+
+ /**
+ * Add a resources parent to be archived as a java package.
+ *
+ * @param resource
+ */
+ public void addFile(IResource resource) {
+ packages.add(resource.getParent());
+ }
+
+ /**
+ * Builds a jar file with the currently added packages.
+ */
+ public void archive() {
+ for(IContainer path:packages){
+ try {
+ IResource[] resources = path.members();
+ if(resources.length > 0){
+ String fileName = getFileName(path);
+ File archive = new File(workspaceArchiveHome, fileName + ".jar");
+ if(archive.exists()){
+ archive.delete();
+ }
+ JarPackager jarPackager = new JarPackager(getPath(path));
+ jarPackager.open(archive);
+ try{
+ for(IResource resource:resources){
+ if(resource.getFullPath().toString().endsWith(".class")){
+ jarPackager.add(resource);
+ }
+ }
+ } finally {
+ jarPackager.close();
+ }
+ }
+ } catch (CoreException e) {
+ e.printStackTrace();
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ private String getFileName(IContainer path) {
+ String name = path.getFullPath().toString().replace(".", "").replace('/', '.');
+ return name.substring(1);
+ }
+
+ private String getPath(IContainer path){
+ String strPath = path.getFullPath().toString();
+ for(IPath sourcePath:outputLocations){
+ String source = sourcePath.toString();
+ if(strPath.startsWith(sourcePath.toString())){
+ return strPath.substring(source.length());
+ }
+ }
+ return "";
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/JarPackager.java b/org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/JarPackager.java
new file mode 100644
index 000000000..fbf23f9ed
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/JarPackager.java
@@ -0,0 +1,108 @@
+package org.eclipse.osee.ote.ui.builder;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintStream;
+import java.util.jar.Attributes;
+import java.util.jar.JarEntry;
+import java.util.jar.JarOutputStream;
+import java.util.jar.Manifest;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.osee.framework.jdk.core.util.ChecksumUtil;
+
+/**
+ * Creates a jar file from a single package folder.
+ *
+ * @author Andrew M. Finkbeiner
+ *
+ */
+class JarPackager {
+
+ private JarOutputStream jos;
+ private String path;
+ private File archive;
+
+
+ JarPackager(String path){
+ this.path = path;
+ if(!this.path.endsWith("/")){
+ this.path += "/";
+ }
+ if(this.path.startsWith("/")){
+ this.path = this.path.substring(1);
+ }
+ }
+
+ /**
+ * Open the archive so that we can add resources to it.
+ *
+ * @param archive
+ * @throws FileNotFoundException
+ * @throws IOException
+ */
+ public void open(File archive) throws FileNotFoundException, IOException {
+ this.archive = archive;
+ Manifest manifest = new Manifest();
+ manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0");
+ jos = new JarOutputStream(new FileOutputStream(archive), manifest);
+ JarEntry entry = new JarEntry(path);
+ jos.putNextEntry(entry);
+ jos.closeEntry();
+ }
+
+ public void close() throws Exception {
+ jos.close();
+ InputStream in = null;
+ PrintStream ps = null;
+ try{
+ in = new FileInputStream(archive);
+ String diskMd5Digest = ChecksumUtil.createChecksumAsString(in, "MD5");
+ ps = new PrintStream(new FileOutputStream(new File(archive.getParentFile(), archive.getName() + ".md5")));
+ ps.print(diskMd5Digest);
+ } finally {
+ if(in != null){
+ in.close();
+ }
+ if(ps != null){
+ ps.close();
+ }
+ }
+ }
+
+ public void add(IResource resource) throws IOException {
+ File theFile = resource.getLocation().toFile();
+ if(theFile.exists()){
+ BufferedInputStream in = null;
+ try
+ {
+ String name = path + theFile.getName();
+
+ JarEntry entry = new JarEntry(name);
+ jos.putNextEntry(entry);
+ in = new BufferedInputStream(new FileInputStream(theFile));
+
+ byte[] buffer = new byte[1024];
+ while (true)
+ {
+ int count = in.read(buffer);
+ if (count == -1)
+ break;
+ jos.write(buffer, 0, count);
+ }
+ jos.closeEntry();
+ }
+ finally
+ {
+ if (in != null)
+ in.close();
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/OTEBuilderPreferencePage.java b/org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/OTEBuilderPreferencePage.java
new file mode 100644
index 000000000..c13470a0f
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/OTEBuilderPreferencePage.java
@@ -0,0 +1,65 @@
+package org.eclipse.osee.ote.ui.builder;
+
+import org.eclipse.core.runtime.preferences.InstanceScope;
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.osgi.service.prefs.BackingStoreException;
+import org.osgi.service.prefs.Preferences;
+
+public class OTEBuilderPreferencePage extends PreferencePage implements
+ IWorkbenchPreferencePage {
+
+ public static final String DO_JAR_PACKAGING = "DO_JAR_PACKAGING";
+
+ private Button oteBuilder;
+
+ public OTEBuilderPreferencePage() {
+ }
+
+ public OTEBuilderPreferencePage(String title) {
+ super(title);
+ }
+
+ public OTEBuilderPreferencePage(String title, ImageDescriptor image) {
+ super(title, image);
+ }
+
+ @Override
+ public void init(IWorkbench workbench) {
+ }
+
+ @Override
+ protected Control createContents(Composite parent) {
+ noDefaultAndApplyButton();
+ oteBuilder = new Button(parent, SWT.CHECK);
+ oteBuilder.setText("Enable the OTE Jar Builder. This will enable client disconnect and not disrupt a batch.");
+ Preferences prefs = InstanceScope.INSTANCE.getNode(Activator.PLUGIN_ID);
+ oteBuilder.setSelection(prefs.getBoolean(OTEBuilderPreferencePage.DO_JAR_PACKAGING, false));
+ oteBuilder.addSelectionListener(new SelectionListener() {
+ @Override
+ public void widgetDefaultSelected(SelectionEvent e) {
+ }
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ Preferences prefs = InstanceScope.INSTANCE.getNode(Activator.PLUGIN_ID);
+ prefs.putBoolean(OTEBuilderPreferencePage.DO_JAR_PACKAGING, oteBuilder.getSelection());
+ try {
+ prefs.flush();
+ } catch (BackingStoreException e1) {
+ e1.printStackTrace();
+ }
+ }
+ });
+ return parent;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/OTEPackagingBuilder.java b/org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/OTEPackagingBuilder.java
new file mode 100644
index 000000000..bc6b5fff8
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/OTEPackagingBuilder.java
@@ -0,0 +1,174 @@
+package org.eclipse.osee.ote.ui.builder;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.resources.IResourceDeltaVisitor;
+import org.eclipse.core.resources.IResourceVisitor;
+import org.eclipse.core.resources.IncrementalProjectBuilder;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.preferences.InstanceScope;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.OseeData;
+import org.osgi.service.prefs.Preferences;
+
+public class OTEPackagingBuilder extends IncrementalProjectBuilder {
+
+ public static final String BUILDER_ID = "org.eclipse.osee.ote.ui.builder.OTEPackagingBuilder";
+
+ private static final String ROOT_FOLDER_NAME = "OTE";
+ private static final String JAR_FOLDER = "workspacejars";
+
+ public static boolean isOTEBuilderActive(){
+ if(Activator.getDefault() != null && Activator.getDefault().getPreferenceStore() != null){
+ Preferences prefs = InstanceScope.INSTANCE.getNode(Activator.PLUGIN_ID);
+ return prefs.getBoolean(OTEBuilderPreferencePage.DO_JAR_PACKAGING, false);
+ } else {
+ return false;
+ }
+ }
+
+ public static File getWorkspaceArchiveFolder(){
+ File oteFolder = OseeData.getFile(ROOT_FOLDER_NAME);
+ File workspaceArchives = new File(oteFolder, JAR_FOLDER);
+ workspaceArchives.mkdirs();
+ return workspaceArchives;
+ }
+
+ public OTEPackagingBuilder(){
+ }
+
+ class SampleDeltaVisitor implements IResourceDeltaVisitor {
+
+
+ private ArchiveBuilder builder;
+
+ public SampleDeltaVisitor(ArchiveBuilder builder) {
+ this.builder = builder;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.resources.IResourceDeltaVisitor#visit(org.eclipse.core.resources.IResourceDelta)
+ */
+ @Override
+ public boolean visit(IResourceDelta delta) throws CoreException {
+ IResource resource = delta.getResource();
+ switch (delta.getKind()) {
+ case IResourceDelta.ADDED:
+ // handle added resource
+ checkResource(resource, builder);
+ break;
+ case IResourceDelta.REMOVED:
+ // handle removed resource
+ break;
+ case IResourceDelta.CHANGED:
+ // handle changed resource
+ checkResource(resource, builder);
+ break;
+ }
+ //return true to continue visiting children.
+ return true;
+ }
+ }
+
+ class SampleResourceVisitor implements IResourceVisitor {
+
+ private ArchiveBuilder builder;
+
+ public SampleResourceVisitor(ArchiveBuilder builder) {
+ this.builder = builder;
+ }
+
+ @Override
+ public boolean visit(IResource resource) {
+ checkResource(resource, builder);
+ //return true to continue visiting children.
+ return true;
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.internal.events.InternalBuilder#build(int,
+ * java.util.Map, org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ @SuppressWarnings("rawtypes")
+ protected IProject[] build(int kind, Map args, IProgressMonitor monitor) throws CoreException {
+ try{
+ if(!isOTEBuilderActive()){
+ return null;
+ }
+ long time = System.currentTimeMillis();
+ IJavaProject javaProject = JavaCore.create(getProject());
+ if(javaProject != null){
+ File workspaceArchiveHome = getWorkspaceArchiveFolder();
+ List<IPath> outputLocations = getOutputLocations(javaProject.getOutputLocation(), javaProject.getRawClasspath());
+
+ ArchiveBuilder builder = new ArchiveBuilder(workspaceArchiveHome, outputLocations);
+
+ if (kind == FULL_BUILD) {
+ fullBuild(monitor, builder);
+ } else {
+ IResourceDelta delta = getDelta(getProject());
+ if (delta == null) {
+ fullBuild(monitor, builder);
+ } else {
+ incrementalBuild(delta, monitor, builder);
+ }
+ }
+ builder.archive();
+ }
+ long elapsed = System.currentTimeMillis() - time;
+ System.out.printf("%s,%d\n", getProject().getName(), elapsed);
+ } catch (Throwable th){
+ OseeLog.log(getClass(), Level.SEVERE, "Failed to run the OTE Packager", th);
+ th.printStackTrace();
+ }
+ return null;
+ }
+
+ private List<IPath> getOutputLocations(IPath outputLocation, IClasspathEntry[] rawClasspath) {
+ List<IPath> outputLocations = new ArrayList<>();
+ outputLocations.add(outputLocation);
+ for(IClasspathEntry classpathEntry:rawClasspath){
+ if(classpathEntry.getOutputLocation() != null){
+ outputLocations.add(classpathEntry.getOutputLocation());
+ }
+ }
+ return outputLocations;
+ }
+
+ void checkResource(IResource resource, ArchiveBuilder builder) {
+ if (resource instanceof IFile && resource.getName().endsWith(".class")) {
+ builder.addFile(resource);
+ }
+ }
+
+ protected void fullBuild(final IProgressMonitor monitor, ArchiveBuilder builder) throws CoreException {
+ try {
+ getProject().accept(new SampleResourceVisitor(builder));
+ } catch (CoreException e) {
+ }
+ }
+
+ protected void incrementalBuild(IResourceDelta delta, IProgressMonitor monitor, ArchiveBuilder builder) throws CoreException {
+ // the visitor does the work.
+ delta.accept(new SampleDeltaVisitor(builder));
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/OTEPackagingNature.java b/org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/OTEPackagingNature.java
new file mode 100644
index 000000000..210a9cf30
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/OTEPackagingNature.java
@@ -0,0 +1,81 @@
+package org.eclipse.osee.ote.ui.builder;
+
+import org.eclipse.core.resources.ICommand;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.resources.IProjectNature;
+import org.eclipse.core.runtime.CoreException;
+
+public class OTEPackagingNature implements IProjectNature {
+
+ /**
+ * ID of this project nature
+ */
+ public static final String NATURE_ID = "org.eclipse.osee.ote.ui.builder.OTEPackagingNature";
+
+ private IProject project;
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.resources.IProjectNature#configure()
+ */
+ public void configure() throws CoreException {
+ IProjectDescription desc = project.getDescription();
+ ICommand[] commands = desc.getBuildSpec();
+
+ for (int i = 0; i < commands.length; ++i) {
+ if (commands[i].getBuilderName().equals(OTEPackagingBuilder.BUILDER_ID)) {
+ return;
+ }
+ }
+
+ ICommand[] newCommands = new ICommand[commands.length + 1];
+ System.arraycopy(commands, 0, newCommands, 0, commands.length);
+ ICommand command = desc.newCommand();
+ command.setBuilderName(OTEPackagingBuilder.BUILDER_ID);
+ newCommands[newCommands.length - 1] = command;
+ desc.setBuildSpec(newCommands);
+ project.setDescription(desc, null);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.resources.IProjectNature#deconfigure()
+ */
+ public void deconfigure() throws CoreException {
+ IProjectDescription description = getProject().getDescription();
+ ICommand[] commands = description.getBuildSpec();
+ for (int i = 0; i < commands.length; ++i) {
+ if (commands[i].getBuilderName().equals(OTEPackagingBuilder.BUILDER_ID)) {
+ ICommand[] newCommands = new ICommand[commands.length - 1];
+ System.arraycopy(commands, 0, newCommands, 0, i);
+ System.arraycopy(commands, i + 1, newCommands, i,
+ commands.length - i - 1);
+ description.setBuildSpec(newCommands);
+ project.setDescription(description, null);
+ return;
+ }
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.resources.IProjectNature#getProject()
+ */
+ public IProject getProject() {
+ return project;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.core.resources.IProjectNature#setProject(org.eclipse.core.resources.IProject)
+ */
+ public void setProject(IProject project) {
+ this.project = project;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/ToggleNatureHandler.java b/org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/ToggleNatureHandler.java
new file mode 100644
index 000000000..b1730e139
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.builder/src/org/eclipse/osee/ote/ui/builder/ToggleNatureHandler.java
@@ -0,0 +1,130 @@
+package org.eclipse.osee.ote.ui.builder;
+
+import java.util.Iterator;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.commands.IHandlerListener;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchSite;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+
+public class ToggleNatureHandler extends AbstractHandler {
+
+ @Override
+ public void addHandlerListener(IHandlerListener handlerListener) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void dispose() {
+ // TODO Auto-generated method stub
+
+ }
+
+ @SuppressWarnings("rawtypes")
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ IStructuredSelection selection = getCurrentSelection();
+ if (selection != null && selection instanceof IStructuredSelection) {
+ for (Iterator it = ((IStructuredSelection) selection).iterator(); it.hasNext();) {
+ Object element = it.next();
+ IProject project = null;
+ if (element instanceof IProject) {
+ project = (IProject) element;
+ } else if (element instanceof IAdaptable) {
+ project = (IProject) ((IAdaptable) element).getAdapter(IProject.class);
+ }
+ if (project != null) {
+ toggleNature(project);
+ }
+ }
+ }
+ return null;
+ }
+
+ private void toggleNature(IProject project) {
+ try {
+ IProjectDescription description = project.getDescription();
+ String[] natures = description.getNatureIds();
+
+ for (int i = 0; i < natures.length; ++i) {
+ if (OTEPackagingNature.NATURE_ID.equals(natures[i])) {
+ // Remove the nature
+ String[] newNatures = new String[natures.length - 1];
+ System.arraycopy(natures, 0, newNatures, 0, i);
+ System.arraycopy(natures, i + 1, newNatures, i,
+ natures.length - i - 1);
+ description.setNatureIds(newNatures);
+ project.setDescription(description, null);
+ return;
+ }
+ }
+
+ // Add the nature
+ String[] newNatures = new String[natures.length + 1];
+ System.arraycopy(natures, 0, newNatures, 0, natures.length);
+ newNatures[natures.length] = OTEPackagingNature.NATURE_ID;
+ description.setNatureIds(newNatures);
+ project.setDescription(description, null);
+ } catch (CoreException e) {
+ }
+ }
+
+ private IStructuredSelection getCurrentSelection() {
+ IWorkbench workbench = PlatformUI.getWorkbench();
+ if (!workbench.isStarting() && !workbench.isClosing()) {
+ IWorkbenchPage page = getActivePage();
+ if (page != null) {
+ IWorkbenchPart part = page.getActivePart();
+ if (part != null) {
+ IWorkbenchSite site = part.getSite();
+ if (site != null) {
+ ISelectionProvider selectionProvider = site.getSelectionProvider();
+ if(selectionProvider != null){
+ ISelection selection = selectionProvider.getSelection();
+ if (selection instanceof IStructuredSelection) {
+ return (IStructuredSelection) selection;
+ }
+ }
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return true;
+ }
+
+ @Override
+ public boolean isHandled() {
+ return true;
+ }
+
+ @Override
+ public void removeHandlerListener(IHandlerListener handlerListener) {
+ // TODO Auto-generated method stub
+
+ }
+
+ private IWorkbenchPage getActivePage() {
+ IWorkbenchWindow workbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ return workbenchWindow != null ? workbenchWindow.getActivePage() : null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui.markers/.classpath b/org.eclipse.osee.ote.ui.markers/.classpath
new file mode 100644
index 000000000..1fa3e6803
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.ote.ui.markers/.pmd b/org.eclipse.osee.ote.ui.markers/.pmd
new file mode 100644
index 000000000..c7b0a9fb3
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/.pmd
@@ -0,0 +1,925 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<pmd>
+ <useProjectRuleSet>false</useProjectRuleSet>
+ <ruleSetFile>.ruleset</ruleSetFile>
+ <rules>
+ <rule>
+ <name>LooseCoupling</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneMethodMustImplementCloneable</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedImports</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SignatureDeclareThrowsException</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IfStmtsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>WhileLoopsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IfElseStmtsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ForLoopsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseSingleton</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanReturns</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanExpressions</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SwitchStmtsShouldHaveDefault</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDeeplyNestedIfStmts</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidReassigningParameters</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SwitchDensity</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConstructorCallsOverridableMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AccessorClassGeneration</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalFieldCouldBeStatic</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloseResource</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonStaticInitializer</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DefaultLabelNotLastInSwitchStmt</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonCaseLabelInSwitchStatement</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>OptimizableToArrayCall</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BadComparison</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EqualsNull</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConfusingTernary</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InstantiationToGetClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IdempotentOperations</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimpleDateFormatNeedsLocale</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ImmutableField</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseLocaleWithCaseConversions</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidProtectedFieldInFinalClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AssignmentToNonFinalStatic</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingStaticMethodInNonInstantiatableClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidSynchronizedAtMethodLevel</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingBreakInSwitch</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseNotifyAllInsteadOfNotify</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidInstanceofChecksInCatchClause</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractClassWithoutAbstractMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyConditional</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CompareObjectsWithEquals</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PositionLiteralsFirstInComparisons</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryLocalBeforeReturn</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonThreadSafeSingleton</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UncommentedEmptyMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UncommentedEmptyConstructor</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidConstantsInterface</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnsynchronizedStaticDateFormatter</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PreserveStackTrace</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseCollectionIsEmpty</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassWithOnlyPrivateConstructorsShouldBeFinal</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyMethodInAbstractClassShouldBeAbstract</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SingularField</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReturnEmptyArrayRatherThanNull</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractClassWithoutAnyMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooFewBranchesForASwitchStatement</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCatchingThrowable</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SignatureDeclareThrowsException</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExceptionAsFlowControl</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCatchingNPE</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingRawExceptionTypes</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingNullPointerException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidRethrowingException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotExtendJavaLangError</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotThrowExceptionInFinally</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingNewInstanceOfSameException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedPrivateField</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedLocalVariable</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedPrivateMethod</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedFormalParameter</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MoreThanOneLogger</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LoggerIsNotStaticFinal</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SystemPrintln</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidPrintStackTrace</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDuplicateLiterals</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringInstantiation</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringToString</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InefficientStringBuffering</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryCaseChange</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseStringBufferLength</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AppendCharacterWithChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConsecutiveLiteralAppends</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseIndexOfChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InefficientEmptyStringCheck</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InsufficientStringBufferDeclaration</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessStringValueOf</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringBufferInstantiationWithChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseEqualsToCompareStrings</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidStringBufferField</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceVectorWithList</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceHashtableWithMap</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceEnumerationWithIterator</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidEnumAsIdentifier</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidAssertAsIdentifier</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IntegerInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ByteInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ShortInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LongInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseBeforeAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseAfterAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseTestAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4SuitesShouldUseSuiteAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitUseExpected</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseProperClassLoader</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MDBAndSessionBeanNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>RemoteSessionInterfaceNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LocalInterfaceSessionNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LocalHomeNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>RemoteInterfaceNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotCallSystemExit</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StaticEJBFieldShouldBeFinal</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotUseThreads</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidInstantiatingObjectsInLoops</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseArrayListInsteadOfVector</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyStartsWith</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseStringBufferForStringAppends</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseArraysAsList</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidArrayLoops</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryWrapperObjectCreation</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AddEmptyString</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyCatchBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyIfStmt</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyWhileStmt</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyTryBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyFinallyBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptySwitchStatements</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JumbledIncrementer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ForLoopShouldBeWhileLoop</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryConversionTemporary</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>OverrideBothEqualsAndHashcode</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoubleCheckedLocking</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReturnFromFinallyBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptySynchronizedBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryReturn</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyStaticInitializer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnconditionalIfStatement</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyStatementNotInLoop</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanInstantiation</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryFinalModifier</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CollapsibleIfStatements</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessOverridingMethod</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassCastExceptionWithToArray</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDecimalLiteralsInBigDecimalConstructor</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessOperationOnImmutable</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MisplacedNullCheck</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedNullCheckInEquals</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThreadGroup</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BrokenNullCheck</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BigIntegerInstantiation</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingOctalValues</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingHardCodedIP</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CheckResultSet</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidMultipleUnaryOperators</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyInitializer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodReturnsInternalArray</name>
+ <ruleset>Security Code Guidelines</ruleset>
+ </rule>
+ <rule>
+ <name>ArrayIsStoredDirectly</name>
+ <ruleset>Security Code Guidelines</ruleset>
+ </rule>
+ <rule>
+ <name>CouplingBetweenObjects</name>
+ <ruleset>Coupling Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveImports</name>
+ <ruleset>Coupling Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LooseCoupling</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DuplicateImports</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DontImportJavaLang</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedImports</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ImportFromSamePackage</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyStaticImports</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitStaticSuite</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitSpelling</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitAssertionsShouldIncludeMessage</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitTestsShouldIncludeAssert</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TestClassWithoutTestCases</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryBooleanAssertion</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertEqualsInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertSameInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertNullInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanAssertion</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NullAssignment</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedModifier</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AssignmentInOperand</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AtLeastOneConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DontImportSun</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousOctalEscape</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CallSuperInConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryParentheses</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DefaultPackage</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanInversion</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DataflowAnomalyAnalysis</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFinalLocalVariable</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingShortType</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingVolatile</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingNativeCode</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidAccessibilityAlteration</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotCallGarbageCollectionExplicitly</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodNamingConventions</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassNamingConventions</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractNaming</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDollarSigns</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodWithSameNameAsEnclosingClass</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousHashcodeMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousConstantFieldName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousEqualsMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFieldNameMatchingTypeName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFieldNameMatchingMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NoPackage</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PackageCase</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MisleadingVariableName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanGetMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NPathComplexity</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveMethodLength</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveParameterList</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveClassLength</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CyclomaticComplexity</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessivePublicCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyFields</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssMethodCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssTypeCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssConstructorCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyMethods</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyFinalizer</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeOnlyCallsSuperFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeOverloaded</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeDoesNotCallSuperFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeShouldBeProtected</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCallingFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseCorrectExceptionLogging</name>
+ <ruleset>Jakarta Commons Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ProperLogger</name>
+ <ruleset>Jakarta Commons Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingSerialVersionUID</name>
+ <ruleset>JavaBean Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ProperCloneImplementation</name>
+ <ruleset>Clone Implementation Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneThrowsCloneNotSupportedException</name>
+ <ruleset>Clone Implementation Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneMethodMustImplementCloneable</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ </rules>
+ <includeDerivedFiles>false</includeDerivedFiles>
+ <violationsAsErrors>true</violationsAsErrors>
+</pmd>
diff --git a/org.eclipse.osee.ote.ui.markers/.project b/org.eclipse.osee.ote.ui.markers/.project
new file mode 100644
index 000000000..91b3aab9a
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ote.ui.markers</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.ui.markers/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.ui.markers/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..38192fd8d
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/META-INF/MANIFEST.MF
@@ -0,0 +1,21 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Markers Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.ui.markers;singleton:=true
+Bundle-Version: 0.25.3.qualifier
+Bundle-Activator: org.eclipse.osee.ote.ui.markers.MarkerPlugin
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.core.resources,
+ org.eclipse.osee.framework.jdk.core,
+ org.eclipse.osee.framework.plugin.core,
+ org.eclipse.ui,
+ org.eclipse.osee.framework.ui.plugin
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.osee.ote.ui.markers
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Import-Package: org.eclipse.osee.framework.core.operation,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.osee.framework.ui.ws,
+ org.eclipse.osee.ote.core.framework.saxparse,
+ org.eclipse.osee.ote.core.framework.saxparse.elements
+Bundle-Vendor: Eclipse Open System Engineering Environment
diff --git a/org.eclipse.osee.ote.ui.markers/build.properties b/org.eclipse.osee.ote.ui.markers/build.properties
new file mode 100644
index 000000000..e9863e281
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml
diff --git a/org.eclipse.osee.ote.ui.markers/plugin.xml b/org.eclipse.osee.ote.ui.markers/plugin.xml
new file mode 100644
index 000000000..23aef5110
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/plugin.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+ <extension
+ point="org.eclipse.ui.popupMenus">
+ <objectContribution
+ adaptable="true"
+ id="org.eclipse.osee.ote.ui.markers.contribution1"
+ nameFilter="*"
+ objectClass="org.eclipse.jdt.core.ICompilationUnit">
+ <action
+ enablesFor="+"
+ label="Clear OTE Markers"
+ class="org.eclipse.osee.ote.ui.markers.ClearOteMarkerActionView"
+ menubarPath="org.eclipse.osee.ote.ui/placeholder"
+ id="org.eclipse.osee.ote.ui.markers.clearMarkers">
+ </action>
+ </objectContribution>
+ <viewerContribution
+ targetID="#CompilationUnitEditorContext"
+ id="markerConf">
+ <action
+ label="Clear OTE Markers"
+ menubarPath="org.eclipse.osee.ote.ui.viewer/placeholder"
+ id="org.eclipse.osee.ote.ui.markers.editorClearMarkers"
+ class="org.eclipse.osee.ote.ui.markers.ClearOteMarkerAction"/>
+ </viewerContribution>
+
+ </extension>
+
+</plugin>
diff --git a/org.eclipse.osee.ote.ui.markers/pom.xml b/org.eclipse.osee.ote.ui.markers/pom.xml
new file mode 100644
index 000000000..cbed94c90
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/pom.xml
@@ -0,0 +1,35 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.osee</groupId>
+ <artifactId>org.eclipse.osee.ote.parent</artifactId>
+ <version>0.25.3-SNAPSHOT</version>
+ <relativePath>../org.eclipse.osee.ote.parent</relativePath>
+ </parent>
+
+ <artifactId>org.eclipse.osee.ote.ui.markers</artifactId>
+ <packaging>eclipse-plugin</packaging>
+ <name>OTE Ui Markers (Incubation)</name>
+
+ <build>
+ <!-- workaround for https://issues.sonatype.org/browse/TYCHO-168 -->
+ <resources>
+ <resource>
+ <directory>src</directory>
+ <excludes>
+ <exclude>**/*.java</exclude>
+ </excludes>
+ </resource>
+ </resources>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-source-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/CheckPointData.java b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/CheckPointData.java
new file mode 100644
index 000000000..f4a6c2e5f
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/CheckPointData.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.markers;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class CheckPointData {
+
+ private boolean isFailed = false;
+ private String name;
+ private String expected;
+ private String actual;
+
+ public boolean isFailed() {
+ return isFailed;
+ }
+
+ public void setFailed(boolean failed) {
+ this.isFailed = failed;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public void setExpected(String expected) {
+ this.expected = expected;
+ }
+
+ public void setActual(String actual) {
+ this.actual = actual;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getExpected() {
+ return expected;
+ }
+
+ public String getActual() {
+ return actual;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/CheckPointHelper.java b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/CheckPointHelper.java
new file mode 100644
index 000000000..bd00bb38e
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/CheckPointHelper.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.markers;
+
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.w3c.dom.Element;
+
+public class CheckPointHelper implements Comparable<CheckPointHelper> {
+
+ @Override
+ public String toString() {
+ return String.format("%s[%s, %s]", testPointName, expected, actual);
+ }
+
+ public void increment() {
+ count++;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof CheckPointHelper) {
+ return key.equals(((CheckPointHelper) obj).key);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return key.hashCode();
+ }
+
+ private final String testPointName;
+ private final String expected;
+ private final String actual;
+ private final String key;
+ private int count = 1;
+
+ public CheckPointHelper(Element el) {
+ testPointName = Jaxp.getChildText(el, "TestPointName");
+ expected = Jaxp.getChildText(el, "Expected");
+ actual = Jaxp.getChildText(el, "Actual");
+ key = testPointName + expected + actual;
+ }
+
+ public CheckPointHelper(CheckPointData data) {
+ testPointName = data.getName();
+ expected = data.getExpected();
+ actual = data.getActual();
+ key = testPointName + expected + actual;
+ }
+
+ @Override
+ public int compareTo(CheckPointHelper o) {
+ return o.count - this.count;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/ClearOteMarkerAction.java b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/ClearOteMarkerAction.java
new file mode 100644
index 000000000..44f290e40
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/ClearOteMarkerAction.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.markers;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.IEditorActionDelegate;
+import org.eclipse.ui.IEditorPart;
+
+public class ClearOteMarkerAction implements IEditorActionDelegate{
+
+ ArrayList<IResource> selections;
+ private IEditorPart editor;
+
+ public ClearOteMarkerAction() {
+ selections = new ArrayList<>();
+ }
+
+ @Override
+ public void run(IAction action) {
+ for(IResource resource:selections){
+ MarkerPlugin.findAndRemoveOteMarkers(resource);
+ }
+ }
+
+ @Override
+ public void selectionChanged(IAction action, ISelection selection) {
+ selections.clear();
+ if(selection instanceof StructuredSelection){
+ Iterator<?> i = ((StructuredSelection)selection).iterator();
+ while (i.hasNext()) {
+ Object obj = i.next();
+ if (obj instanceof IResource) {
+ IResource resource = (IResource) obj;
+ if (resource != null) {
+ selections.add(resource);
+ }
+ }
+ }
+ } else {
+ Object obj = editor.getEditorInput().getAdapter(IResource.class);
+ if(obj != null){
+ selections.add((IResource)obj);
+ }
+ }
+ }
+
+ @Override
+ public void setActiveEditor(IAction action, IEditorPart targetEditor) {
+ this.editor = targetEditor;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/ClearOteMarkerActionView.java b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/ClearOteMarkerActionView.java
new file mode 100644
index 000000000..09b61d02f
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/ClearOteMarkerActionView.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.markers;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+
+public class ClearOteMarkerActionView implements IViewActionDelegate {
+
+ ArrayList<IResource> selections;
+
+ public ClearOteMarkerActionView() {
+ selections = new ArrayList<>();
+ }
+
+ @Override
+ public void run(IAction action) {
+ for(IResource resource:selections){
+ MarkerPlugin.findAndRemoveOteMarkers(resource);
+ }
+ }
+
+ @Override
+ public void selectionChanged(IAction action, ISelection selection) {
+ selections.clear();
+ if(selection instanceof StructuredSelection){
+ Iterator<?> i = ((StructuredSelection)selection).iterator();
+ while (i.hasNext()) {
+ Object obj = i.next();
+ if (obj instanceof IResource) {
+ IResource resource = (IResource) obj;
+ if (resource != null) {
+ selections.add(resource);
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public void init(IViewPart view) {
+
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/FileWatchList.java b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/FileWatchList.java
new file mode 100644
index 000000000..cfe429938
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/FileWatchList.java
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.markers;
+
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.logging.Level;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class FileWatchList {
+
+ private class FileWatchItem {
+ IFile file;
+ List<IMarker> markers;
+ long timeUpdated;
+
+ FileWatchItem(IFile file, List<IMarker> markers) {
+ this.file = file;
+ this.markers = markers;
+ timeUpdated = System.currentTimeMillis();
+ }
+ }
+
+ private final List<FileWatchItem> fileWatchItems;
+
+ public FileWatchList() {
+ fileWatchItems = new CopyOnWriteArrayList<>();
+ }
+
+ public void put(IFile file, List<IMarker> markers) {
+ FileWatchItem item = findWatchItem(file);
+ if (item == null) {
+ if (isListTooBig()) {
+ removeOldestWatchItem();
+ }
+ fileWatchItems.add(new FileWatchItem(file, markers));
+ } else {
+ item.markers = markers;
+ item.timeUpdated = System.currentTimeMillis();
+ }
+ }
+
+ private void removeOldestWatchItem() {
+ FileWatchItem oldest = null;
+ for (FileWatchItem item : fileWatchItems) {
+ if (oldest == null) {
+ oldest = item;
+ } else {
+ if (oldest.timeUpdated > item.timeUpdated) {
+ oldest = item;
+ }
+ }
+ }
+ if (oldest != null) {
+ OseeLog.logf(FileWatchList.class, Level.INFO,
+ "Removing markers from [%s] because maximium marker watch list size has been reached.",
+ oldest.file.getName());
+ fileWatchItems.remove(oldest);
+ if (oldest.markers != null) {
+ for (IMarker marker : oldest.markers) {
+ try {
+ marker.delete();
+ } catch (CoreException ex) {
+ OseeLog.log(FileWatchList.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ }
+ }
+
+ private boolean isListTooBig() {
+ return fileWatchItems.size() > 20;
+ }
+
+ public List<IMarker> get(IFile file) {
+ FileWatchItem item = findWatchItem(file);
+ if (item != null) {
+ return item.markers;
+ } else {
+ return null;
+ }
+ }
+
+ private FileWatchItem findWatchItem(IFile file) {
+ for (FileWatchItem item : fileWatchItems) {
+ if (item.file.equals(file)) {
+ return item;
+ }
+ }
+ return null;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/MarkerInfo.java b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/MarkerInfo.java
new file mode 100644
index 000000000..de2d85764
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/MarkerInfo.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.markers;
+
+public class MarkerInfo {
+ private final String file;
+ private final int line;
+ private final String message;
+
+ public MarkerInfo(String file, int line, String message) {
+ this.file = file;
+ this.line = line;
+ this.message = message;
+ }
+
+ /**
+ * @return the file
+ */
+ public String getFile() {
+ return file;
+ }
+
+ /**
+ * @return the line
+ */
+ public int getLine() {
+ return line;
+ }
+
+ /**
+ * @return the message
+ */
+ public String getMessage() {
+ return message;
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/MarkerPlugin.java b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/MarkerPlugin.java
new file mode 100644
index 000000000..214c3f531
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/MarkerPlugin.java
@@ -0,0 +1,122 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.markers;
+
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceChangeListener;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.resources.IResourceDeltaVisitor;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.Jobs;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class MarkerPlugin implements BundleActivator {
+
+ private static FileWatchList filesToWatch;
+ public static final String PLUGIN_ID = "org.eclipse.osee.ote.ui.markers";
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ filesToWatch = new FileWatchList();
+ ResourcesPlugin.getWorkspace().addResourceChangeListener(new IResourceChangeListener() {
+
+ @Override
+ public void resourceChanged(final IResourceChangeEvent event) {
+ IResourceDelta delta = event.getDelta();
+ try {
+ delta.accept(new IResourceDeltaVisitor() {
+ @Override
+ public boolean visit(IResourceDelta delta) throws CoreException {
+ IPath path = delta.getFullPath();
+ String extension = path.getFileExtension();
+ if (extension != null) {
+ if ("tmo".equals(extension)) {
+ IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
+ // file.refreshLocal(depth, monitor);
+ if (file != null) {
+ switch (delta.getKind()) {
+ case IResourceDelta.REMOVED:
+ removeMarkers(file);
+ break;
+ default:
+ // do nothing
+ }
+ }
+ }
+ }
+ if (delta.getAffectedChildren().length > 0) {
+ return true;
+ }
+ return false;
+ }
+ });
+ } catch (CoreException ex) {
+ OseeLog.log(MarkerPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ }, IResourceChangeEvent.POST_CHANGE);
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ }
+
+ public static void addMarkers(IFile file) {
+ removeMarkers(file);
+ Jobs.runInJob("OTE Marker Processing", new ProcessOutfileSax(file), MarkerPlugin.class, MarkerPlugin.PLUGIN_ID,
+ false);
+ }
+
+ public static void removeMarkers(IFile file) {
+ List<IMarker> markers = filesToWatch.get(file);
+ if (markers != null) {
+ for (IMarker marker : markers) {
+ try {
+ marker.delete();
+ } catch (CoreException ex) {
+ }
+ }
+ }
+ findAndRemoveOteMarkers(file);
+ }
+
+ static synchronized void updateMarkerInfo(IFile file, List<IMarker> markers) {
+ filesToWatch.put(file, markers);
+ }
+
+ public static void findAndRemoveOteMarkers(IResource resource) {
+ try {
+ if (resource == null || !resource.exists()) {
+ return;
+ }
+ IMarker[] markersToRemove =
+ resource.findMarkers("org.eclipse.osee.ote.ui.output.errorMarker", false, IResource.DEPTH_INFINITE);
+ for (IMarker localMarker : markersToRemove) {
+ localMarker.delete();
+ }
+ } catch (CoreException e) {
+ OseeLog.log(MarkerPlugin.class, Level.SEVERE, e);
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/OteMarkerHelper.java b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/OteMarkerHelper.java
new file mode 100644
index 000000000..adbc757d5
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/OteMarkerHelper.java
@@ -0,0 +1,143 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.markers;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Level;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.ws.AWorkspace;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.StacktraceData;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class OteMarkerHelper {
+
+ private final List<MarkerInfo> markerInfo;
+ private final List<IMarker> markersToDelete;
+ private final Map<CheckPointHelper, CheckPointHelper> count = new HashMap<>();
+ private final StringBuilder builder = new StringBuilder();
+ private final List<TestPointData> testPonitDatas;
+
+ public OteMarkerHelper(List<TestPointData> testPointDatas) {
+ this.testPonitDatas = testPointDatas;
+ markerInfo = new ArrayList<>();
+ markersToDelete = new ArrayList<>();
+
+ doWork();
+ }
+
+ private void doWork() {
+ for (TestPointData data : testPonitDatas) {
+ String description = getDescription(data.getCheckPointData());
+ String number = data.getNumber();
+ int num = Integer.parseInt(number);
+ String details = String.format("#%03d %s", num, description);
+
+ if (data.getStacktraceCollection() != null) {
+ for (StacktraceData stackLocation : data.getStacktraceCollection().getStackTrace()) {
+ String file = stackLocation.getSource();
+ String line = stackLocation.getLine();
+ //pull out the java file name
+ file = file.substring(file.lastIndexOf(".") + 1);
+ int innerMarker = file.indexOf("$");
+ if (innerMarker > 0) {
+ file = file.substring(0, file.indexOf("$"));
+ }
+ file += ".java";
+ int linenumber = Integer.parseInt(line);
+
+ markerInfo.add(new MarkerInfo(file, linenumber, details));
+ }
+ }
+ }
+ finish();
+ }
+
+ private String getDescription(List<CheckPointData> datas) {
+ count.clear();
+ for (CheckPointData data : datas) {
+ CheckPointHelper check = new CheckPointHelper(data);
+ if (count.containsKey(check)) {
+ count.get(check).increment();
+ } else {
+ count.put(check, check);
+ }
+ }
+
+ CheckPointHelper[] helper = count.values().toArray(new CheckPointHelper[count.values().size()]);
+ Arrays.sort(helper);
+ int maxNumber = 2;
+ builder.setLength(0);
+ for (int i = 0; i < helper.length && i < maxNumber; i++) {
+ builder.append(helper[i].toString());
+ if (i + 1 < Math.min(helper.length, maxNumber)) {
+ builder.append(", ");
+ }
+ if (i + 1 < helper.length && i + 1 >= maxNumber) {
+ builder.append("...");
+ }
+ }
+ return builder.toString();
+ }
+
+ private void finish() {
+
+ Set<String> fileAlreadyLookedFor = new HashSet<>();
+ Map<String, IResource> resources = new HashMap<>();
+
+ for (MarkerInfo marker : markerInfo) {
+ if (!fileAlreadyLookedFor.contains(marker.getFile())) {
+ fileAlreadyLookedFor.add(marker.getFile());
+ IResource resource = AWorkspace.findWorkspaceFile(marker.getFile());
+ if (resource != null) {
+ resources.put(marker.getFile(), resource);
+ }
+ }
+ }
+
+ for (MarkerInfo marker : markerInfo) {
+ IResource resourceToMark = resources.get(marker.getFile());
+ MarkerPlugin.findAndRemoveOteMarkers(resourceToMark);
+ }
+
+ for (MarkerInfo marker : markerInfo) {
+ try {
+ IResource resourceToMark = resources.get(marker.getFile());
+ if (resourceToMark != null) {
+ Map<String, Object> scriptMarkerMap = new HashMap<>();
+ scriptMarkerMap.put(IMarker.MESSAGE, marker.getMessage());
+ scriptMarkerMap.put(IMarker.SEVERITY, new Integer(IMarker.SEVERITY_INFO));
+ scriptMarkerMap.put(IMarker.LINE_NUMBER, marker.getLine());
+ IMarker markerToDelete = resourceToMark.createMarker("org.eclipse.osee.ote.ui.output.errorMarker");
+ markerToDelete.setAttributes(scriptMarkerMap);
+ markersToDelete.add(markerToDelete);
+ }
+ } catch (Exception ex) {
+ OseeLog.log(MarkerPlugin.class, Level.SEVERE, "Error adding markers from outfile", ex);
+ }
+ }
+ }
+
+ public List<IMarker> getMarkers() {
+ return markersToDelete;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/ProcessOutfileSax.java b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/ProcessOutfileSax.java
new file mode 100644
index 000000000..bc1af2809
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/ProcessOutfileSax.java
@@ -0,0 +1,277 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.markers;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Stack;
+import java.util.logging.Level;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.IExceptionableRunnable;
+import org.eclipse.osee.framework.ui.ws.AWorkspace;
+import org.eclipse.osee.ote.core.framework.saxparse.IBaseSaxElementListener;
+import org.eclipse.osee.ote.core.framework.saxparse.OteSaxHandler;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.StacktraceData;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXNotRecognizedException;
+import org.xml.sax.SAXNotSupportedException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class ProcessOutfileSax implements IExceptionableRunnable {
+
+ private final IFile file;
+
+ private static final int _1_MB = 1048576;
+ private static final int _20_MB = _1_MB * 20;
+
+ private final List<TestPointData> testPointDatas = new ArrayList<>();
+ private TestPointData currentData = null;
+ private CheckPointData currentCheckPoint = null;
+ protected StackTraceCollection currentStackTrace;
+
+ public ProcessOutfileSax(IFile file) {
+ this.file = file;
+ }
+
+ @Override
+ public IStatus run(IProgressMonitor monitor) throws Exception {
+ File outfile = AWorkspace.iFileToFile(file);
+ if (outfile.length() > _20_MB) {
+ OseeLog.logf(MarkerPlugin.class, Level.WARNING,
+ "%s has a length of [%d], the max size processed is [%d].", file.getName(), outfile.length(), _20_MB);
+ return Status.OK_STATUS;
+ }
+ if (!file.isSynchronized(0)) {
+ OseeLog.logf(MarkerPlugin.class, Level.WARNING, "%s is not synchronized.", file.getName());
+ file.refreshLocal(0, monitor);
+ }
+
+ monitor.setTaskName(String.format("Computing overview information for [%s].", file.getName()));
+
+// InputStream contents = file.getContents();
+
+ boolean hadParseException = false;
+ int numberOfTries = 0;
+ do{
+ // Using this because IFile was acting very flaky for this.
+ FileInputStream contents = new FileInputStream(outfile);
+
+ try {
+ hadParseException = false;
+ parseContents(contents);
+ } catch (Exception ex) {
+ hadParseException = true;
+ System.out.println("Had EXCEPTION HERE FROM parseContents()!!! numberOfTries = " + numberOfTries);
+ }
+ finally {
+ numberOfTries++;
+ Thread.sleep(1000);
+ }
+ } while(hadParseException && (numberOfTries < 5));
+ if (numberOfTries > 1){
+ FileInputStream contents = new FileInputStream(outfile);
+ parseContents(contents);
+ }
+
+
+ OteMarkerHelper helper = new OteMarkerHelper(this.testPointDatas);
+ MarkerPlugin.updateMarkerInfo(file, helper.getMarkers());
+
+ return Status.OK_STATUS;
+ }
+
+ private void parseContents(InputStream contents) throws SAXException, Exception, SAXNotRecognizedException, SAXNotSupportedException, IOException {
+ XMLReader xmlReader = XMLReaderFactory.createXMLReader();
+ OteSaxHandler handler = new OteSaxHandler();
+ xmlReader.setContentHandler(handler);
+ xmlReader.setProperty("http://xml.org/sax/properties/lexical-handler", handler); // This is the important part
+
+ final Stack<String> elementStack = new Stack<>();
+ handler.getHandler("*").addListener(new IBaseSaxElementListener() {
+
+ @Override
+ public void onStartElement(Object obj) {
+ elementStack.push((String) obj);
+ }
+
+ @Override
+ public void onEndElement(Object obj) {
+ elementStack.pop();
+ }
+ });
+
+ handler.getHandler("TestPoint").addListener(new IBaseSaxElementListener() {
+ @Override
+ public void onEndElement(Object obj) {
+ if (currentData != null && currentData.isFailed()) {
+ testPointDatas.add(currentData);
+ }
+ currentData = null;
+ }
+
+ @Override
+ public void onStartElement(Object obj) {
+ currentData = new TestPointData();
+ }
+ });
+ handler.getHandler("CheckPoint").addListener(new IBaseSaxElementListener() {
+ @Override
+ public void onEndElement(Object obj) {
+ if (currentCheckPoint.isFailed()) {
+ currentData.add(currentCheckPoint);
+ }
+ currentCheckPoint = null;
+ }
+
+ @Override
+ public void onStartElement(Object obj) {
+ if (currentData != null) {
+ currentCheckPoint = new CheckPointData();
+ }
+ }
+ });
+
+ handler.getHandler("Result").addListener(new IBaseSaxElementListener() {
+ @Override
+ public void onEndElement(Object obj) {
+ boolean failed = false;
+ if ("FAILED".equals(obj)) {
+ failed = true;
+ }
+
+ if (currentCheckPoint != null) {
+ currentCheckPoint.setFailed(failed);
+ } else if (currentData != null && elementStack.peek().equals("TestPoint")) {
+ currentData.setFailed(failed);
+ }
+ }
+
+ @Override
+ public void onStartElement(Object obj) {
+ }
+ });
+
+ handler.getHandler("TestPointName").addListener(new IBaseSaxElementListener() {
+ @Override
+ public void onEndElement(Object obj) {
+ if (currentCheckPoint != null) {
+ currentCheckPoint.setName(obj.toString());
+ }
+ }
+
+ @Override
+ public void onStartElement(Object obj) {
+ }
+ });
+ handler.getHandler("Expected").addListener(new IBaseSaxElementListener() {
+ @Override
+ public void onEndElement(Object obj) {
+ if (currentCheckPoint != null) {
+ currentCheckPoint.setExpected(spaceProcessing(obj.toString()));
+ }
+ }
+
+ @Override
+ public void onStartElement(Object obj) {
+ }
+ });
+ handler.getHandler("Actual").addListener(new IBaseSaxElementListener() {
+ @Override
+ public void onEndElement(Object obj) {
+ if (currentCheckPoint != null) {
+ currentCheckPoint.setActual(spaceProcessing(obj.toString()));
+ }
+ }
+
+ @Override
+ public void onStartElement(Object obj) {
+ }
+ });
+ handler.getHandler("Number").addListener(new IBaseSaxElementListener() {
+ @Override
+ public void onEndElement(Object obj) {
+ if (currentData != null) {
+ currentData.setNumber(obj.toString());
+ }
+ }
+
+ @Override
+ public void onStartElement(Object obj) {
+ }
+ });
+ handler.getHandler("Location").addListener(new IBaseSaxElementListener() {
+ @Override
+ public void onEndElement(Object obj) {
+ if (currentStackTrace != null) {
+ currentData.setStackTrace(currentStackTrace);
+ currentStackTrace = null;
+ }
+ }
+
+ @Override
+ public void onStartElement(Object obj) {
+ if (currentData != null) {
+ currentStackTrace = new StackTraceCollection();
+ }
+ }
+ });
+ handler.getHandler("Stacktrace").addListener(new IBaseSaxElementListener() {
+ @Override
+ public void onEndElement(Object obj) {
+ }
+
+ @Override
+ public void onStartElement(Object obj) {
+ if (currentStackTrace != null) {
+ currentStackTrace.addTrace((StacktraceData) obj);
+ }
+ }
+ });
+
+ xmlReader.parse(new InputSource(contents));
+ }
+
+ private String spaceProcessing(String expected) {
+ int index = 0, preCount = 0, postCount = 0;
+ while (index < expected.length() && expected.charAt(index) == ' ') {
+ index++;
+ preCount++;
+ }
+ index = expected.length() - 1;
+ while (index >= 0 && expected.charAt(index) == ' ') {
+ index--;
+ postCount++;
+ }
+
+ expected = expected.trim();
+ if (preCount > 0) {
+ expected = String.format("#sp%d#%s", preCount, expected);
+ }
+ if (postCount > 0) {
+ expected = String.format("%s#sp%d#", expected, postCount);
+ }
+
+ return expected;
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/StackTraceCollection.java b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/StackTraceCollection.java
new file mode 100644
index 000000000..addc27210
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/StackTraceCollection.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.markers;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.ote.core.framework.saxparse.elements.StacktraceData;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class StackTraceCollection {
+
+ public List<StacktraceData> data = new ArrayList<>();
+
+ public void addTrace(StacktraceData obj) {
+ data.add(obj);
+ }
+
+ public List<StacktraceData> getStackTrace() {
+ return data;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/TestPointData.java b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/TestPointData.java
new file mode 100644
index 000000000..1fa278336
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.markers/src/org/eclipse/osee/ote/ui/markers/TestPointData.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.markers;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class TestPointData {
+
+ private boolean isFailed;
+ private final List<CheckPointData> data = new ArrayList<>();
+ private String number;
+ private StackTraceCollection stacktrace;
+
+ public boolean isFailed() {
+ return isFailed;
+ }
+
+ public void add(CheckPointData checkPoint) {
+ data.add(checkPoint);
+ }
+
+ public void setFailed(boolean failed) {
+ isFailed = failed;
+ }
+
+ public void setNumber(String number) {
+ this.number = number;
+ }
+
+ public String getNumber() {
+ return number;
+ }
+
+ public void setStackTrace(StackTraceCollection currentStackTrace) {
+ this.stacktrace = currentStackTrace;
+ }
+
+ public List<CheckPointData> getCheckPointData() {
+ return data;
+ }
+
+ public StackTraceCollection getStacktraceCollection() {
+ return stacktrace;
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/.classpath b/org.eclipse.osee.ote.ui.test.manager/.classpath
new file mode 100644
index 000000000..1fa3e6803
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.ote.ui.test.manager/.pmd b/org.eclipse.osee.ote.ui.test.manager/.pmd
new file mode 100644
index 000000000..c7b0a9fb3
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/.pmd
@@ -0,0 +1,925 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<pmd>
+ <useProjectRuleSet>false</useProjectRuleSet>
+ <ruleSetFile>.ruleset</ruleSetFile>
+ <rules>
+ <rule>
+ <name>LooseCoupling</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneMethodMustImplementCloneable</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedImports</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SignatureDeclareThrowsException</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IfStmtsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>WhileLoopsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IfElseStmtsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ForLoopsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseSingleton</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanReturns</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanExpressions</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SwitchStmtsShouldHaveDefault</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDeeplyNestedIfStmts</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidReassigningParameters</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SwitchDensity</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConstructorCallsOverridableMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AccessorClassGeneration</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalFieldCouldBeStatic</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloseResource</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonStaticInitializer</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DefaultLabelNotLastInSwitchStmt</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonCaseLabelInSwitchStatement</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>OptimizableToArrayCall</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BadComparison</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EqualsNull</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConfusingTernary</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InstantiationToGetClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IdempotentOperations</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimpleDateFormatNeedsLocale</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ImmutableField</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseLocaleWithCaseConversions</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidProtectedFieldInFinalClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AssignmentToNonFinalStatic</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingStaticMethodInNonInstantiatableClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidSynchronizedAtMethodLevel</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingBreakInSwitch</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseNotifyAllInsteadOfNotify</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidInstanceofChecksInCatchClause</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractClassWithoutAbstractMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyConditional</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CompareObjectsWithEquals</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PositionLiteralsFirstInComparisons</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryLocalBeforeReturn</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonThreadSafeSingleton</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UncommentedEmptyMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UncommentedEmptyConstructor</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidConstantsInterface</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnsynchronizedStaticDateFormatter</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PreserveStackTrace</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseCollectionIsEmpty</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassWithOnlyPrivateConstructorsShouldBeFinal</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyMethodInAbstractClassShouldBeAbstract</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SingularField</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReturnEmptyArrayRatherThanNull</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractClassWithoutAnyMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooFewBranchesForASwitchStatement</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCatchingThrowable</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SignatureDeclareThrowsException</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExceptionAsFlowControl</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCatchingNPE</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingRawExceptionTypes</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingNullPointerException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidRethrowingException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotExtendJavaLangError</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotThrowExceptionInFinally</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingNewInstanceOfSameException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedPrivateField</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedLocalVariable</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedPrivateMethod</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedFormalParameter</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MoreThanOneLogger</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LoggerIsNotStaticFinal</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SystemPrintln</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidPrintStackTrace</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDuplicateLiterals</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringInstantiation</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringToString</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InefficientStringBuffering</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryCaseChange</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseStringBufferLength</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AppendCharacterWithChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConsecutiveLiteralAppends</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseIndexOfChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InefficientEmptyStringCheck</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InsufficientStringBufferDeclaration</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessStringValueOf</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringBufferInstantiationWithChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseEqualsToCompareStrings</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidStringBufferField</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceVectorWithList</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceHashtableWithMap</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceEnumerationWithIterator</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidEnumAsIdentifier</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidAssertAsIdentifier</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IntegerInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ByteInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ShortInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LongInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseBeforeAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseAfterAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseTestAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4SuitesShouldUseSuiteAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitUseExpected</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseProperClassLoader</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MDBAndSessionBeanNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>RemoteSessionInterfaceNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LocalInterfaceSessionNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LocalHomeNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>RemoteInterfaceNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotCallSystemExit</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StaticEJBFieldShouldBeFinal</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotUseThreads</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidInstantiatingObjectsInLoops</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseArrayListInsteadOfVector</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyStartsWith</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseStringBufferForStringAppends</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseArraysAsList</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidArrayLoops</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryWrapperObjectCreation</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AddEmptyString</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyCatchBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyIfStmt</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyWhileStmt</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyTryBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyFinallyBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptySwitchStatements</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JumbledIncrementer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ForLoopShouldBeWhileLoop</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryConversionTemporary</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>OverrideBothEqualsAndHashcode</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoubleCheckedLocking</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReturnFromFinallyBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptySynchronizedBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryReturn</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyStaticInitializer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnconditionalIfStatement</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyStatementNotInLoop</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanInstantiation</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryFinalModifier</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CollapsibleIfStatements</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessOverridingMethod</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassCastExceptionWithToArray</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDecimalLiteralsInBigDecimalConstructor</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessOperationOnImmutable</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MisplacedNullCheck</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedNullCheckInEquals</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThreadGroup</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BrokenNullCheck</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BigIntegerInstantiation</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingOctalValues</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingHardCodedIP</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CheckResultSet</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidMultipleUnaryOperators</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyInitializer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodReturnsInternalArray</name>
+ <ruleset>Security Code Guidelines</ruleset>
+ </rule>
+ <rule>
+ <name>ArrayIsStoredDirectly</name>
+ <ruleset>Security Code Guidelines</ruleset>
+ </rule>
+ <rule>
+ <name>CouplingBetweenObjects</name>
+ <ruleset>Coupling Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveImports</name>
+ <ruleset>Coupling Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LooseCoupling</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DuplicateImports</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DontImportJavaLang</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedImports</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ImportFromSamePackage</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyStaticImports</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitStaticSuite</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitSpelling</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitAssertionsShouldIncludeMessage</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitTestsShouldIncludeAssert</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TestClassWithoutTestCases</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryBooleanAssertion</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertEqualsInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertSameInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertNullInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanAssertion</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NullAssignment</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedModifier</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AssignmentInOperand</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AtLeastOneConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DontImportSun</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousOctalEscape</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CallSuperInConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryParentheses</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DefaultPackage</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanInversion</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DataflowAnomalyAnalysis</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFinalLocalVariable</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingShortType</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingVolatile</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingNativeCode</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidAccessibilityAlteration</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotCallGarbageCollectionExplicitly</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodNamingConventions</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassNamingConventions</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractNaming</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDollarSigns</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodWithSameNameAsEnclosingClass</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousHashcodeMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousConstantFieldName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousEqualsMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFieldNameMatchingTypeName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFieldNameMatchingMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NoPackage</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PackageCase</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MisleadingVariableName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanGetMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NPathComplexity</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveMethodLength</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveParameterList</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveClassLength</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CyclomaticComplexity</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessivePublicCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyFields</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssMethodCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssTypeCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssConstructorCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyMethods</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyFinalizer</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeOnlyCallsSuperFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeOverloaded</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeDoesNotCallSuperFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeShouldBeProtected</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCallingFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseCorrectExceptionLogging</name>
+ <ruleset>Jakarta Commons Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ProperLogger</name>
+ <ruleset>Jakarta Commons Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingSerialVersionUID</name>
+ <ruleset>JavaBean Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ProperCloneImplementation</name>
+ <ruleset>Clone Implementation Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneThrowsCloneNotSupportedException</name>
+ <ruleset>Clone Implementation Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneMethodMustImplementCloneable</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ </rules>
+ <includeDerivedFiles>false</includeDerivedFiles>
+ <violationsAsErrors>true</violationsAsErrors>
+</pmd>
diff --git a/org.eclipse.osee.ote.ui.test.manager/.project b/org.eclipse.osee.ote.ui.test.manager/.project
new file mode 100644
index 000000000..a069d1a04
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/.project
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ote.ui.test.manager</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ds.core.builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.ui.test.manager/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.ui.test.manager/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..6f0d22aa4
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/META-INF/MANIFEST.MF
@@ -0,0 +1,55 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OSEE Test Manager Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.ui.test.manager;singleton:=true
+Bundle-Version: 0.25.3.qualifier
+Bundle-Activator: org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Export-Package: org.eclipse.osee.ote.ui.test.manager,
+ org.eclipse.osee.ote.ui.test.manager.actions,
+ org.eclipse.osee.ote.ui.test.manager.configuration,
+ org.eclipse.osee.ote.ui.test.manager.configuration.pages,
+ org.eclipse.osee.ote.ui.test.manager.connection,
+ org.eclipse.osee.ote.ui.test.manager.core,
+ org.eclipse.osee.ote.ui.test.manager.jobs,
+ org.eclipse.osee.ote.ui.test.manager.models,
+ org.eclipse.osee.ote.ui.test.manager.operations,
+ org.eclipse.osee.ote.ui.test.manager.pages,
+ org.eclipse.osee.ote.ui.test.manager.pages.contributions,
+ org.eclipse.osee.ote.ui.test.manager.pages.scriptTable,
+ org.eclipse.osee.ote.ui.test.manager.panels,
+ org.eclipse.osee.ote.ui.test.manager.preferences,
+ org.eclipse.osee.ote.ui.test.manager.preferences.environment,
+ org.eclipse.osee.ote.ui.test.manager.util,
+ org.eclipse.osee.ote.ui.test.manager.wizards
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.osee.ote.client,
+ org.eclipse.osee.ote.core,
+ org.eclipse.core.resources,
+ org.eclipse.ui.editors,
+ org.eclipse.ui.ide,
+ org.eclipse.ui.workbench.texteditor,
+ org.eclipse.osee.framework.jdk.core,
+ org.eclipse.osee.framework.plugin.core,
+ org.eclipse.osee.framework.ui.plugin,
+ org.eclipse.osee.framework.ui.swt,
+ org.eclipse.osee.ote.ui.markers,
+ org.eclipse.jface.text,
+ org.eclipse.osee.ote.ui,
+ org.eclipse.osee.ote.connection.service,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.nebula.widgets.xviewer,
+ org.eclipse.osee.framework.ui.ws,
+ org.eclipse.osee.ote.runtimeManager,
+ net.jini;bundle-version="2.1.0"
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Import-Package: org.apache.xml.serialize,
+ org.eclipse.core.filesystem,
+ org.eclipse.jdt.core,
+ org.eclipse.nebula.widgets.xviewer.core.model,
+ org.eclipse.osee.framework.core.exception,
+ org.eclipse.osee.ote.ui.builder,
+ org.eclipse.osee.ote.version,
+ org.osgi.service.event;version="1.3.0"
diff --git a/org.eclipse.osee.ote.ui.test.manager/build.properties b/org.eclipse.osee.ote.ui.test.manager/build.properties
new file mode 100644
index 000000000..274a831ad
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/build.properties
@@ -0,0 +1,7 @@
+output.. = bin/
+bin.includes = plugin.xml,\
+ images/,\
+ META-INF/,\
+ support/,\
+ .
+source.. = src/
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/add.gif b/org.eclipse.osee.ote.ui.test.manager/images/add.gif
new file mode 100644
index 000000000..6cf3b5f1c
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/add.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/alert_obj.gif b/org.eclipse.osee.ote.ui.test.manager/images/alert_obj.gif
new file mode 100644
index 000000000..7a49f6d45
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/alert_obj.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/binoculars.gif b/org.eclipse.osee.ote.ui.test.manager/images/binoculars.gif
new file mode 100644
index 000000000..b04deb3c2
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/binoculars.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/check.gif b/org.eclipse.osee.ote.ui.test.manager/images/check.gif
new file mode 100644
index 000000000..6b3078b35
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/check.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/chkbox_disabled.gif b/org.eclipse.osee.ote.ui.test.manager/images/chkbox_disabled.gif
new file mode 100644
index 000000000..7aa131aed
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/chkbox_disabled.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/chkbox_enabled.gif b/org.eclipse.osee.ote.ui.test.manager/images/chkbox_enabled.gif
new file mode 100644
index 000000000..9cacb96dc
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/chkbox_enabled.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/connected.gif b/org.eclipse.osee.ote.ui.test.manager/images/connected.gif
new file mode 100644
index 000000000..8290462e3
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/connected.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/connected_plug.gif b/org.eclipse.osee.ote.ui.test.manager/images/connected_plug.gif
new file mode 100644
index 000000000..8493df40d
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/connected_plug.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/connected_sm.gif b/org.eclipse.osee.ote.ui.test.manager/images/connected_sm.gif
new file mode 100644
index 000000000..b397d8b2c
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/connected_sm.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/debugOutput.gif b/org.eclipse.osee.ote.ui.test.manager/images/debugOutput.gif
new file mode 100644
index 000000000..d18ebcb64
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/debugOutput.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/debugOutput_sm.gif b/org.eclipse.osee.ote.ui.test.manager/images/debugOutput_sm.gif
new file mode 100644
index 000000000..2e74d0afb
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/debugOutput_sm.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/delete.gif b/org.eclipse.osee.ote.ui.test.manager/images/delete.gif
new file mode 100644
index 000000000..2cd9c5444
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/delete.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/disconnected_plug.gif b/org.eclipse.osee.ote.ui.test.manager/images/disconnected_plug.gif
new file mode 100644
index 000000000..61648a3d1
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/disconnected_plug.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/environment.gif b/org.eclipse.osee.ote.ui.test.manager/images/environment.gif
new file mode 100644
index 000000000..f3377f38f
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/environment.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/error.gif b/org.eclipse.osee.ote.ui.test.manager/images/error.gif
new file mode 100644
index 000000000..8612eaff5
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/error.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/error_stack.gif b/org.eclipse.osee.ote.ui.test.manager/images/error_stack.gif
new file mode 100644
index 000000000..e61fc24f9
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/error_stack.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/file.gif b/org.eclipse.osee.ote.ui.test.manager/images/file.gif
new file mode 100644
index 000000000..7ccc6a703
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/file.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/file_delete.gif b/org.eclipse.osee.ote.ui.test.manager/images/file_delete.gif
new file mode 100644
index 000000000..45699b57d
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/file_delete.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/flatOutput.gif b/org.eclipse.osee.ote.ui.test.manager/images/flatOutput.gif
new file mode 100644
index 000000000..bbfa55fe5
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/flatOutput.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/flatOutput_sm.gif b/org.eclipse.osee.ote.ui.test.manager/images/flatOutput_sm.gif
new file mode 100644
index 000000000..64b499c97
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/flatOutput_sm.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/fldr_obj.gif b/org.eclipse.osee.ote.ui.test.manager/images/fldr_obj.gif
new file mode 100644
index 000000000..b6858690c
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/fldr_obj.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/glasses.gif b/org.eclipse.osee.ote.ui.test.manager/images/glasses.gif
new file mode 100644
index 000000000..9bdbc128f
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/glasses.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/green_bug.gif b/org.eclipse.osee.ote.ui.test.manager/images/green_bug.gif
new file mode 100644
index 000000000..1c36fc1a9
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/green_bug.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/import_wiz.gif b/org.eclipse.osee.ote.ui.test.manager/images/import_wiz.gif
new file mode 100644
index 000000000..d38085ad9
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/import_wiz.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/light_bolt.gif b/org.eclipse.osee.ote.ui.test.manager/images/light_bolt.gif
new file mode 100644
index 000000000..4bc7dd493
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/light_bolt.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/loadConfig.gif b/org.eclipse.osee.ote.ui.test.manager/images/loadConfig.gif
new file mode 100644
index 000000000..f92b0e803
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/loadConfig.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/normalOutput.gif b/org.eclipse.osee.ote.ui.test.manager/images/normalOutput.gif
new file mode 100644
index 000000000..eea297366
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/normalOutput.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/normalOutput_sm.gif b/org.eclipse.osee.ote.ui.test.manager/images/normalOutput_sm.gif
new file mode 100644
index 000000000..12c790201
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/normalOutput_sm.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/ofp.gif b/org.eclipse.osee.ote.ui.test.manager/images/ofp.gif
new file mode 100644
index 000000000..d19d763eb
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/ofp.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/red_bug.gif b/org.eclipse.osee.ote.ui.test.manager/images/red_bug.gif
new file mode 100644
index 000000000..df3ed441b
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/red_bug.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/save_edit.gif b/org.eclipse.osee.ote.ui.test.manager/images/save_edit.gif
new file mode 100644
index 000000000..9302c4ec6
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/save_edit.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/saveas_edit.gif b/org.eclipse.osee.ote.ui.test.manager/images/saveas_edit.gif
new file mode 100644
index 000000000..d7f9c6144
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/saveas_edit.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/scriptCancelled.gif b/org.eclipse.osee.ote.ui.test.manager/images/scriptCancelled.gif
new file mode 100644
index 000000000..6cb4431c6
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/scriptCancelled.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/scriptCancelled_sm.gif b/org.eclipse.osee.ote.ui.test.manager/images/scriptCancelled_sm.gif
new file mode 100644
index 000000000..a1feb00a6
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/scriptCancelled_sm.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/scriptCancelling.gif b/org.eclipse.osee.ote.ui.test.manager/images/scriptCancelling.gif
new file mode 100644
index 000000000..41991b2e3
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/scriptCancelling.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/scriptCancelling_sm.gif b/org.eclipse.osee.ote.ui.test.manager/images/scriptCancelling_sm.gif
new file mode 100644
index 000000000..e1dde912d
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/scriptCancelling_sm.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/scriptComplete.gif b/org.eclipse.osee.ote.ui.test.manager/images/scriptComplete.gif
new file mode 100644
index 000000000..da16deae3
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/scriptComplete.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/scriptComplete_sm.gif b/org.eclipse.osee.ote.ui.test.manager/images/scriptComplete_sm.gif
new file mode 100644
index 000000000..e7903b5c4
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/scriptComplete_sm.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/scriptInQueue.gif b/org.eclipse.osee.ote.ui.test.manager/images/scriptInQueue.gif
new file mode 100644
index 000000000..dcdb06c0f
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/scriptInQueue.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/scriptInQueue_sm.gif b/org.eclipse.osee.ote.ui.test.manager/images/scriptInQueue_sm.gif
new file mode 100644
index 000000000..f96466208
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/scriptInQueue_sm.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/scriptOutput.gif b/org.eclipse.osee.ote.ui.test.manager/images/scriptOutput.gif
new file mode 100644
index 000000000..7793f3b82
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/scriptOutput.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/scriptOutput_sm.gif b/org.eclipse.osee.ote.ui.test.manager/images/scriptOutput_sm.gif
new file mode 100644
index 000000000..ad403d95d
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/scriptOutput_sm.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/scriptReady.gif b/org.eclipse.osee.ote.ui.test.manager/images/scriptReady.gif
new file mode 100644
index 000000000..b8e969feb
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/scriptReady.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/scriptReady_sm.gif b/org.eclipse.osee.ote.ui.test.manager/images/scriptReady_sm.gif
new file mode 100644
index 000000000..07c5346e0
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/scriptReady_sm.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/scriptRunning.gif b/org.eclipse.osee.ote.ui.test.manager/images/scriptRunning.gif
new file mode 100644
index 000000000..0849e03b6
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/scriptRunning.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/sel_abort_stop.gif b/org.eclipse.osee.ote.ui.test.manager/images/sel_abort_stop.gif
new file mode 100644
index 000000000..8fa8ea101
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/sel_abort_stop.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/sel_batch_abort_stop.gif b/org.eclipse.osee.ote.ui.test.manager/images/sel_batch_abort_stop.gif
new file mode 100644
index 000000000..f0b55748b
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/sel_batch_abort_stop.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/sel_run_exec.gif b/org.eclipse.osee.ote.ui.test.manager/images/sel_run_exec.gif
new file mode 100644
index 000000000..4a70a050c
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/sel_run_exec.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/showerr_tsk.gif b/org.eclipse.osee.ote.ui.test.manager/images/showerr_tsk.gif
new file mode 100644
index 000000000..170b0e15f
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/showerr_tsk.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/test.gif b/org.eclipse.osee.ote.ui.test.manager/images/test.gif
new file mode 100644
index 000000000..d4848c0e1
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/test.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/tm.gif b/org.eclipse.osee.ote.ui.test.manager/images/tm.gif
new file mode 100644
index 000000000..c0b47e195
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/tm.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/tmError.gif b/org.eclipse.osee.ote.ui.test.manager/images/tmError.gif
new file mode 100644
index 000000000..96f464d67
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/tmError.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/tracability.gif b/org.eclipse.osee.ote.ui.test.manager/images/tracability.gif
new file mode 100644
index 000000000..28f1fd5ee
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/tracability.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/unsel_abort_stop.gif b/org.eclipse.osee.ote.ui.test.manager/images/unsel_abort_stop.gif
new file mode 100644
index 000000000..9ba15cf84
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/unsel_abort_stop.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/unsel_batch_abort_stop.gif b/org.eclipse.osee.ote.ui.test.manager/images/unsel_batch_abort_stop.gif
new file mode 100644
index 000000000..deee2f43c
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/unsel_batch_abort_stop.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/images/unsel_run_exec.gif b/org.eclipse.osee.ote.ui.test.manager/images/unsel_run_exec.gif
new file mode 100644
index 000000000..d7726f75b
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/images/unsel_run_exec.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui.test.manager/plugin.xml b/org.eclipse.osee.ote.ui.test.manager/plugin.xml
new file mode 100644
index 000000000..cbfdc7666
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/plugin.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+
+ <extension point="org.eclipse.ui.actionSets">
+ <actionSet
+ label="OSEE TM"
+ visible="true"
+ id="org.eclipse.osee.ote.ui.test.manager.actionSet">
+
+
+ </actionSet>
+ </extension>
+
+
+<!-- this changes the marker image in the editor marker bar -->
+
+
+
+ <extension
+ point="org.eclipse.ui.newWizards">
+ <category
+ name="Test Manager"
+ id="org.eclipse.osee.ote.ui.test.manager">
+ </category>
+ <wizard
+ name="Test Manager File"
+ icon="images/tm.gif"
+ category="org.eclipse.osee.ote.ui.test.manager"
+ class="org.eclipse.osee.ote.ui.test.manager.wizards.TestManagerNewWizard"
+ id="org.eclipse.osee.ote.ui.test.manager.wizards.TestManagerNewWizard">
+ </wizard>
+ </extension>
+ <extension
+ point="org.eclipse.ui.popupMenus">
+ <objectContribution adaptable="true"
+ objectClass="org.eclipse.core.resources.IFile"
+ nameFilter="*.java" id="org.eclipse.osee.ote.ui.menucontribution">
+ <menu
+ label="OTE"
+ path="additions"
+ id="org.eclipse.osee.ote.ui">
+ <separator
+ name="placeholder">
+ </separator>
+ </menu>
+ </objectContribution>
+ <objectContribution adaptable="true"
+ objectClass="org.eclipse.core.resources.IFile"
+ nameFilter="*.java"
+ id="org.eclipse.osee.ote.ui.test.manager.contribution1">
+ <action
+ enablesFor="+"
+ label="Add to Test Manager"
+ icon="images/tm.gif"
+ class="org.eclipse.osee.ote.ui.test.manager.actions.AddToTestManagerPopupAction"
+ menubarPath="org.eclipse.osee.ote.ui/placeholder"
+ id="org.eclipse.osee.ote.ui.test.manager.addtotestmanager">
+ </action>
+ </objectContribution>
+ <viewerContribution
+ targetID="#CompilationUnitEditorContext"
+ id="viewConf">
+ <action
+ label="Add To Test Manager"
+ icon="images/tm.gif"
+ menubarPath="org.eclipse.osee.ote.ui.viewer/placeholder"
+ id="org.eclipse.osee.ote.ui.test.manager.actions.AddToTestManagerEditorAction"
+ class="org.eclipse.osee.ote.ui.test.manager.actions.AddToTestManagerEditorAction"/>
+
+ </viewerContribution>
+
+ </extension>
+ <extension
+ point="org.eclipse.ui.preferencePages">
+ <page
+ category="org.eclipse.osee.framework.ui.skynet.OseePreferencePage"
+ class="org.eclipse.osee.ote.ui.test.manager.preferences.TestManagerPreferencePage"
+ id="org.eclipse.osee.ote.ui.test.manager.PreferencePage"
+ name="Test Manager"/>
+ </extension>
+ <extension
+ point="org.eclipse.osee.framework.ui.plugin.PropertyStoreControl">
+ <PropertyStoreControl
+ classname="org.eclipse.osee.ote.ui.test.manager.pages.contributions.ScriptExecutionContribution"
+ viewId="org.eclipse.osee.ote.ui.test.manager">
+ </PropertyStoreControl>
+ </extension>
+</plugin>
diff --git a/org.eclipse.osee.ote.ui.test.manager/pom.xml b/org.eclipse.osee.ote.ui.test.manager/pom.xml
new file mode 100644
index 000000000..d2ee20791
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/pom.xml
@@ -0,0 +1,35 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.osee</groupId>
+ <artifactId>org.eclipse.osee.ote.parent</artifactId>
+ <version>0.25.3-SNAPSHOT</version>
+ <relativePath>../org.eclipse.osee.ote.parent</relativePath>
+ </parent>
+
+ <artifactId>org.eclipse.osee.ote.ui.test.manager</artifactId>
+ <packaging>eclipse-plugin</packaging>
+ <name>OTE Ui Test Manager (Incubation)</name>
+
+ <build>
+ <!-- workaround for https://issues.sonatype.org/browse/TYCHO-168 -->
+ <resources>
+ <resource>
+ <directory>src</directory>
+ <excludes>
+ <exclude>**/*.java</exclude>
+ </excludes>
+ </resource>
+ </resources>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-source-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/ITestManagerFactory.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/ITestManagerFactory.java
new file mode 100644
index 000000000..56d0e2844
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/ITestManagerFactory.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager;
+
+import org.eclipse.osee.ote.ui.test.manager.core.TestManagerEditor;
+import org.eclipse.osee.ote.ui.test.manager.pages.AdvancedPage;
+import org.eclipse.osee.ote.ui.test.manager.pages.ScriptPage;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * TODO Add a summary of extension points and other classes that will need to be added to create a new test manager.
+ *
+ * @author Roberto E. Escobar
+ */
+public interface ITestManagerFactory {
+
+ public AdvancedPage getAdvancedPageNewInstance(Composite parent, int style, TestManagerEditor parentTestManager);
+
+ public String getEditorId();
+
+ public String getEditorLastOpenedKey();
+
+ public ScriptPage getScriptPageNewInstance(Composite parent, int style, TestManagerEditor parentTestManager);
+
+ public String getTestManagerExtension();
+
+ public String getTestManagerFileName();
+
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/OteTestManagerImage.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/OteTestManagerImage.java
new file mode 100644
index 000000000..27c26698c
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/OteTestManagerImage.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.osee.framework.ui.swt.ImageManager;
+import org.eclipse.osee.framework.ui.swt.KeyedImage;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+
+/**
+ * @author Andrew M. Finkbeiner
+ * @author Ryan Schmitt
+ */
+public enum OteTestManagerImage implements KeyedImage {
+ ADD("add.gif"),
+ ALERT_OBJ("alert_obj.gif"),
+ CHECK("check.gif"),
+ CHECKBOX_ENABLED("chkbox_enabled.gif"),
+ CHECKBOX_DISABLED("chkbox_disabled.gif"),
+ DELETE("delete.gif"),
+ ENVIRONMENT("environment.gif"),
+ ERROR("error.gif"),
+ ERROR_STACK("error_stack.gif"),
+ FILE("file.gif"),
+ FILE_DELETE("file_delete.gif"),
+ FLDR_OBJ("fldr_obj.gif"),
+ LOAD_CONFIG("loadConfig.gif"),
+ OFP("ofp.gif"),
+ PROJECT_SET_IMAGE("import_wiz.gif"),
+ SAVE_EDIT("save_edit.gif"),
+ SAVEAS_EDIT("saveas_edit.gif"),
+ SEL_ABORT_STOP("sel_abort_stop.gif"),
+ SEL_BATCH_ABORT_STOP("sel_batch_abort_stop.gif"),
+ SEL_RUN_EXEC("sel_run_exec.gif"),
+ SCRIPT_CANCELLED("scriptCancelled.gif"),
+ SCRIPT_CANCELLED_SM("scriptCancelled_sm.gif"),
+ SCRIPT_CANCELLING("scriptCancelling.gif"),
+ SCRIPT_CANCELLING_SM("scriptCancelling_sm.gif"),
+ SCRIPT_COMPLETE("scriptComplete.gif"),
+ SCRIPT_COMPLETE_SM("scriptComplete_sm.gif"),
+ SCRIPT_IN_QUEUE("scriptInQueue.gif"),
+ SCRIPT_IN_QUEUE_SM("scriptInQueue_sm.gif"),
+ SCRIPT_OUTPUT("scriptOutput.gif"),
+ SCRIPT_OUTPUT_SM("scriptOutput_sm.gif"),
+ SCRIPT_READY("scriptReady.gif"),
+ SCRIPT_READY_SM("scriptReady_sm.gif"),
+ SCRIPT_RUNNING("scriptRunning.gif"),
+ TEST("test.gif"),
+ TEST_BATCH_IMAGE("file.gif"),
+ TEST_MANAGER("tm.gif"),
+ UNSEL_ABORT_STOP("unsel_abort_stop.gif"),
+ UNSEL_BATCH_ABORT_STOP("unsel_batch_abort_stop.gif"),
+ UNSEL_RUN_EXEC("unsel_run_exec.gif");
+
+ private final String fileName;
+
+ private OteTestManagerImage(String fileName) {
+ this.fileName = fileName;
+ }
+
+ @Override
+ public ImageDescriptor createImageDescriptor() {
+ return ImageManager.createImageDescriptor(TestManagerPlugin.PLUGIN_ID, "images", fileName);
+ }
+
+ @Override
+ public String getImageKey() {
+ return TestManagerPlugin.PLUGIN_ID + ".images." + fileName;
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/actions/AddToTestManagerEditorAction.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/actions/AddToTestManagerEditorAction.java
new file mode 100644
index 000000000..64b5e3e97
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/actions/AddToTestManagerEditorAction.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.actions;
+
+import java.util.logging.Level;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.operations.AddIFileToTestManager;
+import org.eclipse.ui.IEditorActionDelegate;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.PlatformUI;
+
+public class AddToTestManagerEditorAction implements IEditorActionDelegate {
+
+ @Override
+ public void run(IAction action) {
+ // Get IFile of current editor
+ IEditorPart editorPart = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
+ IEditorInput editorInput = editorPart.getEditorInput();
+ IFile iFile = null;
+ if (editorInput instanceof IFileEditorInput) {
+ iFile = ((IFileEditorInput) editorInput).getFile();
+ if (iFile != null) {
+ OseeLog.log(TestManagerPlugin.class, Level.INFO, "iFile *" + iFile + "*");
+ }
+ }
+ if (iFile == null) {
+ AWorkbench.popup("ERROR", "Can't retrieve IFile");
+ return;
+ }
+ AddIFileToTestManager.getOperation().addIFileToScriptsPage(new String[]{iFile.getLocation().toOSString()});
+ }
+
+ @Override
+ public void selectionChanged(IAction action, ISelection selection) {
+ }
+
+ @Override
+ public void setActiveEditor(IAction action, IEditorPart targetEditor) {
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/actions/AddToTestManagerPopupAction.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/actions/AddToTestManagerPopupAction.java
new file mode 100644
index 000000000..000f0b8d3
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/actions/AddToTestManagerPopupAction.java
@@ -0,0 +1,108 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.actions;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.logging.Level;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IMember;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.ws.AWorkspace;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.operations.AddIFileToTestManager;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkbenchWindowActionDelegate;
+import org.eclipse.ui.PlatformUI;
+
+public class AddToTestManagerPopupAction implements IWorkbenchWindowActionDelegate {
+
+ public static String[] getSelection() {
+ List<String> selection = new ArrayList<>();
+ ISelection sel1 = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getSelection();
+ if(sel1 instanceof StructuredSelection){
+ Iterator<?> i = ((StructuredSelection)sel1).iterator();
+
+ while (i.hasNext()) {
+ Object obj = i.next();
+ if (obj instanceof IResource) {
+ IResource resource = (IResource) obj;
+ if (resource != null) {
+ selection.add(resource.getLocation().toOSString());
+ }
+ } else if (obj instanceof ICompilationUnit) {
+ ICompilationUnit resource = (ICompilationUnit) obj;
+ if (resource != null) {
+ selection.add(resource.getResource().getLocation().toOSString());
+ }
+ } else if (obj instanceof IMember){
+ ICompilationUnit resource = ((IMember) obj).getCompilationUnit();
+ if (resource != null) {
+ selection.add(resource.getResource().getLocation().toOSString());
+ }
+ }
+ }
+ } else if (sel1 instanceof TextSelection){
+ IEditorPart editorPart = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
+ IEditorInput editorInput = editorPart.getEditorInput();
+ IFile iFile = null;
+ if (editorInput instanceof IFileEditorInput) {
+ iFile = ((IFileEditorInput) editorInput).getFile();
+ if (iFile != null) {
+ selection.add(iFile.getLocation().toOSString());
+ }
+ }
+ }
+ return selection.toArray(new String[0]);
+ }
+
+ IWorkbenchWindow activeWindow = null;
+
+ // IWorkbenchWindowActionDelegate method
+ @Override
+ public void dispose() {
+ // nothing to do
+ }
+
+ // IWorkbenchWindowActionDelegate method
+ @Override
+ public void init(IWorkbenchWindow window) {
+ activeWindow = window;
+ }
+
+ @Override
+ public void run(IAction proxyAction) {
+ String[] files = getSelection();
+ if (files.length == 0) {
+ AWorkbench.popup("ERROR", "Can't retrieve file");
+ return;
+ }
+ AddIFileToTestManager.getOperation().addIFileToScriptsPage(files);
+ }
+
+ // IActionDelegate method
+ @Override
+ public void selectionChanged(IAction proxyAction, ISelection selection) {
+
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/actions/TMBugAction.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/actions/TMBugAction.java
new file mode 100644
index 000000000..07d1d2889
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/actions/TMBugAction.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.IEditorActionDelegate;
+import org.eclipse.ui.IEditorPart;
+
+public class TMBugAction implements IEditorActionDelegate {
+
+ @Override
+ public void run(IAction action) {
+
+ }
+
+ @Override
+ public void selectionChanged(IAction action, ISelection selection) {
+ }
+
+ @Override
+ public void setActiveEditor(IAction action, IEditorPart targetEditor) {
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/ConfigFactory.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/ConfigFactory.java
new file mode 100644
index 000000000..39b35919c
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/ConfigFactory.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.configuration;
+
+import java.util.logging.Level;
+import javax.xml.parsers.ParserConfigurationException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.ui.test.manager.configuration.pages.LoadScriptPage;
+import org.eclipse.osee.ote.ui.test.manager.configuration.pages.SaveScriptPage;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.pages.AdvancedPage;
+import org.eclipse.osee.ote.ui.test.manager.pages.ScriptPage;
+import org.eclipse.osee.ote.ui.test.manager.pages.TestManagerPage;
+
+public class ConfigFactory {
+ private static ConfigFactory instance = null;
+
+ private ConfigFactory() {
+ }
+
+ public static ConfigFactory getInstance() {
+ if (instance == null) {
+ instance = new ConfigFactory();
+ }
+ return instance;
+ }
+
+ public ILoadConfig getLoadConfigHandler(TestManagerPage tmPage) {
+ ILoadConfig toReturn = null;
+
+ if (tmPage instanceof ScriptPage) {
+ toReturn = new LoadScriptPage((ScriptPage) tmPage);
+ } else if (tmPage instanceof AdvancedPage) {
+ // toReturn = new AdvancedPageLoad(tmPage);
+ }
+ return toReturn;
+ }
+
+ public ISaveConfig getSaveConfigHandler(TestManagerPage tmPage) {
+ ISaveConfig toReturn = null;
+
+ if (tmPage instanceof ScriptPage) {
+ try {
+ toReturn = new SaveScriptPage((ScriptPage) tmPage);
+ } catch (ParserConfigurationException ex) {
+ OseeLog.log(TestManagerPlugin.class, Level.SEVERE, ex);
+ }
+ } else if (tmPage instanceof AdvancedPage) {
+ // toReturn = new AdvancedPageSave(tmPage);
+ }
+ return toReturn;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/ConfigFileHandler.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/ConfigFileHandler.java
new file mode 100644
index 000000000..75f4f489d
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/ConfigFileHandler.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.configuration;
+
+import java.io.File;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+public class ConfigFileHandler {
+
+ /**
+ * Writes the XML in sourceDoc to the test manager config file specified. If the destination file already exists, and
+ * contains the XML specified for the sourceDoc's root node, it will be replaced, otherwise it will be appended to
+ * the file. If the file does not exist, a new file will be created only containing the sourceDoc underneath a root
+ * TestManagerConfig node.
+ */
+ public static void writeFile(Document sourceDoc, String fileString) throws Exception {
+ Document doc;
+ File file = new File(fileString);
+ if (file.exists()) {
+ doc = writeSectionToFile(sourceDoc, file);
+ } else {
+ doc = Jaxp.newDocumentNamespaceAware();
+ Element root = doc.createElement("TestManagerConfig");
+ root.appendChild(doc.importNode(sourceDoc.getDocumentElement(), true));
+ doc.appendChild(root);
+ }
+ Jaxp.writeXmlDocument(doc, file, Jaxp.getPrettyFormat());
+ }
+
+ private static Document writeSectionToFile(Document docToAdd, File file) throws Exception {
+ Element nodeToAdd = docToAdd.getDocumentElement();
+ String configType = nodeToAdd.getNodeName();
+ Document doc = Jaxp.readXmlDocument(file);
+ Element root = doc.getDocumentElement();
+ Element configNode = Jaxp.getChild(root, configType);
+ if (configNode != null) {
+ root.removeChild(configNode);
+ root.appendChild(doc.importNode(nodeToAdd, true));
+ } else {
+ root.appendChild(doc.importNode(nodeToAdd, true));
+ }
+ return doc;
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/ILoadConfig.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/ILoadConfig.java
new file mode 100644
index 000000000..4ec313e56
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/ILoadConfig.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.configuration;
+
+import java.io.File;
+
+public abstract interface ILoadConfig {
+
+ public abstract void loadConfiguration(File toProcess) throws Exception;
+
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/ISaveConfig.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/ISaveConfig.java
new file mode 100644
index 000000000..08fb29c12
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/ISaveConfig.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.configuration;
+
+import java.io.File;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+public abstract interface ISaveConfig {
+
+ public abstract Element toXml(Document doc);
+
+ public abstract void saveConfig(File fileName) throws Exception;
+
+ public abstract void printXmlTree();
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/LoadConfigurationOperation.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/LoadConfigurationOperation.java
new file mode 100644
index 000000000..16c19cf68
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/LoadConfigurationOperation.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.configuration;
+
+import java.io.File;
+import org.eclipse.osee.framework.ui.plugin.OseeUiActivator;
+import org.eclipse.osee.ote.ui.test.manager.core.TestManagerEditor;
+import org.eclipse.osee.ote.ui.test.manager.pages.ScriptPage;
+import org.eclipse.osee.ote.ui.test.manager.pages.StatusWindowWidget;
+import org.eclipse.osee.ote.ui.test.manager.util.Dialogs;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class LoadConfigurationOperation {
+
+ private LoadConfigurationOperation() {
+ }
+
+ public static boolean load(TestManagerEditor testManager, File selectedFile) {
+ boolean isOk = updateFileStatus(testManager, selectedFile);
+ if (isOk != false) {
+ isOk &= reLoad(testManager);
+ }
+ return isOk;
+ }
+
+ private static boolean updateFileStatus(TestManagerEditor testManager, File selectedFile) {
+ boolean result = false;
+ StatusWindowWidget statusWindow = testManager.getPageManager().getScriptPage().getStatusWindow();
+ if (statusWindow != null) {
+ String filePath = selectedFile.getAbsolutePath();
+ statusWindow.setValue(ScriptPage.UpdateableLabel.CONFIGPATHLABEL.name(), filePath);
+ testManager.storeValue(testManager.configFileName, filePath);
+ statusWindow.refresh();
+ result = true;
+ }
+ return result;
+ }
+
+ public static boolean reLoad(TestManagerEditor testManager) {
+ boolean result = false;
+ String configFile = testManager.loadValue(testManager.configFileName);
+
+ ILoadConfig loadConfig =
+ ConfigFactory.getInstance().getLoadConfigHandler(testManager.getPageManager().getScriptPage());
+ try {
+ loadConfig.loadConfiguration(new File(configFile));
+ result = true;
+ } catch (Exception ex) {
+ Dialogs.popupError("Error Loading File",
+ String.format("Error loading file: [%s]\n%s", configFile, OseeUiActivator.getStackMessages(ex)));
+ }
+ return result;
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/LoadWidget.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/LoadWidget.java
new file mode 100644
index 000000000..af53a7c79
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/LoadWidget.java
@@ -0,0 +1,111 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.configuration;
+
+import java.io.File;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.ui.plugin.OseeUiActivator;
+import org.eclipse.osee.framework.ui.swt.ImageManager;
+import org.eclipse.osee.ote.ui.test.manager.OteTestManagerImage;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.pages.ScriptPage;
+import org.eclipse.osee.ote.ui.test.manager.pages.StatusWindowWidget;
+import org.eclipse.osee.ote.ui.test.manager.pages.TestManagerPage;
+import org.eclipse.osee.ote.ui.test.manager.util.Dialogs;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+
+public class LoadWidget {
+ public static final OseeUiActivator plugin = TestManagerPlugin.getInstance();
+ private StatusWindowWidget statusWindow;
+ private final TestManagerPage tmPage;
+
+ public LoadWidget(TestManagerPage tmPage) {
+ this.tmPage = tmPage;
+ this.statusWindow = null;
+ }
+
+ public void createToolItem(final ToolBar toolBar) {
+ final Shell shell = toolBar.getShell();
+
+ final Menu menu = new Menu(shell, SWT.POP_UP);
+
+ MenuItem menuItem = new MenuItem(menu, SWT.PUSH);
+ menuItem.setText("Load File...");
+ menuItem.setImage(ImageManager.getImage(OteTestManagerImage.FLDR_OBJ));
+ menuItem.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ String[] filterExtensions = {"*.xml"};
+ FileDialog fileDialog = new FileDialog(shell, SWT.OPEN);
+ fileDialog.setText("Load " + tmPage.getPageName() + "Page Settings From...");
+ fileDialog.setFilterExtensions(filterExtensions);
+
+ String defaultConfigDir = statusWindow.getValue(ScriptPage.UpdateableLabel.CONFIGPATHLABEL.name());
+ File dir = new File(defaultConfigDir);
+ if (dir.isFile() || dir.isDirectory()) {
+ fileDialog.setFilterPath(defaultConfigDir);
+ } else {
+ fileDialog.setFilterPath("Y:\\");
+ }
+ String result = fileDialog.open();
+
+ if (Strings.isValid(result)) {
+ File newFile = new File(result);
+ if (newFile.exists() && newFile.isFile()) {
+ LoadConfigurationOperation.load(tmPage.getTestManager(), newFile);
+ } else {
+ handleFileSelectError();
+ }
+ }
+ }
+ });
+
+ final ToolItem item = new ToolItem(toolBar, SWT.DROP_DOWN);
+ item.setImage(ImageManager.getImage(OteTestManagerImage.LOAD_CONFIG));
+ item.setToolTipText("Load current page configuration from file");
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ // If they clicked the arrow, we show the list
+ if (event.detail == SWT.ARROW) {
+ // Determine where to put the dropdown list
+ ToolItem item = (ToolItem) event.widget;
+ Rectangle rect = item.getBounds();
+ Point pt = item.getParent().toDisplay(new Point(rect.x, rect.y));
+ menu.setLocation(pt.x, pt.y + rect.height);
+ menu.setVisible(true);
+ } else {
+ LoadConfigurationOperation.reLoad(tmPage.getTestManager());
+ }
+ }
+ });
+ toolBar.pack();
+ }
+
+ public void setStatusLabel(StatusWindowWidget statusWindow) {
+ this.statusWindow = statusWindow;
+ }
+
+ private void handleFileSelectError() {
+ Dialogs.popupError("Load Configuration File", "Invalid Configuration File Selected.");
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/SaveWidget.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/SaveWidget.java
new file mode 100644
index 000000000..10f285473
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/SaveWidget.java
@@ -0,0 +1,140 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.configuration;
+
+import java.io.File;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.ui.plugin.OseeUiActivator;
+import org.eclipse.osee.framework.ui.swt.ImageManager;
+import org.eclipse.osee.ote.ui.test.manager.OteTestManagerImage;
+import org.eclipse.osee.ote.ui.test.manager.core.TestManagerEditor;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.pages.ScriptPage;
+import org.eclipse.osee.ote.ui.test.manager.pages.StatusWindowWidget;
+import org.eclipse.osee.ote.ui.test.manager.pages.TestManagerPage;
+import org.eclipse.osee.ote.ui.test.manager.util.Dialogs;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+
+public class SaveWidget {
+ public static final OseeUiActivator plugin = TestManagerPlugin.getInstance();
+ private StatusWindowWidget statusWindow;
+ private String selectedFile;
+ private final TestManagerPage tmPage;
+
+ public SaveWidget(TestManagerPage tmPage) {
+ this.tmPage = tmPage;
+ selectedFile = null;
+ statusWindow = null;
+ }
+
+ public void createToolItem(final ToolBar toolBar) {
+ final Shell shell = toolBar.getShell();
+
+ final Menu menu = new Menu(shell, SWT.POP_UP);
+
+ MenuItem saveAsMenuItem = new MenuItem(menu, SWT.PUSH);
+ saveAsMenuItem.setText("SaveAs...");
+ saveAsMenuItem.setImage(ImageManager.getImage(OteTestManagerImage.SAVEAS_EDIT));
+ saveAsMenuItem.addSelectionListener(new SelectionListener() {
+ @Override
+ public void widgetDefaultSelected(SelectionEvent e) {
+ widgetSelected(e);
+ }
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ String[] filterExtensions = {"*.xml"};
+ FileDialog fileDialog = new FileDialog(shell, SWT.SAVE);
+ fileDialog.setText("Save " + tmPage.getPageName() + "Page Settings To...");
+ fileDialog.setFilterExtensions(filterExtensions);
+
+ String defaultConfigDir = statusWindow.getValue(ScriptPage.UpdateableLabel.CONFIGPATHLABEL.name());
+
+ File dir = new File(defaultConfigDir);
+ if (dir.isFile() || dir.isDirectory()) {
+ fileDialog.setFilterPath(defaultConfigDir);
+ } else {
+ fileDialog.setFilterPath("Y:\\");
+ }
+
+ String result = fileDialog.open();
+
+ if (Strings.isValid(result)) {
+ selectedFile = result;
+ if (statusWindow != null) {
+ statusWindow.setValue(ScriptPage.UpdateableLabel.CONFIGPATHLABEL.name(), selectedFile);
+ TestManagerEditor tm = tmPage.getTestManager();
+ tm.storeValue(tm.configFileName, selectedFile);
+ statusWindow.refresh();
+ handleSaveEvent();
+ } else {
+ handleFileSelectError();
+ }
+ }
+ }
+ });
+
+ final ToolItem item = new ToolItem(toolBar, SWT.DROP_DOWN);
+ item.setImage(ImageManager.getImage(OteTestManagerImage.SAVE_EDIT));
+ item.setToolTipText("Saves current page configuration to file");
+ item.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent event) {
+ // If they clicked the arrow, we show the list
+ if (event.detail == SWT.ARROW) {
+ // Determine where to put the dropdown list
+ ToolItem item = (ToolItem) event.widget;
+ Rectangle rect = item.getBounds();
+ Point pt = item.getParent().toDisplay(new Point(rect.x, rect.y));
+ menu.setLocation(pt.x, pt.y + rect.height);
+ menu.setVisible(true);
+ } else {
+ handleSaveEvent();
+ }
+ }
+ });
+ toolBar.pack();
+ }
+
+ public void setStatusLabel(StatusWindowWidget statusWindow) {
+ this.statusWindow = statusWindow;
+ selectedFile = statusWindow.getValue(ScriptPage.UpdateableLabel.CONFIGPATHLABEL.name());
+ }
+
+ private void handleFileSelectError() {
+ Dialogs.popupError("Save Configuration File", "Invalid Configuration File Selected");
+ }
+
+ private void handleSaveEvent() {
+ TestManagerEditor tm = tmPage.getTestManager();
+ String configFile = tm.loadValue(tm.configFileName);
+
+ ISaveConfig saveConfig = ConfigFactory.getInstance().getSaveConfigHandler(tmPage);
+ try {
+
+ saveConfig.saveConfig(new File(configFile));
+ } catch (Exception ex) {
+ Dialogs.popupError("Error Saving File",
+ String.format("Error saving file: [%s]\n%s", configFile, OseeUiActivator.getStackMessages(ex)));
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/pages/LoadScriptPage.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/pages/LoadScriptPage.java
new file mode 100644
index 000000000..3546306d8
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/pages/LoadScriptPage.java
@@ -0,0 +1,162 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.configuration.pages;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Vector;
+import java.util.logging.Level;
+import javax.xml.parsers.ParserConfigurationException;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.swt.Displays;
+import org.eclipse.osee.ote.ui.test.manager.configuration.ILoadConfig;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.pages.ScriptPage;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ScriptTableViewer;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ScriptTask;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+public class LoadScriptPage implements ILoadConfig, ScriptPageConstants {
+
+ private final ScriptPage scriptPage;
+ private final ScriptTableViewer scriptTableViewer;
+ private final Vector<ScriptTask> scriptTasks;
+
+ public LoadScriptPage(ScriptPage tmPage) {
+ this.scriptPage = tmPage;
+ this.scriptTableViewer = scriptPage.getScriptTableViewer();
+ scriptTasks = new Vector<>();
+ }
+
+ @Override
+ public void loadConfiguration(final File toProcess) throws Exception {
+
+ Job job = new Job(String.format("Loading Script Run List [%s]", toProcess.getName())) {
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ Document doc;
+ try {
+ doc = Jaxp.readXmlDocument(toProcess);
+ parseConfig(doc);
+
+ Displays.pendInDisplayThread(new Runnable() {
+ @Override
+ public void run() {
+ scriptTableViewer.loadTasksFromList(scriptTasks);
+ scriptTableViewer.refresh();
+ debug(toProcess.getAbsolutePath());
+ }
+ });
+ } catch (ParserConfigurationException ex) {
+ OseeLog.log(TestManagerPlugin.class, Level.SEVERE, ex);
+ } catch (SAXException ex) {
+ OseeLog.log(TestManagerPlugin.class, Level.SEVERE, ex);
+ } catch (IOException ex) {
+ OseeLog.log(TestManagerPlugin.class, Level.SEVERE, ex);
+ }
+
+ return Status.OK_STATUS;
+ }
+
+ };
+ job.schedule();
+ }
+
+ private void debug(String val) {
+ OseeLog.log(TestManagerPlugin.class, Level.INFO, "Loaded From: " + val);
+ }
+
+ private void parseConfig(Document doc) {
+ NodeList nl = doc.getElementsByTagName(ScriptPageConstants.SCRIPTPAGE_CONFIG);
+
+ for (int i = 0; i < nl.getLength(); i++) {
+ Element element = (Element) nl.item(i);
+ parseMiscellaneousInfo(element);
+ parseScriptEntries(element);
+ }
+ }
+
+ private void parseMiscellaneousInfo(Element element) {
+ // Iterator iterator = node.getDescendants(new RegExElementFilter(
+ // Pattern.compile(ScriptPageConstants.SERVICES_ENTRY)));
+ // while (iterator.hasNext()) {
+ // Element child = (Element) iterator.next();
+ // TODO load miscellaneous information to page
+ // }
+ }
+
+ private class LoadScriptHelper implements Runnable {
+ private boolean stopLoading = false;
+ private final String path;
+
+ public LoadScriptHelper(String path) {
+ this.path = path;
+ }
+
+ @Override
+ public void run() {
+ if (!MessageDialog.openQuestion(
+ Displays.getActiveShell(),
+ "Script not found",
+ "The script " + path + " was not found in this workspace. Do you want to continue loading from the script list file. ")) {
+ stopLoading = true;
+ }
+ }
+
+ public boolean stop() {
+ return stopLoading;
+ }
+ }
+
+ private void parseScriptEntries(Element element) {
+ NodeList nl = element.getElementsByTagName(ScriptPageConstants.SCRIPT_ENTRY);
+ String alternatePath = scriptPage.getTestManager().getAlternateOutputDir();
+ for (int i = 0; i < nl.getLength(); i++) {
+ try{
+ Element child = (Element) nl.item(i);
+ final String path = Jaxp.getChildText(child, ScriptPageConstants.RAW_FILENAME_FIELD);
+ String runnable = Jaxp.getChildText(child, ScriptPageConstants.RUNNABLE_FIELD);
+ IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(path));
+ if (file.exists()) {
+ try {
+ ScriptTask task = new ScriptTask(file.getLocation().toString(), alternatePath);
+ task.setRun(Boolean.parseBoolean(runnable));
+ scriptTasks.add(task);
+ } catch (NullPointerException e) {
+ e.printStackTrace();
+ }
+ } else {
+ LoadScriptHelper helper = new LoadScriptHelper(path);
+ Displays.pendInDisplayThread(helper);
+ if (helper.stop()) {
+ break;
+ }
+ }
+ } catch (Throwable th){
+ OseeLog.log(TestManagerPlugin.class, Level.SEVERE, th);
+ }
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/pages/SaveScriptPage.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/pages/SaveScriptPage.java
new file mode 100644
index 000000000..b649352e5
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/pages/SaveScriptPage.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.configuration.pages;
+
+import java.io.File;
+import java.util.Vector;
+import java.util.logging.Level;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.TransformerException;
+import org.eclipse.osee.framework.jdk.core.persistence.Xmlizable;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.ui.test.manager.configuration.ConfigFileHandler;
+import org.eclipse.osee.ote.ui.test.manager.configuration.ISaveConfig;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.pages.ScriptPage;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ScriptTableViewer;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ScriptTask;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+public class SaveScriptPage implements ISaveConfig, ScriptPageConstants, Xmlizable {
+
+ private final Document doc;
+ private final Element root;
+ private final ScriptPage scriptPage;
+
+ public SaveScriptPage(ScriptPage tmPage) throws ParserConfigurationException {
+ this.scriptPage = tmPage;
+ doc = Jaxp.newDocumentNamespaceAware();
+ root = doc.createElement(ScriptPageConstants.SCRIPTPAGE_CONFIG);
+ doc.appendChild(root);
+ }
+
+ @Override
+ public void printXmlTree() {
+ OseeLog.log(TestManagerPlugin.class, Level.INFO, "Script Page Tree: ");
+ try {
+ OseeLog.log(TestManagerPlugin.class, Level.INFO, Jaxp.xmlToString(doc, true));
+ } catch (TransformerException ex) {
+ OseeLog.log(TestManagerPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ @Override
+ public void saveConfig(File fileName) throws Exception {
+ ScriptTableViewer scriptTable = scriptPage.getScriptTableViewer();
+ Vector<ScriptTask> tasks = scriptTable.getTasks();
+
+ root.appendChild(miscellaneousInfoToXml(doc));
+
+ for (ScriptTask task : tasks) {
+ root.appendChild(scriptTaskToXml(doc, task));
+ }
+
+ ConfigFileHandler.writeFile(doc, fileName.getAbsolutePath());
+ debug(fileName.getAbsolutePath());
+ }
+
+ @Override
+ public Element toXml(Document doc) {
+ return root;
+ }
+
+ private void debug(String val) {
+ OseeLog.log(TestManagerPlugin.class, Level.INFO, "Saved to: " + val);
+ }
+
+ private Element miscellaneousInfoToXml(Document doc) {
+ Element node = doc.createElement(ScriptPageConstants.SERVICES_ENTRY);
+ // TODO add preferred host
+ // TODO add ofp
+ // TODO add view if unit test config
+
+ return node;
+ }
+
+ private Element scriptTaskToXml(Document doc, ScriptTask task) {
+ Element taskRoot = doc.createElement(ScriptPageConstants.SCRIPT_ENTRY);
+ taskRoot.appendChild(Jaxp.createElement(doc, ScriptPageConstants.SCRIPT_NAME_FIELD, task.getName()));
+ taskRoot.appendChild(Jaxp.createElement(doc, ScriptPageConstants.RAW_FILENAME_FIELD,
+ task.getScriptModel().getWorkspaceRelativePath()));
+ taskRoot.appendChild(Jaxp.createElement(doc, ScriptPageConstants.RUNNABLE_FIELD,
+ Boolean.toString(task.isRunnable())));
+ return taskRoot;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/pages/ScriptPageConstants.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/pages/ScriptPageConstants.java
new file mode 100644
index 000000000..b988a2e3b
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/configuration/pages/ScriptPageConstants.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.configuration.pages;
+
+public interface ScriptPageConstants {
+
+ public static final String RAW_FILENAME_FIELD = "Path";
+ public static final String RESULT_FIELD = "Result";
+ public static final String RUNNABLE_FIELD = "IsRunnable";
+ public static final String SCRIPT_ENTRY = "ScriptEntry";
+ public static final String SCRIPT_NAME_FIELD = "Name";
+ public static final String SCRIPTPAGE_CONFIG = "ScriptPageConfig";
+ public static final String SERVICES_ENTRY = "ServicesSettings";
+ public static final String STATUS_FIELD = "Status";
+ public static final String CLASS_NAME = "ClassName";
+ public static final String CLASS_PATH = "ClassPath";
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/ScriptManager.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/ScriptManager.java
new file mode 100644
index 000000000..a06aa1c85
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/ScriptManager.java
@@ -0,0 +1,227 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.connection;
+
+import java.rmi.RemoteException;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeUnit;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.osee.framework.jdk.core.util.GUID;
+import org.eclipse.osee.framework.ui.swt.Displays;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironment;
+import org.eclipse.osee.ote.core.environment.status.TestComplete;
+import org.eclipse.osee.ote.service.ConnectionEvent;
+import org.eclipse.osee.ote.ui.test.manager.core.TestManagerEditor;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.jobs.StoreOutfileJob;
+import org.eclipse.osee.ote.ui.test.manager.models.OutputModelJob;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ScriptTask;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ScriptTask.ScriptStatusEnum;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ScriptTaskList;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public abstract class ScriptManager implements Runnable {
+ private final Map<String, ScriptTask> guidToScriptTask = new HashMap<>();
+ private TestManagerStatusListener statusListenerImpl;
+ private final TestManagerEditor testManager;
+
+ private volatile boolean updateScriptTable;
+ private StructuredViewer stv;
+ private ScheduledExecutorService updater;
+ private Set<ScriptTask> tasksToUpdate;
+ private ITestEnvironment connectedEnv;
+ private UUID sessionKey;
+
+ public ScriptManager(TestManagerEditor testManager, StructuredViewer stv) {
+ this.testManager = testManager;
+ this.stv = stv;
+
+ tasksToUpdate = new HashSet<>();
+ updater = Executors.newScheduledThreadPool(1, new ThreadFactory() {
+
+ @Override
+ public Thread newThread(Runnable r) {
+ Thread th = new Thread(r, "TM Table updater");
+ th.setDaemon(true);
+ return th;
+ }
+
+ });
+ updater.scheduleAtFixedRate(this, 0, 2000, TimeUnit.MILLISECONDS);
+ OutputModelJob.createSingleton(this);
+ }
+
+ public abstract void abortScript(boolean isBatchAbort) throws RemoteException;
+
+ public void notifyScriptDequeued(String className) {
+ ScriptTask task = guidToScriptTask.get(className);
+ if (task != null) {
+
+ ScriptTask value = guidToScriptTask.remove(task);
+ if(value == null){
+ System.out.println("did not dq");
+ }
+ }
+ }
+
+ /**
+ * This should be called after the environment is received in order to configure necessary items.
+ *
+ * @return null if successful, otherwise a string describing the error
+ */
+ public boolean connect(ConnectionEvent event) {
+
+ connectedEnv = event.getEnvironment();
+ sessionKey = event.getSessionKey();
+ try {
+ /*
+ * Setup the status listener for commands
+ */
+ statusListenerImpl = new TestManagerStatusListener(testManager, this);
+ return false;
+ } catch (Exception e) {
+ TestManagerPlugin.log(Level.SEVERE, "failed to connect script manager", e);
+ return true;
+ }
+ }
+
+ /**
+ * This should NOT be called directly, users should call the HostDataStore's disconnect.
+ */
+ public boolean disconnect(ConnectionEvent event) {
+ connectedEnv = null;
+ sessionKey = null;
+ guidToScriptTask.clear();
+ statusListenerImpl.unregisterEventListener();
+ return false;
+ }
+
+ public boolean onConnectionLost() {
+ connectedEnv = null;
+ sessionKey = null;
+ guidToScriptTask.clear();
+ statusListenerImpl.unregisterEventListener();
+ return false;
+ }
+
+ public ScriptTask getScriptTask(String name) {
+ ScriptTask t = guidToScriptTask.get(name);
+ if(t == null){
+ Object obj = stv.getInput();
+ if(obj instanceof ScriptTaskList){
+ ScriptTaskList stl = (ScriptTaskList)obj;
+ for(ScriptTask task:stl.getTasks()){
+ String clazz = task.getScriptModel().getTestClass();
+ if(clazz.equals(name)){
+ t = task;
+ break;
+ }
+ }
+ }
+ }
+ return t;
+ }
+
+ public void notifyScriptQueued(GUID theGUID, final ScriptTask script) {
+ guidToScriptTask.put(script.getScriptModel().getTestClass(), script);
+ script.setStatus(ScriptStatusEnum.IN_QUEUE);
+ Displays.ensureInDisplayThread(new Runnable() {
+ @Override
+ public void run() {
+ if (stv.getControl().isDisposed()) {
+ return;
+ }
+ stv.refresh(script);
+ }
+ });
+ }
+
+ public void updateScriptTableViewer(final ScriptTask task) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ @Override
+ public void run() {
+ if (stv.getControl().isDisposed()) {
+ return;
+ }
+ stv.refresh(task);
+ }
+ });
+ }
+
+ public void updateScriptTableViewerTimed(ScriptTask task) {
+ updateScriptTable = true;
+ synchronized (tasksToUpdate) {
+ tasksToUpdate.add(task);
+ }
+ }
+
+ @Override
+ public void run() {
+ if (updateScriptTable) {
+ updateScriptTable = false;
+ Displays.ensureInDisplayThread(new Runnable() {
+ @Override
+ public void run() {
+ synchronized (tasksToUpdate) {
+ if (stv.getControl().isDisposed()) {
+ return;
+ }
+ for (ScriptTask task : tasksToUpdate) {
+ stv.refresh(task);
+ }
+ tasksToUpdate.clear();
+ }
+ }
+ });
+ }
+ }
+
+ protected TestManagerEditor getTestManagerEditor() {
+ return testManager;
+ }
+
+ public abstract void addTestsToQueue(List<ScriptTask> scripts);
+
+ public void notifyScriptStart(final ScriptTask task) {
+ task.setStatus(ScriptStatusEnum.RUNNING);
+ Displays.ensureInDisplayThread(new Runnable() {
+ @Override
+ public void run() {
+ stv.refresh(task);
+ }
+ });
+ }
+
+ public void storeOutFile(ScriptTask task, TestComplete testComplete, boolean isValidRun) {
+ if (task.getScriptModel() != null) {
+ Job job =
+ new StoreOutfileJob(connectedEnv, testManager, this, task, testComplete.getClientOutfilePath(),
+ testComplete.getServerOutfilePath(), isValidRun);
+ StoreOutfileJob.scheduleJob(job);
+ }
+ }
+
+ protected UUID getSessionKey() {
+ return sessionKey;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/ScriptQueue.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/ScriptQueue.java
new file mode 100644
index 000000000..659dbf331
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/ScriptQueue.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.connection;
+
+import java.util.List;
+import org.eclipse.osee.ote.ui.test.manager.core.TestManagerEditor;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ScriptTask;
+
+public abstract class ScriptQueue implements Runnable {
+
+ private final List<ScriptTask> scripts;
+ private final TestManagerEditor testManager;
+
+ public ScriptQueue(List<ScriptTask> scripts, TestManagerEditor testManager) {
+ super();
+ this.scripts = scripts;
+ this.testManager = testManager;
+ }
+
+ @Override
+ public abstract void run();
+
+ protected List<ScriptTask> getScriptsToExecute() {
+ return scripts;
+ }
+
+ protected TestManagerEditor getTestManagerEditor() {
+ return testManager;
+ }
+
+ protected ScriptManager getScriptManager() {
+ return testManager.getPageManager().getScriptPage().getScriptManager();
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/StatusBoardRecieveEvent.done b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/StatusBoardRecieveEvent.done
new file mode 100644
index 000000000..9a76b02f4
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/StatusBoardRecieveEvent.done
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.connection;
+
+import java.util.concurrent.Callable;
+
+/**
+ * @author b1528444
+ *
+ */
+public abstract class StatusBoardRecieveEvent<V> implements Callable<V> {
+
+ private V data;
+
+ /**
+ *
+ */
+ public StatusBoardRecieveEvent(V data) {
+ this.data = data;
+ }
+
+ /* (non-Javadoc)
+ * @see java.util.concurrent.Callable#call()
+ */
+ @Override
+ public V call() throws Exception {
+ run();
+ return data;
+ }
+
+ public abstract void run();
+
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/StatusBoardRecieveEvent.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/StatusBoardRecieveEvent.java
new file mode 100644
index 000000000..abb197da4
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/StatusBoardRecieveEvent.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.connection;
+
+import java.util.concurrent.Callable;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public abstract class StatusBoardRecieveEvent<V> implements Callable<V> {
+
+ private final V data;
+
+ public StatusBoardRecieveEvent(V data) {
+ this.data = data;
+ }
+
+ @Override
+ public V call() throws Exception {
+ run();
+ return data;
+ }
+
+ public abstract void run();
+
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/TestManagerServiceStatusDataVisitor.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/TestManagerServiceStatusDataVisitor.java
new file mode 100644
index 000000000..85ab6ad86
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/TestManagerServiceStatusDataVisitor.java
@@ -0,0 +1,353 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.connection;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.IHealthStatus;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.swt.Displays;
+import org.eclipse.osee.ote.core.environment.status.CommandAdded;
+import org.eclipse.osee.ote.core.environment.status.CommandEndedStatusEnum;
+import org.eclipse.osee.ote.core.environment.status.CommandRemoved;
+import org.eclipse.osee.ote.core.environment.status.EnvironmentError;
+import org.eclipse.osee.ote.core.environment.status.IServiceStatusData;
+import org.eclipse.osee.ote.core.environment.status.IServiceStatusDataCommand;
+import org.eclipse.osee.ote.core.environment.status.IServiceStatusDataVisitor;
+import org.eclipse.osee.ote.core.environment.status.SequentialCommandBegan;
+import org.eclipse.osee.ote.core.environment.status.SequentialCommandEnded;
+import org.eclipse.osee.ote.core.environment.status.TestComplete;
+import org.eclipse.osee.ote.core.environment.status.TestPointUpdate;
+import org.eclipse.osee.ote.core.environment.status.TestServerCommandComplete;
+import org.eclipse.osee.ote.core.environment.status.TestStart;
+import org.eclipse.osee.ote.core.framework.command.TestCommandStatus;
+import org.eclipse.osee.ote.ui.test.manager.core.TestManagerEditor;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ScriptTask;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ScriptTask.ScriptStatusEnum;
+
+/**
+ * @author Roberto E. Escobar
+ */
+final class TestManagerServiceStatusDataVisitor implements IServiceStatusDataVisitor {
+
+ private final ScriptManager scriptManager;
+ private final TestManagerEditor testManagerEditor;
+ private final ExecutorService executor;
+
+ protected TestManagerServiceStatusDataVisitor(ScriptManager scriptManager, TestManagerEditor testManagerEditor) {
+ this.scriptManager = scriptManager;
+ this.testManagerEditor = testManagerEditor;
+ executor = Executors.newSingleThreadExecutor();
+
+ }
+
+ @Override
+ public void asCommandAdded(final CommandAdded commandAdded) {
+ executor.submit(new StatusBoardRecieveEvent<CommandAdded>(commandAdded) {
+ @Override
+ public void run() {
+ checkServiceStatusDataValid(commandAdded);
+ logServiceStatusData(commandAdded);
+ final ScriptTask task = getScriptTask(commandAdded);
+ if (task != null) {
+ task.setStatus(ScriptStatusEnum.IN_QUEUE);
+ scriptManager.updateScriptTableViewer(task);
+ }
+ }
+ });
+ logExecutorSize();
+ }
+
+ @Override
+ public void asCommandRemoved(final CommandRemoved commandRemoved) {
+ executor.submit(new StatusBoardRecieveEvent<CommandRemoved>(commandRemoved) {
+ @Override
+ public void run() {
+ checkServiceStatusDataValid(commandRemoved);
+ logServiceStatusData(commandRemoved);
+
+ final ScriptTask task = getScriptTask(commandRemoved);
+ if (task != null) {
+ CommandEndedStatusEnum cmdStat = commandRemoved.getReason();
+ if (cmdStat.equals(CommandEndedStatusEnum.ABORTED)) {
+ logOnConsole(Level.SEVERE, String.format("Test Aborted: [%s]", task.getName()));
+ task.setStatus(ScriptStatusEnum.CANCELLED);
+ }
+ notifyExecutionComplete(task);
+ scriptManager.updateScriptTableViewer(task);
+ }
+ }
+ });
+ logExecutorSize();
+ }
+
+ @Override
+ public void asEnvironmentError(final EnvironmentError environmentError) {
+ executor.submit(new StatusBoardRecieveEvent<EnvironmentError>(environmentError) {
+ @Override
+ public void run() {
+ checkServiceStatusDataValid(environmentError);
+
+ OseeLog.log(TestManagerPlugin.class, Level.SEVERE,
+ "errorOccured: " + environmentError.getErr().getMessage());
+ environmentError.getErr().printStackTrace();
+ final String msg = Lib.exceptionToString(environmentError.getErr());
+ logOnConsole(Level.SEVERE, String.format("Test Environment Error: [%s]", msg));
+ disconnectOnError(msg);
+ }
+ });
+ logExecutorSize();
+ }
+
+ @Override
+ public void asSequentialCommandBegan(final SequentialCommandBegan sequentialCommandBegan) {
+ executor.submit(new StatusBoardRecieveEvent<SequentialCommandBegan>(sequentialCommandBegan) {
+ @Override
+ public void run() {
+ checkServiceStatusDataValid(sequentialCommandBegan);
+ logServiceStatusData(sequentialCommandBegan);
+
+ final ScriptTask task = getScriptTask(sequentialCommandBegan);
+ if (task != null && task.getScriptModel() != null) {
+ OseeLog.logf(TestManagerPlugin.class, Level.INFO, "Script Task: [%s]", task);
+ logOnConsole(Level.INFO, String.format("Test Starting: [%s]", task.getName()));
+ task.setStatus(ScriptStatusEnum.RUNNING);
+ scriptManager.updateScriptTableViewer(task);
+ }
+ }
+ });
+ logExecutorSize();
+ }
+
+ @Override
+ public void asSequentialCommandEnded(final SequentialCommandEnded sequentialCommandEnded) {
+
+ executor.submit(new StatusBoardRecieveEvent<SequentialCommandEnded>(sequentialCommandEnded) {
+ @Override
+ public void run() {
+ checkServiceStatusDataValid(sequentialCommandEnded);
+ logServiceStatusData(sequentialCommandEnded);
+ final ScriptTask task = getScriptTask(sequentialCommandEnded);
+ if (task != null) {
+ OseeLog.logf(TestManagerPlugin.class, Level.INFO, "Script Task: [%s]", task);
+ CommandEndedStatusEnum cmdStat = sequentialCommandEnded.getStatus();
+ switch (cmdStat) {
+ case ABORTED:
+ logOnConsole(Level.SEVERE, String.format("Test Aborted: [%s]", task.getName()));
+ task.setStatus(ScriptStatusEnum.CANCELLED);
+ break;
+ case EXCEPTION:
+ task.setStatus(ScriptStatusEnum.CANCELLED);
+ logOnConsole(Level.SEVERE,
+ String.format("Test Aborted: [%s] - Exception Occurred", task.getName()));
+ break;
+ case HUNG:
+ task.setStatus(ScriptStatusEnum.CANCELLED);
+ logOnConsole(Level.SEVERE, String.format("Test Hung: [%s]", task.getName()));
+ break;
+ case RAN_TO_COMPLETION:
+ task.setStatus(ScriptStatusEnum.COMPLETE);
+ break;
+ default:
+ task.setStatus(ScriptStatusEnum.COMPLETE);
+ logOnConsole(Level.SEVERE, String.format("Test Ended Unexpectedly: [%s]", task.getName()));
+ break;
+ }
+ logOnConsole(Level.INFO, String.format("Test Completed: [%s]", task.getName()));
+ notifyExecutionComplete(task);
+ scriptManager.updateScriptTableViewer(task);
+ }
+ }
+ });
+ logExecutorSize();
+ }
+
+ @Override
+ public void asTestPointUpdate(final TestPointUpdate testPointUpdate) {
+ executor.submit(new StatusBoardRecieveEvent<TestPointUpdate>(testPointUpdate) {
+ @Override
+ public void run() {
+ checkServiceStatusDataValid(testPointUpdate);
+ final ScriptTask task = scriptManager.getScriptTask(testPointUpdate.getClassName());
+ if (task != null) {
+ task.getScriptModel().getOutputModel().setAborted(false);
+ task.getScriptModel().getOutputModel().setPassedTestPoints(testPointUpdate.getPass());
+ task.getScriptModel().getOutputModel().setFailedTestPoints(testPointUpdate.getFail());
+ scriptManager.updateScriptTableViewerTimed(task);
+ }
+// else {
+// OseeLog.log(TestManagerPlugin.class, Level.WARNING, "testPointsUpdated: task is null");
+// }
+ }
+ });
+ logExecutorSize();
+ }
+
+ private synchronized void logOnConsole(final Level level, final String msg) {
+ if (level.equals(Level.SEVERE)) {
+ TestManagerPlugin.getInstance().getOteConsoleService().writeError(msg);
+ } else {
+ TestManagerPlugin.getInstance().getOteConsoleService().write(msg);
+ }
+ }
+
+ private void checkServiceStatusDataValid(IServiceStatusData statusData) {
+ if (statusData == null) {
+ throw new IllegalArgumentException(String.format("Error [%s] was null.", IServiceStatusData.class.getName()));
+ }
+ }
+
+ private void disconnectOnError(final String cause) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ @Override
+ public void run() {
+ TestManagerPlugin.getInstance().getOteConsoleService().writeError(cause);
+ }
+ });
+ }
+
+ private void logServiceStatusData(IServiceStatusDataCommand statusData) {
+ OseeLog.logf(TestManagerPlugin.class, Level.FINE,
+ "%s: %s ", statusData.getClass().getName(), statusData.getDescription());
+ }
+
+ private ScriptTask getScriptTask(IServiceStatusDataCommand statusData) {
+ return scriptManager.getScriptTask(statusData.getDescription().getDescription());
+ }
+
+ private void notifyExecutionComplete(ScriptTask scriptTask) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ @Override
+ public void run() {
+ testManagerEditor.executionCompleted();
+ }
+ });
+ logExecutorSize();
+ }
+
+ @Override
+ public void asTestServerCommandComplete(final TestServerCommandComplete end) {
+
+ executor.submit(new StatusBoardRecieveEvent<TestServerCommandComplete>(end) {
+ @Override
+ public void run() {
+ try {
+ TestCommandStatus result = end.getCmdStatus();
+ Throwable th = end.getThrowable();
+ if (th != null && result != null) {
+ OseeLog.log(TestManagerPlugin.class, Level.INFO, String.format("TestServer Command Completed [%s]", result.name()), th);
+ } else if ( result != null){
+ OseeLog.log(TestManagerPlugin.class, Level.INFO, String.format("TestServer Command Completed [%s]", result.name()));
+ }
+ } catch (Exception ex) {
+ OseeLog.log(TestManagerPlugin.class, Level.SEVERE, ex);
+ } finally {
+ notifyExecutionComplete(null);
+ }
+ }
+ });
+ logExecutorSize();
+ }
+
+ @Override
+ public void asTestComplete(final TestComplete testComplete) {
+ executor.submit(new StatusBoardRecieveEvent<TestComplete>(testComplete) {
+ @Override
+ public void run() {
+ ScriptTask task = scriptManager.getScriptTask(testComplete.getClassName());
+ if (task != null) {
+ OseeLog.logf(TestManagerPlugin.class, Level.INFO, "Script Task: [%s]", task);
+ boolean isValidRun = true;
+ CommandEndedStatusEnum cmdStat = testComplete.getStatus();
+ switch (cmdStat) {
+ case ABORTED:
+ logOnConsole(Level.SEVERE, String.format("Test Aborted: [%s]", task.getName()));
+ for (IHealthStatus status : testComplete.getHealthStatus()) {
+ String msg;
+ if (status.getException() != null) {
+ msg = Lib.exceptionToString(status.getException());
+ } else {
+ msg = status.getMessage();
+ }
+ logOnConsole(status.getLevel(), msg);
+ }
+ task.setStatus(ScriptStatusEnum.CANCELLED);
+ break;
+ case EXCEPTION:
+ task.setStatus(ScriptStatusEnum.CANCELLED);
+ logOnConsole(Level.SEVERE,
+ String.format("Test Exception: [%s] - Exception Occurred", task.getName()));
+ StringBuilder sb = new StringBuilder();
+ try {
+ for (IHealthStatus status : testComplete.getHealthStatus()) {
+ if (status.getException() != null) {
+ sb.append(Lib.exceptionToString(status.getException()));
+ } else if (status.getLevel().intValue() >= Level.SEVERE.intValue()) {
+ sb.append(status.getMessage());
+ }
+ }
+ logOnConsole(Level.SEVERE, sb.toString());
+ } catch (Throwable th) {
+ th.printStackTrace();
+ }
+ break;
+ case HUNG:
+ task.setStatus(ScriptStatusEnum.CANCELLED);
+ logOnConsole(Level.SEVERE, String.format("Test Hung: [%s]", task.getName()));
+ break;
+ case RAN_TO_COMPLETION:
+ task.setStatus(ScriptStatusEnum.COMPLETE);
+ break;
+ default:
+ task.setStatus(ScriptStatusEnum.COMPLETE);
+ logOnConsole(Level.SEVERE, String.format("Test Ended Unexpectedly: [%s]", task.getName()));
+ isValidRun = false;
+ break;
+ }
+ scriptManager.storeOutFile(task, testComplete, isValidRun);
+ logOnConsole(Level.INFO, String.format("Test Completed: [%s]", task.getName()));
+
+ scriptManager.notifyScriptDequeued(testComplete.getClassName());
+ scriptManager.updateScriptTableViewer(task);
+
+ }
+ }
+ });
+ logExecutorSize();
+ }
+
+ @Override
+ public void asTestStart(final TestStart testStart) {
+ executor.submit(new StatusBoardRecieveEvent<TestStart>(testStart) {
+ @Override
+ public void run() {
+ ScriptTask task = scriptManager.getScriptTask(testStart.getTestClassName());
+ if (task != null) {
+ scriptManager.notifyScriptStart(task);
+ logOnConsole(Level.INFO, String.format("Test Started: [%s]", task.getName()));
+ }
+
+ }
+ });
+ logExecutorSize();
+ }
+
+ private void logExecutorSize() {
+ if (executor instanceof ThreadPoolExecutor) {
+ OseeLog.logf(TestManagerServiceStatusDataVisitor.class, Level.FINE,
+ "Current StatusBoard Executor Size [%d]", ((ThreadPoolExecutor) executor).getQueue().size());
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/TestManagerStatusListener.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/TestManagerStatusListener.java
new file mode 100644
index 000000000..d3a79789f
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/connection/TestManagerStatusListener.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.connection;
+
+import java.io.IOException;
+import java.util.Hashtable;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.environment.status.IServiceStatusData;
+import org.eclipse.osee.ote.core.environment.status.msg.CommandAddedMessage;
+import org.eclipse.osee.ote.core.environment.status.msg.CommandRemovedMessage;
+import org.eclipse.osee.ote.core.environment.status.msg.EnvErrorMessage;
+import org.eclipse.osee.ote.core.environment.status.msg.SequentialCommandBeganMessage;
+import org.eclipse.osee.ote.core.environment.status.msg.SequentialCommandEndedMessage;
+import org.eclipse.osee.ote.core.environment.status.msg.TestCompleteMessage;
+import org.eclipse.osee.ote.core.environment.status.msg.TestPointUpdateMessage;
+import org.eclipse.osee.ote.core.environment.status.msg.TestServerCommandCompleteMessage;
+import org.eclipse.osee.ote.core.environment.status.msg.TestStartMessage;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.ui.test.manager.core.TestManagerEditor;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventHandler;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public final class TestManagerStatusListener implements EventHandler {
+
+ private final TestManagerServiceStatusDataVisitor testManagerServiceDataVisitor;
+ private ServiceRegistration<?> eventReference;
+
+
+ public TestManagerStatusListener(TestManagerEditor testManagerEditor, ScriptManager userEnvironment) {
+ this.testManagerServiceDataVisitor = new TestManagerServiceStatusDataVisitor(userEnvironment, testManagerEditor);
+ Hashtable<String, Object> properties = new Hashtable<>();
+ properties.put("event.topics", "ote/status/*");
+ eventReference = FrameworkUtil.getBundle(getClass()).getBundleContext().registerService(EventHandler.class.getName(), this, properties);
+ }
+
+ @Override
+ public void handleEvent(Event event) {
+ try {
+ IServiceStatusData statusData = null;
+ if(event.getTopic().equals(CommandAddedMessage.EVENT)){
+ CommandAddedMessage message = new CommandAddedMessage(OteEventMessageUtil.getBytes(event));
+ statusData = message.getObject();
+ } else if(event.getTopic().equals(CommandRemovedMessage.EVENT)){
+ CommandRemovedMessage message = new CommandRemovedMessage(OteEventMessageUtil.getBytes(event));
+ statusData = message.getObject();
+ } else if(event.getTopic().equals(EnvErrorMessage.EVENT)){
+ EnvErrorMessage message = new EnvErrorMessage(OteEventMessageUtil.getBytes(event));
+ statusData = message.getObject();
+ } else if(event.getTopic().equals(SequentialCommandBeganMessage.EVENT)){
+ SequentialCommandBeganMessage message = new SequentialCommandBeganMessage(OteEventMessageUtil.getBytes(event));
+ statusData = message.getObject();
+ } else if(event.getTopic().equals(SequentialCommandEndedMessage.EVENT)){
+ SequentialCommandEndedMessage message = new SequentialCommandEndedMessage(OteEventMessageUtil.getBytes(event));
+ statusData = message.getObject();
+ } else if(event.getTopic().equals(TestCompleteMessage.EVENT)){
+ TestCompleteMessage message = new TestCompleteMessage(OteEventMessageUtil.getBytes(event));
+ statusData = message.getObject();
+ } else if(event.getTopic().equals(TestPointUpdateMessage.EVENT)){
+ TestPointUpdateMessage message = new TestPointUpdateMessage(OteEventMessageUtil.getBytes(event));
+ statusData = message.getObject();
+ } else if(event.getTopic().equals(TestServerCommandCompleteMessage.EVENT)){
+ TestServerCommandCompleteMessage message = new TestServerCommandCompleteMessage(OteEventMessageUtil.getBytes(event));
+ statusData = message.getObject();
+ } else if(event.getTopic().equals(TestStartMessage.EVENT)){
+ TestStartMessage message = new TestStartMessage(OteEventMessageUtil.getBytes(event));
+ statusData = message.getObject();
+ }
+ if(statusData != null){
+ statusData.accept(testManagerServiceDataVisitor);
+ }
+ } catch (IOException e) {
+ OseeLog.log(getClass(), Level.SEVERE, event.getTopic(), e);
+ } catch (ClassNotFoundException e) {
+ OseeLog.log(getClass(), Level.SEVERE, event.getTopic(), e);
+ }
+
+ }
+
+ public void unregisterEventListener() {
+ eventReference.unregister();
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/ITestManagerModel.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/ITestManagerModel.java
new file mode 100644
index 000000000..f78896929
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/ITestManagerModel.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.core;
+
+import org.eclipse.osee.framework.jdk.core.type.Pair;
+
+public interface ITestManagerModel {
+
+ public abstract boolean hasParseExceptions();
+
+ public abstract Pair<Integer, Integer> getParseErrorRange();
+
+ public abstract String getParseError();
+
+ public abstract boolean setFromXml(String xmlText);
+
+ public abstract String getRawXml();
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/PageManager.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/PageManager.java
new file mode 100644
index 000000000..92487589e
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/PageManager.java
@@ -0,0 +1,171 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.core;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.ote.service.ConnectionEvent;
+import org.eclipse.osee.ote.ui.test.manager.ITestManagerFactory;
+import org.eclipse.osee.ote.ui.test.manager.pages.AdvancedPage;
+import org.eclipse.osee.ote.ui.test.manager.pages.HostPage;
+import org.eclipse.osee.ote.ui.test.manager.pages.ScriptPage;
+import org.eclipse.osee.ote.ui.test.manager.pages.TestManagerPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class PageManager {
+
+ protected AdvancedPage advancedPage;
+ protected HostPage hostPage;
+ protected ScriptPage scriptPage;
+ private final List<TestManagerPage> pages;
+
+ private final TestManagerEditor testManager;
+ private final ITestManagerFactory factory;
+
+ public PageManager(ITestManagerFactory factory, TestManagerEditor testManager) {
+ this.factory = factory;
+ this.testManager = testManager;
+ this.pages = new ArrayList<>();
+ }
+
+ protected void createPages(Composite parent) {
+ hostPage = new HostPage(parent, SWT.NONE, testManager);
+ registerPage(hostPage, false);
+
+ scriptPage = this.factory.getScriptPageNewInstance(parent, SWT.NONE, testManager);
+ scriptPage.createPage();
+ registerPage(scriptPage, true);
+
+ advancedPage = this.factory.getAdvancedPageNewInstance(parent, SWT.NONE, testManager);
+ advancedPage.createPage();
+ registerPage(advancedPage, false);
+
+ }
+
+ private void registerPage(TestManagerPage page, boolean isScriptPage) {
+ pages.add(page);
+ testManager.registerPage(testManager.addPage(page), page.getPageName(), isScriptPage);
+ }
+
+ /**
+ * Dispose pages
+ */
+ public void dispose() {
+ for (TestManagerPage page : pages) {
+ page.dispose();
+ }
+ pages.clear();
+ }
+
+ /**
+ * Save page settings to storage
+ */
+ public void save() {
+ for (TestManagerPage page : pages) {
+ page.saveData();
+ }
+ }
+
+ /**
+ * Restore page from stored settings
+ */
+ public void restore() {
+ for (TestManagerPage page : pages) {
+ page.restoreData();
+ }
+ }
+
+ /**
+ * @return the advancedPage
+ */
+ public AdvancedPage getAdvancedPage() {
+ return advancedPage;
+ }
+
+ /**
+ * @return the hostPage
+ */
+ public HostPage getHostPage() {
+ return hostPage;
+ }
+
+ /**
+ * @return the scriptPage
+ */
+ public ScriptPage getScriptPage() {
+ return scriptPage;
+ }
+
+ /**
+ * Checks that all page setting are set correctly for a script run
+ *
+ * @return <b>True</b> if page setting are valid for script run
+ */
+ public boolean areSettingsValidForRun() {
+ boolean result = true;
+ for (TestManagerPage page : pages) {
+ result &= page.areSettingsValidForRun();
+ }
+ return result;
+ }
+
+ /**
+ * Gets page error message
+ *
+ * @return The Page error message
+ */
+ public String getErrorMessage() {
+ StringBuilder builder = new StringBuilder();
+ for (TestManagerPage page : pages) {
+ String pageMessage = page.getErrorMessage();
+ if (Strings.isValid(pageMessage)) {
+ if (builder.length() > 0) {
+ builder.append("\n");
+ }
+ builder.append(page.getPageName());
+ builder.append(" Page:\n");
+ builder.append(pageMessage);
+ builder.append("\n");
+ }
+ }
+ return builder.toString();
+ }
+
+ public boolean onPostConnect(ConnectionEvent event) {
+ boolean problemEncountered = false;
+ for (TestManagerPage page : pages) {
+ problemEncountered |= page.onConnection(event);
+ }
+ return problemEncountered;
+ }
+
+ public boolean onPreDisconnect(ConnectionEvent event) {
+ boolean problemEncountered = false;
+ for (TestManagerPage page : pages) {
+ problemEncountered |= page.onDisconnect(event);
+ }
+ return problemEncountered;
+ }
+
+ public boolean onConnectionLost() {
+ boolean problemEncountered = false;
+ for (TestManagerPage page : pages) {
+ problemEncountered |= page.onConnectionLost();
+ }
+ return problemEncountered;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerEditor.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerEditor.java
new file mode 100644
index 000000000..6619d219e
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerEditor.java
@@ -0,0 +1,593 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.core;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.logging.Level;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.QualifiedName;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.framework.jdk.core.type.Pair;
+import org.eclipse.osee.framework.jdk.core.type.PropertyStore;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.OseeData;
+import org.eclipse.osee.framework.ui.swt.Displays;
+import org.eclipse.osee.framework.ui.swt.ImageManager;
+import org.eclipse.osee.ote.core.environment.interfaces.IHostTestEnvironment;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironment;
+import org.eclipse.osee.ote.service.ConnectionEvent;
+import org.eclipse.osee.ote.service.ITestConnectionListener;
+import org.eclipse.osee.ote.ui.test.manager.ITestManagerFactory;
+import org.eclipse.osee.ote.ui.test.manager.OteTestManagerImage;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.pages.contributions.TestManagerStorageKeys;
+import org.eclipse.osee.ote.ui.test.manager.util.ClassServerInst;
+import org.eclipse.osgi.service.datalocation.Location;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.editors.text.TextEditor;
+import org.eclipse.ui.part.MultiPageEditorPart;
+
+/**
+ * Resource Test Manager Editor Pages:
+ * <ul>
+ * <li>Overview Page
+ * <li>Target Page
+ * <li>Scripts Page
+ * <li>Advanced Page
+ * <li>Source Page
+ * </ul>
+ */
+public abstract class TestManagerEditor extends MultiPageEditorPart implements ITestConnectionListener {
+ private static final Image errorImage = ImageManager.getImage(OteTestManagerImage.ERROR);
+ public static final String namespace = "org.eclipse.osee.ote.ui.test.manager.editors.TestManagerEditor";
+
+ public final QualifiedName clearCaseViewName = new QualifiedName(namespace, "CLEARCASEVIEW");
+ public final QualifiedName configFileName = new QualifiedName(namespace, "CONFIGFILENAME");
+ public final QualifiedName ofpQualName = new QualifiedName(namespace, "OFP");
+ public final QualifiedName scriptsQualName = new QualifiedName(namespace, "SCRIPTS");
+
+ private boolean fileIsDirty = false;
+
+ private boolean fileWasSaved = false;
+
+ private int lastPageIndex = 0;
+
+ private final ITestManagerModel model;
+
+ private boolean reloadSourcePage = false;
+
+ private int scriptPageIndex = 1;
+
+ private TextEditor sourceEditor;
+
+ private int sourcePage;
+
+ private final ITestManagerFactory testManagerFactory;
+
+ private IFile thisIFile = null;
+
+ private final IPropertyStore propertyStore;
+
+ private final PageManager pageManager;
+
+ private ITestEnvironment connectedEnv = null;
+ private IServiceConnector connector = null;
+ private IHostTestEnvironment connectedHost;
+
+ public TestManagerEditor(final ITestManagerFactory testManagerFactory, ITestManagerModel model) {
+ super();
+
+ this.testManagerFactory = testManagerFactory;
+ this.pageManager = new PageManager(testManagerFactory, this);
+ this.model = model;
+ this.propertyStore = new PropertyStore(testManagerFactory.getClass().getSimpleName());
+ }
+
+ public void activateScriptsPage() {
+ setActivePage(scriptPageIndex);
+ }
+
+
+ public void addFile(String fullPath) {
+ pageManager.getScriptPage().addFile(fullPath);
+ }
+
+ @Override
+ public void dispose() {
+ super.dispose();
+ TestManagerPlugin.getInstance().getOteClientService().removeConnectionListener(this);
+ try {
+ pageManager.dispose();
+ } catch (Throwable t) {
+ TestManagerPlugin.log(Level.SEVERE, "exception while disposing test manager", t);
+ }
+ }
+
+ /**
+ * Saves the multi-page editor's document.
+ */
+ @Override
+ public void doSave(IProgressMonitor monitor) {
+ if (getActivePage() != sourcePage) {
+ pageSourceLoad();
+ }
+ if(isDirty()){
+ getEditor(sourcePage).doSave(monitor);
+ }
+ fileIsDirty = false;
+ fileWasSaved = true;
+ doSave();
+ firePropertyChange(PROP_DIRTY);
+ }
+
+ /**
+ * Saves the multi-page editor's document as another file. Also updates the text for page 0's tab, and updates this
+ * multi-page editor's input to correspond to the nested editor's.
+ */
+ @Override
+ public void doSaveAs() {
+ if (getActivePage() != sourcePage) {
+ pageSourceLoad();
+ }
+ IEditorPart editor = getEditor(sourcePage);
+ editor.doSaveAs();
+ setPageText(sourcePage, "Source");
+ setInput(editor.getEditorInput());
+ doSave();
+ }
+
+ protected void registerPage(int pageNumber, String pageName, boolean isScriptPage) {
+ setPageText(pageNumber, pageName);
+ if(isScriptPage){
+ scriptPageIndex = pageNumber;
+ }
+ }
+
+ public void executionCompleted() {
+ pageManager.getScriptPage().onScriptRunning(false);
+ }
+
+ public void fireSaveNeeded() {
+ fileIsDirty = true;
+ firePropertyChange(PROP_DIRTY);
+ }
+
+ public String getAlternateOutputDir() {
+ String scriptOutput = "";
+
+ IPropertyStore propertyStore = getPropertyStore();
+ scriptOutput = propertyStore.get(TestManagerStorageKeys.SCRIPT_OUTPUT_DIRECTORY_KEY);
+ if (scriptOutput == null) {
+ scriptOutput = "";
+ // TODO: Escobar
+ // try {
+ // IEditorInput coreinput = getEditorInput();
+ // if (coreinput instanceof IFileEditorInput) {
+ // scriptOutput =
+ // thisIFile.getPersistentProperty(scriptOutputQualName);
+ // } else if (coreinput instanceof TestManagerInput) {
+ // TestManagerInput input = (TestManagerInput) getEditorInput();
+ // scriptOutput =
+ // input.getValue(scriptOutputQualName.getLocalName());
+ // }
+ //
+ // scriptOutput =
+ // thisIFile.getPersistentProperty(scriptOutputQualName);
+ // } catch (CoreException e) {
+ // e.printStackTrace();
+ // }
+ }
+ return scriptOutput;
+ }
+
+ public String getDefaultConfigPath() {
+ Location user = Platform.getUserLocation();
+ String path = user.getURL().getPath();
+ File file = new File(path + File.separator + "org.eclipse.osee.ote.ui.test.manager");
+ file.mkdirs();
+ file =
+ new File(
+ path + File.separator + "org.eclipse.osee.ote.ui.test.manager" + File.separator + this.getClass().getName() + ".scriptConfig.xml");
+ file.getParentFile().mkdirs();
+ return file.getAbsolutePath();
+ }
+
+ /**
+ * @return Returns the model.
+ */
+ public ITestManagerModel getModel() {
+ return model;
+ }
+
+ public String getName() {
+ return this.getTitle();
+ }
+
+ public ClassServerInst getScriptClassServer() {
+ return ClassServerInst.getInstance();
+ }
+
+ public ITestManagerFactory getTestManagerFactory() {
+ return testManagerFactory;
+ }
+
+ @Override
+ public void init(IEditorSite site, IEditorInput editorInput) throws PartInitException {
+ if (!(editorInput instanceof IFileEditorInput || editorInput instanceof TestManagerInput || editorInput instanceof IEditorInput)) {
+ throw new PartInitException("Invalid Input: Must be IFileEditorInput");
+ }
+ super.init(site, editorInput);
+ }
+
+ @Override
+ public boolean isDirty() {
+ if (super.isDirty()) {
+ return true;
+ }
+ return fileIsDirty;
+ }
+
+ @Override
+ public boolean isSaveAsAllowed() {
+ return true;
+ }
+
+ /**
+ * Retrieves the value for the key. See <code>storeValue</code>. If the key could not be found, an empty string is
+ * returned.
+ *
+ * @param key The <code>QualifiedName</code> whose value is to be retrieved.
+ * @return The value of key, or an empty string if the key does not exist.
+ */
+ public String loadValue(QualifiedName key) {
+ TestManagerPlugin.log(Level.INFO, "loadValue: " + key.getQualifier());
+ try {
+ IEditorInput coreinput = getEditorInput();
+ if (coreinput instanceof IFileEditorInput) {
+ return thisIFile.getPersistentProperty(key);
+ } else if (coreinput instanceof TestManagerInput) {
+ TestManagerInput input = (TestManagerInput) getEditorInput();
+ return input.getValue(key.getLocalName());
+ }
+ } catch (CoreException ex) {
+ TestManagerPlugin.log(Level.SEVERE, "Can't get value: " + ex);
+ }
+ return "";
+ }
+
+ public void setPageError(int page, boolean set) {
+ if (set) {
+ setPageImage(page, errorImage);
+ } else {
+ setPageImage(page, null);
+ }
+ }
+
+ /**
+ * Stores the value for the key. The key should be one of the publicly available <code>QualifiedName</code>'s in
+ * <code>this</code>.
+ *
+ * @param key The <code>QualifiedName</code> associated with the value to be stored
+ * @param value What will be stored under the key.
+ */
+ public void storeValue(QualifiedName key, String value) {
+ TestManagerPlugin.log(Level.INFO, "storeValue: " + key.getQualifier());
+ try {
+ IEditorInput coreinput = getEditorInput();
+ if (coreinput instanceof IFileEditorInput) {
+ thisIFile.setPersistentProperty(key, value);
+ } else if (coreinput instanceof TestManagerInput) {
+ TestManagerInput input = (TestManagerInput) getEditorInput();
+ input.storeValue(key.getLocalName(), value);
+ }
+ } catch (Exception ex) {
+ TestManagerPlugin.log(Level.SEVERE, "Can't set value: " + ex);
+ }
+ }
+
+ private void pageSourceCheck() {
+ setPageError(sourcePage, model.hasParseExceptions());
+ }
+
+ private void readXmlData() {
+ TestManagerPlugin.log(Level.INFO, "readXmlData");
+ IEditorInput coreinput = getEditorInput();
+ String xmlText = "";
+ if (coreinput instanceof IFileEditorInput) {
+ IFileEditorInput input = (IFileEditorInput) getEditorInput();
+ thisIFile = input.getFile();
+ try {
+ thisIFile.refreshLocal(IResource.DEPTH_ZERO, null);
+ } catch (CoreException e) {
+ e.printStackTrace();
+ }
+ String name = thisIFile.getName();
+ this.setPartName(name);
+ if (thisIFile != null) {
+ try {
+ xmlText = Lib.inputStreamToString(thisIFile.getContents());
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ } else {
+ TestManagerPlugin.log(Level.SEVERE, "Can't open xml file!");
+ }
+ } else if (coreinput instanceof TestManagerInput) {
+ TestManagerInput input = (TestManagerInput) getEditorInput();
+ String name = "TestManager";
+ this.setPartName(name);
+ xmlText = input.getDefaultXML();
+ }
+ model.setFromXml(xmlText);
+ }
+
+ /**
+ * Creates the pages of the multi-page editor.
+ */
+ @Override
+ protected void createPages() {
+ readXmlData();
+
+ pageManager.createPages(getContainer());
+ pageSourceCreate();
+
+ fileIsDirty = false;
+ reloadSourcePage = false;
+ pageSourceCheck();
+ restoreSettings();
+
+ // If parse errors, send to sourcePage and set error on page
+ if (model.hasParseExceptions()) {
+ if (sourceEditor == null) {
+ pageSourceCreate();
+ }
+ handleSourceEditorError();
+ }
+ fileIsDirty = false;
+ firePropertyChange(PROP_DIRTY);
+ TestManagerPlugin.getInstance().getOteClientService().addConnectionListener(this);
+ }
+
+ protected void handleSelection() {
+ fireSaveNeeded();
+ reloadSourcePage = true;
+ }
+
+ /**
+ * reloads pages as necessary
+ */
+ @Override
+ protected void pageChange(int newPageIndex) {
+ // NOTE: Hosts page will be updated continuously, even it if it is not
+ // the current page.
+ // so it is unnecessary to update it on pageChange.
+
+ super.pageChange(newPageIndex);
+ if (newPageIndex == sourcePage) {
+ pageSourceLoad();
+ } else {
+ if (sourceEditor == null) {
+ return;
+ }
+ String newXml = sourceEditor.getDocumentProvider().getDocument(sourceEditor.getEditorInput()).get();
+ if (sourceEditor.isDirty() || fileWasSaved) {
+ fileWasSaved = false;
+ // If we just came from sourcePage, re-parse
+ if (lastPageIndex == sourcePage) {
+ // if parse error, goto source and error
+ if (!model.setFromXml(newXml)) {
+ handleSourceEditorError();
+ return;
+ }
+ setPageError(sourcePage, false);
+ }
+ }
+ }
+ doSave(null);
+ lastPageIndex = newPageIndex;
+ }
+
+ private void handleSourceEditorError() {
+ if (model.hasParseExceptions()) {
+ try {
+ setActivePage(sourcePage);
+ pageSourceCheck();
+ MessageDialog.openError(getSite().getShell(), "Source Page Error",
+ "Error parsing Source page\n "+model.getParseError());
+ Pair<Integer, Integer> parseErrorRange = model.getParseErrorRange();
+ sourceEditor.setHighlightRange(parseErrorRange.getFirst(), parseErrorRange.getSecond(), false);
+ sourceEditor.getSelectionProvider().setSelection(new TextSelection(parseErrorRange.getFirst(), parseErrorRange.getSecond()));
+ } catch (Throwable th) {}
+ }
+ }
+
+ public void updateFromTestManagerModel() {
+ IDocument doc = sourceEditor.getDocumentProvider().getDocument(sourceEditor.getEditorInput());
+ if (!doc.get().equals(model.getRawXml())) {
+ doc.set(model.getRawXml());
+ try {
+ sourceEditor.getDocumentProvider().saveDocument(new NullProgressMonitor(), null, doc, true);
+ } catch (CoreException e) {
+ OseeLog.log(getClass(), Level.SEVERE, e);
+ }
+ }
+ }
+
+ void pageSourceCreate() {
+ try {
+ if (getEditorInput() instanceof IFileEditorInput) {
+ sourceEditor = new TextEditor();
+ int index = addPage(sourceEditor, getEditorInput());
+ sourcePage = index;
+ setPageText(sourcePage, "Source");
+ }
+ } catch (PartInitException e) {
+ TestManagerPlugin.log(Level.SEVERE, "Error creating nested text editor", e);
+ ErrorDialog.openError(getSite().getShell(), "Error creating nested text editor", null, e.getStatus());
+ }
+ }
+
+ void pageSourceLoad() {
+ if (reloadSourcePage) {
+ sourceEditor.getDocumentProvider().getDocument(sourceEditor.getEditorInput()).set(model.getRawXml());
+ reloadSourcePage = false;
+ }
+ pageSourceCheck();
+ }
+
+ public void doSave() {
+ pageManager.save();
+ OutputStream outputStream = null;
+ try {
+ File file = OseeData.getFile("testManagerSettings.xml");
+ outputStream = new FileOutputStream(file);
+ getPropertyStore().save(outputStream);
+ } catch (Exception ex) {
+ TestManagerPlugin.log(Level.SEVERE, "Error storing settings.", ex);
+ } finally {
+ if (outputStream != null) {
+ try {
+ outputStream.close();
+ } catch (IOException ex) {
+ TestManagerPlugin.log(Level.WARNING, "Error closing stream during settings storage.", ex);
+ }
+ }
+ }
+ }
+
+ public void restoreSettings() {
+ InputStream inputStream = null;
+ try {
+ File file = OseeData.getFile("testManagerSettings.xml");
+ if(file.exists()){
+ inputStream = new FileInputStream(file);
+ getPropertyStore().load(inputStream);
+ pageManager.restore();
+ }
+ } catch (Exception ex) {
+ TestManagerPlugin.log(Level.WARNING, "Stored settings not available. Using defaults.", ex);
+ } finally {
+ if (inputStream != null) {
+ try {
+ inputStream.close();
+ } catch (IOException ex) {
+ TestManagerPlugin.log(Level.WARNING, "Error closing stream while loading settings.", ex);
+ }
+ }
+ }
+ }
+
+ public IPropertyStore getPropertyStore() {
+ return propertyStore;
+ }
+
+ public PageManager getPageManager() {
+ return pageManager;
+ }
+
+ @Override
+ public void onConnectionLost(IServiceConnector connector) {
+ connectedEnv = null;
+ connector = null;
+ boolean problemEncountered = pageManager.onConnectionLost();
+ if (problemEncountered) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ @Override
+ public void run() {
+ MessageDialog.openError(Displays.getActiveShell(), "Disconnect Error",
+ "Test manager has encountered a problem while processing the disconnect event. See Error Log for details");
+ }
+ });
+ }
+ connectedHost = null;
+ }
+
+ @Override
+ public void onPostConnect(ConnectionEvent event) {
+ connectedEnv = event.getEnvironment();
+ connectedHost = event.getHostEnvironment();
+ connector = event.getConnector();
+ boolean problemEncountered = pageManager.onPostConnect(event);
+ if (problemEncountered) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ @Override
+ public void run() {
+ MessageDialog.openError(Displays.getActiveShell(), "Connection Error",
+ "Test manager has encountered a problem while processing the connection event. See Error Log for details");
+ }
+ });
+ }
+ }
+
+ @Override
+ public void onPreDisconnect(ConnectionEvent event) {
+ event.getEnvironment();
+ connectedEnv = null;
+
+ connector = null;
+ boolean problemEncountered = pageManager.onPreDisconnect(event);
+ if (problemEncountered) {
+ Displays.ensureInDisplayThread(new Runnable() {
+ @Override
+ public void run() {
+ MessageDialog.openError(Displays.getActiveShell(), "Disconnect Error",
+ "Test manager has encountered a problem while processing the disconnect event. See Error Log for details");
+ }
+ });
+ }
+ connectedHost = null;
+ }
+
+ public boolean isConnected() {
+ return connectedEnv != null;
+ }
+
+ public ITestEnvironment getConnectedEnvironment() {
+ return connectedEnv;
+ }
+
+ public IHostTestEnvironment getConnectedHostEnvironment() {
+ return connectedHost;
+ }
+
+ public IServiceConnector getConnector() {
+ return connector;
+ }
+
+ public abstract void createHostWidget(Composite parent);
+
+ public void addFiles(String[] files) {
+ pageManager.getScriptPage().addFiles(files);
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerEditorContributor.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerEditorContributor.java
new file mode 100644
index 000000000..c4e4456d6
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerEditorContributor.java
@@ -0,0 +1,103 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.core;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IStatusLineManager;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.actions.ActionFactory;
+import org.eclipse.ui.ide.IDEActionFactory;
+import org.eclipse.ui.part.MultiPageEditorActionBarContributor;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.ui.texteditor.ITextEditorActionConstants;
+
+/**
+ * Manages the installation/deinstallation of global actions for multi-page editors. Responsible for the redirection of
+ * global actions to the active editor. Multi-page contributor replaces the contributors for the individual editors in
+ * the multi-page editor.
+ */
+public class TestManagerEditorContributor extends MultiPageEditorActionBarContributor {
+ private IEditorPart activeEditorPart;
+
+ /**
+ * Creates a multi-page contributor.
+ */
+ public TestManagerEditorContributor() {
+ super();
+ createActions();
+ }
+
+ @Override
+ public void setActivePage(IEditorPart part) {
+ if (activeEditorPart == part) {
+ return;
+ }
+
+ activeEditorPart = part;
+
+ IActionBars actionBars = getActionBars();
+ if (actionBars != null) {
+
+ ITextEditor editor = part instanceof ITextEditor ? (ITextEditor) part : null;
+
+ actionBars.setGlobalActionHandler(ActionFactory.DELETE.getId(),
+ getAction(editor, ITextEditorActionConstants.DELETE));
+ actionBars.setGlobalActionHandler(ActionFactory.UNDO.getId(),
+ getAction(editor, ITextEditorActionConstants.UNDO));
+ actionBars.setGlobalActionHandler(ActionFactory.REDO.getId(),
+ getAction(editor, ITextEditorActionConstants.REDO));
+ actionBars.setGlobalActionHandler(ActionFactory.CUT.getId(), getAction(editor, ITextEditorActionConstants.CUT));
+ actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(),
+ getAction(editor, ITextEditorActionConstants.COPY));
+ actionBars.setGlobalActionHandler(ActionFactory.PASTE.getId(),
+ getAction(editor, ITextEditorActionConstants.PASTE));
+ actionBars.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(),
+ getAction(editor, ITextEditorActionConstants.SELECT_ALL));
+ actionBars.setGlobalActionHandler(ActionFactory.FIND.getId(),
+ getAction(editor, ITextEditorActionConstants.FIND));
+ actionBars.setGlobalActionHandler(IDEActionFactory.BOOKMARK.getId(),
+ getAction(editor, IDEActionFactory.BOOKMARK.getId()));
+ actionBars.updateActionBars();
+ }
+ }
+
+ /**
+ * Returns the action registered with the given text editor.
+ *
+ * @return IAction or null if editor is null.
+ */
+ protected IAction getAction(ITextEditor editor, String actionID) {
+ return editor == null ? null : editor.getAction(actionID);
+ }
+
+ private void createActions() {
+ //Left here for future actions that might want to be contributed to the status
+ //line for Test Manager.
+ }
+
+ @Override
+ public void setActiveEditor(IEditorPart part) {
+ super.setActiveEditor(part);
+
+ if (part instanceof TestManagerEditor) {
+
+ //Left here for future actions that might want to be contributed to the status
+ //line for Test Manager.
+ }
+
+ }
+
+ @Override
+ public void contributeToStatusLine(final IStatusLineManager statusLineManager) {
+ super.contributeToStatusLine(statusLineManager);
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerEditorInput.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerEditorInput.java
new file mode 100644
index 000000000..3936ab2e4
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerEditorInput.java
@@ -0,0 +1,186 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.core;
+
+import java.io.File;
+import java.io.InputStream;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IStorage;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.osee.framework.ui.ws.AWorkspace;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IMemento;
+import org.eclipse.ui.IPersistableElement;
+
+public class TestManagerEditorInput implements IFileEditorInput, IPersistableElement {
+
+ private static final String FACTORY_ID = TestManagerEditorInputFactory.class.getCanonicalName();
+ private final IFile iFile;
+
+ public TestManagerEditorInput(File file) {
+ this(getIFile(file));
+ }
+
+ public TestManagerEditorInput(IFile iFile) {
+ super();
+ this.iFile = iFile;
+ }
+
+ private static IFile getIFile(File file){
+ IFile ifile = AWorkspace.fileToIFile(file);
+ if(ifile == null){
+ IWorkspace workspace= ResourcesPlugin.getWorkspace();
+ IPath location= Path.fromOSString(file.getAbsolutePath());
+ ifile= workspace.getRoot().getFileForLocation(location);
+ }
+ return ifile;
+ }
+
+ /*
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object o) {
+ if (o == this) {
+ return true;
+ }
+
+ if (iFile != null && o instanceof TestManagerEditorInput) {
+ TestManagerEditorInput input = (TestManagerEditorInput) o;
+ return iFile.equals(input.getFile());
+ }
+ return false;
+ }
+
+ /*
+ * @see org.eclipse.ui.IEditorInput#exists()
+ */
+ @Override
+ public boolean exists() {
+ return true;
+ }
+
+ /*
+ * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+ */
+ @Override
+ public Object getAdapter(Class adapter) {
+ return iFile.getAdapter(adapter);
+ }
+
+ @Override
+ public String getFactoryId() {
+ return FACTORY_ID;
+ }
+
+ @Override
+ public IFile getFile() {
+ return iFile;
+ }
+
+ /*
+ * @see org.eclipse.ui.IEditorInput#getImageDescriptor()
+ */
+ @Override
+ public ImageDescriptor getImageDescriptor() {
+ return null;
+ }
+
+ // /*
+ // * @see org.eclipse.ui.editors.text.ILocationProvider#getPath(java.lang.Object)
+ // */
+ // public IPath getPath(Object element) {
+ // if (element instanceof NonExistingFileEditorInput) {
+ // NonExistingFileEditorInput input= (NonExistingFileEditorInput) element;
+ // return Path.fromOSString(input.fFile.getAbsolutePath());
+ // }
+ // return null;
+ // }
+
+ /*
+ * @see org.eclipse.ui.IEditorInput#getName()
+ */
+ @Override
+ public String getName() {
+ if(iFile == null){
+ return "TestManager";
+ }
+ return iFile.getName();
+ }
+
+ /*
+ * @see org.eclipse.ui.IEditorInput#getPersistable()
+ */
+ @Override
+ public IPersistableElement getPersistable() {
+ return this;
+ }
+
+ @Override
+ public IStorage getStorage() throws CoreException {
+ return new IStorage() {
+
+ @Override
+ public Object getAdapter(Class adapter) {
+ return iFile.getAdapter(adapter);
+ }
+
+ @Override
+ public InputStream getContents() throws CoreException {
+ return iFile.getContents();
+ }
+
+ @Override
+ public IPath getFullPath() {
+ return iFile.getFullPath();
+ }
+
+ @Override
+ public String getName() {
+ return iFile.getName();
+ }
+
+ @Override
+ public boolean isReadOnly() {
+ return false;
+ }
+
+ };
+ }
+
+ /*
+ * @see org.eclipse.ui.IEditorInput#getToolTipText()
+ */
+ @Override
+ public String getToolTipText() {
+ return iFile.getName();
+ }
+
+ /*
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ return iFile.hashCode();
+ }
+
+ @Override
+ public void saveState(IMemento memento) {
+ if (iFile != null && iFile.getLocation().toFile().exists()) {
+ memento.putString("path", iFile.getLocation().toFile().getAbsolutePath());
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerEditorInputFactory.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerEditorInputFactory.java
new file mode 100644
index 000000000..6eefd9b10
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerEditorInputFactory.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.core;
+
+import java.io.File;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.ui.IElementFactory;
+import org.eclipse.ui.IMemento;
+
+public class TestManagerEditorInputFactory implements IElementFactory {
+
+ public TestManagerEditorInputFactory() {
+ }
+
+ @Override
+ public IAdaptable createElement(IMemento memento) {
+ String path = memento.getString("path");
+ if(path != null){
+ File file = new File(path);
+ TestManagerEditorInput input = new TestManagerEditorInput(file);
+ return input;
+ } else {
+ return null;
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerInput.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerInput.java
new file mode 100644
index 000000000..eb96246e3
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/core/TestManagerInput.java
@@ -0,0 +1,151 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.core;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.logging.Level;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.TransformerException;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.osee.framework.jdk.core.util.xml.Jaxp;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.eclipse.osgi.service.datalocation.Location;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IPersistableElement;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+public class TestManagerInput implements IEditorInput {
+ private final HashMap<String, String> keyValue;
+
+ public TestManagerInput() {
+ keyValue = new HashMap<>();
+ loadFromFile();
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ if (object instanceof TestManagerInput) {
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean exists() {
+ return false;
+ }
+
+ @Override
+ public Object getAdapter(Class adapter) {
+ return null;
+ }
+
+ public String getDefaultXML() {
+ return "<testManager>" + "<contact></contact>" + "<description>Test Manager</description>" +
+ "<distributionStatement></distributionStatement>" + "</testManager>";
+
+ }
+
+ @Override
+ public ImageDescriptor getImageDescriptor() {
+ return null;
+ }
+
+ @Override
+ public String getName() {
+ return "TestManager";
+ }
+
+ @Override
+ public IPersistableElement getPersistable() {
+ return null;
+ }
+
+ @Override
+ public String getToolTipText() {
+ return "OSEE TestManager";
+ }
+
+ public String getValue(String key) {
+ return keyValue.get(key);
+ }
+
+ public void storeValue(String key, String value) throws ParserConfigurationException, TransformerException, IOException {
+ keyValue.put(key, value);
+ saveToFile();
+ }
+
+ private File getFile() {
+ Location user = Platform.getUserLocation();
+ String path = user.getURL().getPath();
+ File file =
+ new File(
+ path + File.separator + "org.eclipse.osee.ote.ui.test.manager" + File.separator + this.getClass().getName() + ".xml");
+ file.getParentFile().mkdirs();
+ return file;
+ }
+
+ private void loadFromFile() {
+ keyValue.clear();
+ Document document;
+ try {
+ document = Jaxp.readXmlDocument(getFile());
+ NodeList viewList = document.getElementsByTagName("Pair");
+ for (int index = 0; index < viewList.getLength(); index++) {
+ Node node = viewList.item(index);
+ if (node != null && node instanceof Element) {
+ Element element = (Element) node;
+ String key = Jaxp.getChildText(element, "Key");
+ String value = Jaxp.getChildText(element, "Value");
+ if (key != null && value != null && !key.equals("") && !value.equals("")) {
+ keyValue.put(key, value);
+ }
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.log(TestManagerPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ private void saveToFile() throws ParserConfigurationException, TransformerException, IOException {
+ Document document = Jaxp.newDocumentNamespaceAware();
+ Element root = document.createElement("ValuePairs");
+ document.appendChild(root);
+
+ Iterator<String> it = keyValue.keySet().iterator();
+ while (it.hasNext()) {
+ String key = it.next();
+ String value = keyValue.get(key);
+ if (key != null && value != null && !key.equals("") && !value.equals("")) {
+ Element pair = document.createElement("Pair");
+
+ Element keyElement = document.createElement("Key");
+ keyElement.setTextContent(key);
+ pair.appendChild(keyElement);
+
+ Element valueElement = document.createElement("Value");
+ valueElement.setTextContent(value);
+ pair.appendChild(valueElement);
+ root.appendChild(pair);
+ }
+ }
+
+ Jaxp.writeXmlDocument(document, getFile(), Jaxp.getPrettyFormat());
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/internal/ServiceUtility.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/internal/ServiceUtility.java
new file mode 100644
index 000000000..c990a1042
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/internal/ServiceUtility.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.internal;
+
+import org.eclipse.osee.ote.version.FileVersionInformation;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+
+public class ServiceUtility {
+
+ public static FileVersionInformation getFileVersionInformation(){
+ return getService(FileVersionInformation.class);
+ }
+
+ public static Class<ServiceUtility> getClazz(){
+ return ServiceUtility.class;
+ }
+
+ public static <T> T getService(Class<T> clazz){
+ BundleContext context = getContext();
+ if(context == null){
+ return null;
+ }
+ ServiceReference serviceReference = context.getServiceReference(clazz.getName());
+ if(serviceReference == null){
+ return null;
+ }
+ return (T)getContext().getService(serviceReference);
+ }
+
+ public static <T> T[] getServices(Class<T> clazz) throws InvalidSyntaxException{
+ ServiceReference[] serviceReferences = getContext().getServiceReferences(clazz.getName(), null);
+ T[] data = (T[])new Object[serviceReferences.length];
+ for(int i = 0; i < serviceReferences.length; i ++){
+ data[i] = (T)getContext().getService(serviceReferences[i]);
+ }
+ return data;
+ }
+
+ public static BundleContext getContext(){
+ return FrameworkUtil.getBundle(getClazz()).getBundleContext();
+ }
+}
+
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/internal/TestManagerPlugin.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/internal/TestManagerPlugin.java
new file mode 100644
index 000000000..4c5413fc0
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/internal/TestManagerPlugin.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.internal;
+
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.plugin.OseeUiActivator;
+import org.eclipse.osee.ote.service.IOteClientService;
+import org.eclipse.osee.ote.ui.IOteConsoleService;
+import org.osgi.framework.BundleContext;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * The main plugin class to be used in the desktop.
+ */
+public class TestManagerPlugin extends OseeUiActivator {
+ private static TestManagerPlugin pluginInstance; // The shared instance.
+ public static final String PLUGIN_ID = "org.eclipse.osee.ote.ui.test.manager";
+
+ private static String username = null;
+
+ private ServiceTracker oteClientServiceTracker;
+ private ServiceTracker oteConsoleServiceTracker;
+
+ /**
+ * Returns the shared instance.
+ */
+ public static TestManagerPlugin getInstance() {
+ return pluginInstance;
+ }
+
+ public static String getUsername() {
+ if (username == null) {
+ username = java.lang.System.getProperty("user.name");
+ username = username.replaceAll("b", "");
+ if (username.length() == 6) {
+ username = "0" + username;
+ }
+ }
+ return username;
+ }
+
+ /**
+ * The constructor.
+ */
+ public TestManagerPlugin() {
+ super(PLUGIN_ID);
+ pluginInstance = this;
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ oteClientServiceTracker = new ServiceTracker(context, IOteClientService.class.getName(), null);
+ oteClientServiceTracker.open();
+
+ oteConsoleServiceTracker = new ServiceTracker(context, IOteConsoleService.class.getName(), null);
+ oteConsoleServiceTracker.open();
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ if (oteConsoleServiceTracker != null) {
+ oteConsoleServiceTracker.close();
+ }
+ if (oteClientServiceTracker != null) {
+ oteClientServiceTracker.close();
+ }
+ super.stop(context);
+ }
+
+ public IOteClientService getOteClientService() {
+ return (IOteClientService) oteClientServiceTracker.getService();
+ }
+
+ public IOteConsoleService getOteConsoleService() {
+ return (IOteConsoleService) oteConsoleServiceTracker.getService();
+ }
+
+ public static void log(Level level, String message, Throwable t) {
+ OseeLog.log(TestManagerPlugin.class, level, message, t);
+ }
+
+ public static void log(Level level, String message) {
+ log(level, message, null);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/jobs/ScriptRunJob.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/jobs/ScriptRunJob.java
new file mode 100644
index 000000000..8cd6db92d
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/jobs/ScriptRunJob.java
@@ -0,0 +1,150 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.jobs;
+
+import java.io.File;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.swt.Displays;
+import org.eclipse.osee.ote.ui.test.manager.core.TestManagerEditor;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.pages.ScriptPage;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ScriptTask;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ScriptRunJob extends Job {
+ private static final String JOB_NAME = "Script Run Job";
+
+ private final TestManagerEditor testManagerEditor;
+ private final List<ScriptTask> runTasks;
+
+ public ScriptRunJob(TestManagerEditor testManagerEditor) {
+ super(JOB_NAME);
+ this.testManagerEditor = testManagerEditor;
+ this.testManagerEditor.doSave();
+ ScriptPage scriptPage = getScriptPage();
+ scriptPage.getScriptTableViewer().refresh();
+ this.runTasks = scriptPage.getScriptTableViewer().getRunTasks();
+ }
+
+ public IStatus verifyOutfileLocations() {
+ final LinkedList<IStatus> failedLocations = new LinkedList<>();
+ for (ScriptTask task : runTasks) {
+ final String fileName = task.getScriptModel().getOutputModel().getRawFilename();
+ final File file = new File(fileName);
+ if (file.exists() && (!file.canWrite() || !file.canRead())) {
+ failedLocations.add(new Status(IStatus.ERROR, TestManagerPlugin.PLUGIN_ID, "could not access " + fileName));
+ } else if (!file.getParentFile().canWrite()) {
+ failedLocations.add(new Status(IStatus.ERROR, TestManagerPlugin.PLUGIN_ID, "could not access " + fileName));
+ }
+ }
+ if (failedLocations.isEmpty()) {
+ return Status.OK_STATUS;
+ } else {
+ return new Status(IStatus.ERROR, TestManagerPlugin.PLUGIN_ID, "unable to access out files") {
+
+ @Override
+ public boolean isMultiStatus() {
+ return true;
+ }
+
+ @Override
+ public IStatus[] getChildren() {
+ return failedLocations.toArray(new IStatus[failedLocations.size()]);
+ }
+
+ };
+ }
+ }
+
+ @Override
+ public IStatus run(IProgressMonitor monitor) {
+ IStatus toReturn = Status.CANCEL_STATUS;
+ final IStatus status = verifyOutfileLocations();
+
+ if (status != Status.OK_STATUS) {
+ Displays.pendInDisplayThread(new Runnable() {
+ @Override
+ public void run() {
+ ErrorDialog.openError(
+ Displays.getActiveShell(),
+ "Script Run Error",
+ "Could not access some out file locations. Check access permissions. Click Details to see a list of failed locations",
+ status, -1);
+ }
+
+ });
+
+ return Status.OK_STATUS;
+ }
+
+ long time = System.currentTimeMillis();
+
+ clearMarkers();
+ getScriptPage().onScriptRunning(true);
+
+ long elapsed = System.currentTimeMillis() - time;
+ OseeLog.logf(TestManagerPlugin.class, Level.FINE,
+ "%d milliseconds to initialize the running of scripts.", elapsed);
+ OseeLog.logf(TestManagerPlugin.class, Level.INFO, "%d scripts have been batched.", runTasks.size());
+
+ Displays.pendInDisplayThread(new Runnable() {
+ @Override
+ public void run() {
+ getScriptPage().getScriptManager().addTestsToQueue(runTasks);
+ }
+
+ });
+ toReturn = Status.OK_STATUS;
+ return toReturn;
+ }
+
+ private ScriptPage getScriptPage() {
+ return this.testManagerEditor.getPageManager().getScriptPage();
+ }
+
+ public boolean isRunAllowed() {
+
+ return this.testManagerEditor.getPageManager().areSettingsValidForRun();
+
+ }
+
+ public String getErrorMessage() {
+ return this.testManagerEditor.getPageManager().getErrorMessage();
+ }
+
+ private void clearMarkers() {
+ // TODO can we somehow wait until the script is actually run to remove
+ // the markers? Otherwise if the run is aborted before the script
+ // runs...
+
+ // Remove markers from scripts to be run
+ // for (ScriptTask task : runTasks) {
+ // try {
+ // MarkerSupport.deleteMarkersFromInputFile(task.getScriptModel().getIFile());
+ // }
+ // catch (Exception ex) {
+ // OseeLog.log(Activator.class, Level.SEVERE, "Unable to clear the tests markers before
+ // running the test.", ex);
+ // }
+ // }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/jobs/StoreOutfileJob.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/jobs/StoreOutfileJob.java
new file mode 100644
index 000000000..488c64ddb
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/jobs/StoreOutfileJob.java
@@ -0,0 +1,170 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.jobs;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.util.logging.Level;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.AIFile;
+import org.eclipse.osee.framework.ui.plugin.util.OseeConsole;
+import org.eclipse.osee.framework.ui.ws.AWorkspace;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironment;
+import org.eclipse.osee.ote.ui.markers.MarkerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.connection.ScriptManager;
+import org.eclipse.osee.ote.ui.test.manager.core.TestManagerEditor;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.models.OutputModel;
+import org.eclipse.osee.ote.ui.test.manager.pages.contributions.TestManagerStorageKeys;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ScriptTask;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class StoreOutfileJob extends Job {
+
+ private final ScriptManager userEnvironment;
+ private final ScriptTask scriptTask;
+ private final boolean isValidRun;
+ private final TestManagerEditor testManagerEditor;
+ private final ITestEnvironment env;
+
+ private final String clientOutfilePath;
+
+ private final String serverOutfilePath;
+
+ public StoreOutfileJob(ITestEnvironment env, TestManagerEditor testManagerEditor, ScriptManager userEnvironment, ScriptTask scriptTask, String clientOutfilePath, String serverOutfilePath, boolean isValidRun) {
+ super("Store: " + scriptTask.getName());
+ this.env = env;
+ this.scriptTask = scriptTask;
+ this.testManagerEditor = testManagerEditor;
+ this.userEnvironment = userEnvironment;
+ this.isValidRun = isValidRun;
+ this.clientOutfilePath = clientOutfilePath;
+ this.serverOutfilePath = serverOutfilePath;
+ }
+
+ public static void scheduleJob(Job job) {
+ job.setUser(false);
+ job.setPriority(Job.SHORT);
+ job.schedule();
+ }
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ try {
+ if (isValidRun == true) {
+ try {
+ storeOutfile(scriptTask);
+ } catch (Exception e) {
+ return new Status(IStatus.ERROR, TestManagerPlugin.PLUGIN_ID, "Failed to write out file to workspace",
+ e);
+ }
+ }
+ // scriptTask.computeExists();
+ userEnvironment.updateScriptTableViewer(scriptTask);
+ try {
+ Thread.sleep(2000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ processOutFile(scriptTask);
+ } catch (Exception ex) {
+ OseeLog.log(TestManagerPlugin.class, Level.SEVERE, ex);
+ }
+ return Status.OK_STATUS;
+ }
+
+ public void processOutFile(ScriptTask task) {
+ OseeLog.log(TestManagerPlugin.class, Level.INFO, "Processing Outfile: " + task.getName());
+ // task.computeExists();
+ File xmlSourceFile = task.getScriptModel().getOutputModel().getFile();
+ IFile javaSourceIFile = task.getScriptModel().getIFile();
+
+ if (!xmlSourceFile.exists()) {
+ TestManagerPlugin.getInstance().getOteConsoleService().writeError("Output File Not Created");
+ } else {
+ // Refresh the parent so the workspace knows the new tmo file exists
+ AWorkspace.refreshResource(javaSourceIFile);
+ task.getScriptModel().getOutputModel().updateTestPointsFromOutfile();
+ int failedPoints = task.getScriptModel().getOutputModel().getFailedTestPoints();
+ userEnvironment.updateScriptTableViewer(scriptTask);
+ if (failedPoints > 0) {
+ // Print fails in red, but don't force the console to popup
+ TestManagerPlugin.getInstance().getOteConsoleService().write(
+ String.format("Test Point Failures => %s[%d]", task.getName(), failedPoints), OseeConsole.CONSOLE_ERROR,
+ false);
+ }
+ }
+ }
+
+ private boolean isKeepSavedOutfileEnabled() {
+ return testManagerEditor.getPropertyStore().getBoolean(
+ TestManagerStorageKeys.KEEP_OLD_OUTFILE_COPIES_ENABLED_KEY);
+ }
+
+ private void storeOutfile(ScriptTask scriptTask) throws Exception {
+ if (clientOutfilePath.equals(serverOutfilePath) != true) {
+ // the paths are different so we need to copy the file
+ byte[] outBytes = env.getScriptOutfile(serverOutfilePath);
+ if (outBytes != null && outBytes.length > 0) {
+
+ if (isKeepSavedOutfileEnabled()) {
+ moveOutputToNextAvailableSpot(scriptTask);
+ }
+ IFile file = null;
+ IFile[] files = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocationURI(
+ org.eclipse.core.filesystem.URIUtil.toURI(clientOutfilePath));
+ if (files.length > 0) {
+ file = files[0];
+ }
+ if (file != null) {
+ AIFile.writeToFile(file, new ByteArrayInputStream(outBytes));
+ MarkerPlugin.addMarkers(file);
+ } else {
+ Lib.writeBytesToFile(outBytes, new File(clientOutfilePath));
+ }
+ }
+ }
+ }
+
+ private void moveOutputToNextAvailableSpot(ScriptTask task) {
+ OutputModel outputModel = task.getScriptModel().getOutputModel();
+ File oldFile = outputModel.getFile();
+ if (oldFile != null && oldFile.exists() && oldFile.isFile() && oldFile.canRead()) {
+ String outputExtension = "." + outputModel.getFileExtension();
+ String extensionRegex = "\\" + outputExtension + "\\b";//escape the . and should be the end of the string (word b
+ int fileNum = 1;
+ File destFile = new File(
+ oldFile.getAbsoluteFile().toString().replaceFirst(extensionRegex, "." + fileNum + outputExtension));
+ if (destFile.exists()) {
+ while (destFile.exists()) {
+ fileNum++;
+ destFile = new File(
+ oldFile.getAbsoluteFile().toString().replaceFirst(extensionRegex, "." + fileNum + outputExtension));
+ }
+ }
+ try {
+ Lib.copyFile(oldFile, destFile);
+ } catch (IOException e2) {
+ OseeLog.log(TestManagerPlugin.class, Level.SEVERE, "Failed to move output file to next available spot", e2);
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/models/FileModel.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/models/FileModel.java
new file mode 100644
index 000000000..17ad692e7
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/models/FileModel.java
@@ -0,0 +1,195 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.models;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.logging.Level;
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.filesystem.IFileStore;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.ws.AWorkspace;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.ide.IDE;
+
+public class FileModel {
+
+ private File file = null;
+ private IFile iFile = null;
+ private long lastModified = 0;
+ private String path = "";
+ private String rawFilename = "";
+ private String text = null;
+
+ public FileModel(String rawFilename) {
+ this.rawFilename = rawFilename;
+ if (getIFile() != null) {
+ lastModified = getIFile().getModificationStamp();
+ }
+ }
+
+ public boolean exists() {
+ return getFile().exists();
+ }
+
+ /**
+ * @return Returns the file.
+ */
+ public File getFile() {
+ if (file == null) {
+ file = new File(rawFilename);
+ }
+ return file;
+ }
+
+ /**
+ * @return Returns the iFile for the given local data {@link #rawFilename}. You may still have to check if the file actually exists.
+ */
+ public IFile getIFile() {
+ if (iFile == null) {
+ if (path.equals("")) {
+ if (!rawFilename.equals("")) {
+ iFile = AWorkspace.getIFile(rawFilename);
+ if(iFile == null){
+ IFile[] files = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocationURI(org.eclipse.core.filesystem.URIUtil.toURI(rawFilename));
+ if(files.length > 0){
+ iFile = files[0];
+ }
+ }
+ }
+ }
+ }
+ return iFile;
+ }
+
+ /**
+ * @return Returns the name.
+ */
+ public String getName() {
+ return new File(rawFilename).getName();
+ }
+
+ /**
+ * @return Returns the path.
+ */
+ public String getPath() {
+ if (iFile == null) {
+ iFile = getIFile();
+ }
+ if (iFile != null) {
+ path = iFile.getFullPath().toString();
+ }
+ return path;
+ }
+
+ /**
+ * @return Returns the rawFilename.
+ */
+ public String getRawFilename() {
+ return rawFilename;
+ }
+
+ public String getWorkspaceRelativePath() {
+ IWorkspace ws = ResourcesPlugin.getWorkspace();
+ IFile ifile = ws.getRoot().getFileForLocation(new Path(rawFilename));
+ if(ifile == null){
+ IFile[] files = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocationURI(org.eclipse.core.filesystem.URIUtil.toURI(rawFilename));
+ if(files.length > 0){
+ ifile = files[0];
+ }
+ }
+ if (!ifile.exists()) {
+ return null;
+ } else {
+ return ifile.getFullPath().toString();
+ }
+ }
+
+ public String getText() throws IOException {
+ if (iFile == null) {
+ getIFile();
+ }
+ if (iFile == null) {
+ return "";
+ }
+ if (text == null || iFile.getModificationStamp() != lastModified) {
+ text = Lib.fileToString(new File(rawFilename));
+ OseeLog.log(TestManagerPlugin.class, Level.INFO, "getText: Reading file " + getName());
+ } else {
+ OseeLog.log(TestManagerPlugin.class, Level.INFO, "getText: Using buffered file " + getName());
+ }
+ lastModified = iFile.getModificationStamp();
+ return text;
+ }
+
+ public boolean isModified() {
+ if (iFile == null) {
+ getIFile();
+ }
+ if (iFile == null) {
+ OseeLog.log(TestManagerPlugin.class, Level.WARNING, "Can't Read iFile");
+ return true;
+ }
+ return iFile.getModificationStamp() != lastModified;
+ }
+
+ public void openEditor() {
+ if (getIFile() != null) {
+ AWorkspace.openEditor(getIFile());
+ } else {
+ IFileStore fileStore = EFS.getLocalFileSystem().getStore(new Path(file.getAbsolutePath()));
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ try {
+ IDE.openEditorOnFileStore(page, fileStore);
+ } catch (PartInitException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ public void openPackageExplorer() {
+ OseeLog.log(TestManagerPlugin.class, Level.INFO, "Show in explorer " + getName());
+ // Open in Package Explorer and error if can't
+ boolean success = AWorkspace.showInPackageExplorer(getIFile());
+ // if(!success){
+ // success = AWorkspace.showInResourceNavigator(getIFile());
+ // }
+ if (!success) {
+ MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Open Error",
+ "Can't Show in Explorer\n\n" + getName());
+ }
+ // As a convenience, open in Navigator, but don't error
+ success = AWorkspace.showInResourceNavigator(getIFile());
+ }
+
+ /**
+ * @param path The path to set.
+ */
+ public void setPath(String path) {
+ this.path = path;
+ }
+
+ /**
+ * @param rawFilename The rawFilename to set.
+ */
+ public void setRawFilename(String rawFilename) {
+ this.rawFilename = rawFilename;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/models/OutputModel.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/models/OutputModel.java
new file mode 100644
index 000000000..646594b41
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/models/OutputModel.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.models;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.jdk.core.util.io.xml.AbstractSaxHandler;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.xml.sax.Attributes;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+/**
+ * Base Class for all TestManagers
+ */
+public class OutputModel extends FileModel {
+
+ private static final String OUTPUT_EXTENSION = "tmo";
+
+ private int failedTestPoints = 0;
+ private int passedTestPoints = 0;
+ private boolean aborted = false;
+ private boolean exists = false;
+
+ public OutputModel(String rawFilename) {
+ super(rawFilename);
+ }
+
+ public boolean doesOutfileExist() {
+ return exists;
+ }
+
+ public void updateTestPointsFromOutfile() {
+ try {
+ File outfile = getFile();
+ exists = outfile.exists();
+ if (outfile.exists() && outfile.length() > 0) {
+ XMLReader xmlReader = XMLReaderFactory.createXMLReader();
+ xmlReader.setContentHandler(new ParseTestPoints());
+ xmlReader.parse(new InputSource(new FileInputStream(outfile)));
+ }
+ } catch (Exception ex) {
+ OseeLog.log(TestManagerPlugin.class, Level.SEVERE, ex);
+ }
+ }
+
+ public int getFailedTestPoints() {
+ return failedTestPoints;
+ }
+
+ public int getPassedTestPoints() {
+ return passedTestPoints;
+ }
+
+ public void setFailedTestPoints(int failedTestPoints) {
+ this.failedTestPoints = failedTestPoints;
+ }
+
+ public void setPassedTestPoints(int passedTestPoints) {
+ this.passedTestPoints = passedTestPoints;
+ }
+
+ private class ParseTestPoints extends AbstractSaxHandler {
+
+ @Override
+ public void endElementFound(String uri, String localName, String name) throws SAXException {
+ }
+
+ @Override
+ public void startElementFound(String uri, String localName, String name, Attributes attributes) throws SAXException {
+ if ("TestPointResults".equals(name)) {
+ String fail = attributes.getValue("fail");
+ String pass = attributes.getValue("pass");
+ String aborted = attributes.getValue("aborted");
+ try {
+ failedTestPoints = Integer.parseInt(fail);
+ passedTestPoints = Integer.parseInt(pass);
+ if (aborted != null && aborted.length() > 0) {
+ OutputModel.this.aborted = Boolean.parseBoolean(aborted);
+ }
+ } catch (NumberFormatException ex) {
+
+ }
+ }
+ }
+ }
+
+ public String getFileExtension() {
+ return OUTPUT_EXTENSION;
+ }
+
+ public boolean isAborted() {
+ return aborted;
+ }
+
+ public void setAborted(boolean b) {
+ aborted = b;
+
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/models/OutputModelJob.done b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/models/OutputModelJob.done
new file mode 100644
index 000000000..bc716d4df
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/models/OutputModelJob.done
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.models;
+
+import java.util.concurrent.ConcurrentLinkedQueue;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.osee.ote.ui.test.manager.connection.ScriptManager;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ScriptTask;
+
+/**
+ * @author b1528444
+ *
+ */
+public class OutputModelJob extends Job {
+
+ private static OutputModelJob singleton = null;
+ private ScriptManager scriptManager;
+ private ConcurrentLinkedQueue<ScriptTask> outputModels = new ConcurrentLinkedQueue<ScriptTask>();
+
+
+ public static void createSingleton(ScriptManager scriptManager){
+ if(singleton == null){
+ singleton = new OutputModelJob(scriptManager);
+ }
+ }
+
+ public static OutputModelJob getSingleton(){
+ return singleton;
+ }
+
+ /**
+ * @param name
+ */
+ private OutputModelJob(ScriptManager scriptManager) {
+ super("Parsing OTE Output File");
+ setUser(false);
+ this.scriptManager = scriptManager;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ while(!outputModels.isEmpty()){
+ ScriptTask task = outputModels.remove();
+ task.getScriptModel().getOutputModel().updateTestPointsFromOutfile();
+ task.getPassFail();
+ scriptManager.updateScriptTableViewerTimed(task);
+ }
+ return Status.OK_STATUS;
+ }
+
+ public void addTask(ScriptTask task){
+ outputModels.add(task);
+ schedule();
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/models/OutputModelJob.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/models/OutputModelJob.java
new file mode 100644
index 000000000..b7bce05ea
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/models/OutputModelJob.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.models;
+
+import java.util.concurrent.ConcurrentLinkedQueue;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.osee.ote.ui.test.manager.connection.ScriptManager;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ScriptTask;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public class OutputModelJob extends Job {
+
+ private static OutputModelJob singleton = null;
+ private final ScriptManager scriptManager;
+ private final ConcurrentLinkedQueue<ScriptTask> outputModels = new ConcurrentLinkedQueue<>();
+
+ public static void createSingleton(ScriptManager scriptManager) {
+ if (singleton == null) {
+ singleton = new OutputModelJob(scriptManager);
+ }
+ }
+
+ public static OutputModelJob getSingleton() {
+ return singleton;
+ }
+
+ private OutputModelJob(ScriptManager scriptManager) {
+ super("Parsing OTE Output File");
+ setUser(false);
+ this.scriptManager = scriptManager;
+ }
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ while (!outputModels.isEmpty()) {
+ ScriptTask task = outputModels.remove();
+ task.getScriptModel().getOutputModel().updateTestPointsFromOutfile();
+ task.getPassFail();
+ scriptManager.updateScriptTableViewerTimed(task);
+ }
+ return Status.OK_STATUS;
+ }
+
+ public void addTask(ScriptTask task) {
+ outputModels.add(task);
+ schedule();
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/models/ScriptModel.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/models/ScriptModel.java
new file mode 100644
index 000000000..fd8206dd7
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/models/ScriptModel.java
@@ -0,0 +1,168 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.models;
+
+import java.io.File;
+import org.eclipse.core.filebuffers.manipulation.ContainerCreator;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.ui.ws.AJavaProject;
+import org.eclipse.osee.ote.core.TestScript;
+import org.eclipse.osee.ote.core.environment.config.ScriptVersionConfig;
+import org.eclipse.osee.ote.version.FileVersion;
+
+public class ScriptModel extends FileModel {
+
+ public enum ScriptInteractionEnum {
+ BATCH,
+ MANUAL,
+ UNKNOWN
+ }
+
+ public class TestFileData {
+ public String absoluteFilePath = null;
+ public String classPath = null;
+ public String error = "";
+ public String name = null;
+ public String outFile = null;
+ public String projectPath = null;
+ public String rawFileName;
+
+ public ScriptVersionConfig getVersionInfo(FileVersion version) {
+ ScriptVersionConfig scriptVersion = new ScriptVersionConfig();
+ if (version != null) {
+ scriptVersion.setLastChangedRevision(version.getLastChangedRevision());
+ scriptVersion.setLocation(version.getURL());
+ scriptVersion.setRepositoryType(version.getVersionControlSystem());
+ scriptVersion.setLastAuthor(version.getLastAuthor());
+ scriptVersion.setLastModificationDate(version.getLastModificationDate());
+ scriptVersion.setModifiedFlag(version.getModifiedFlag());
+ }
+ return scriptVersion;
+ }
+ }
+
+ private TestFileData javaFileData;
+ private OutputModel outputModel;
+ private TestScript testScript;
+
+ /**
+ * @param outputDir alternate output directory for tmo output files null will default to script directory
+ */
+ public ScriptModel(String rawFilename, String outputDir) {
+ super(rawFilename);
+ javaFileData = new TestFileData();
+ javaFileData = getSunData(outputDir);
+ javaFileData.rawFileName = rawFilename;
+ outputModel = new OutputModel(javaFileData.outFile);
+ }
+
+ public ScriptInteractionEnum getInteraction() {
+ if (testScript == null) {
+ return ScriptInteractionEnum.UNKNOWN;
+ }
+ if (testScript.isBatchable()) {
+ return ScriptInteractionEnum.BATCH;
+ } else {
+ return ScriptInteractionEnum.MANUAL;
+ }
+ }
+
+ /**
+ * @return Returns the outputModel.
+ */
+ public OutputModel getOutputModel() {
+ outputModel.setRawFilename(javaFileData.outFile);
+ return outputModel;
+
+ }
+
+ /**
+ * @param alternateOutputDir place output files here instead of at location of the script
+ * @return Returns sun data.
+ */
+ private TestFileData getSunData(String alternateOutputDir) {
+ javaFileData.absoluteFilePath = getRawFilename();
+ String temp = null;
+ if (javaFileData.absoluteFilePath.endsWith(".java")) {
+ temp = AJavaProject.getClassName(this.getRawFilename());
+ }
+ javaFileData.name = temp == null ? new File(getRawFilename()).getName() : temp;
+ javaFileData.classPath = "";
+ alternateOutputDir = alternateOutputDir.trim();
+ if (!Strings.isValid(alternateOutputDir)) {
+ javaFileData.outFile = javaFileData.absoluteFilePath.replaceFirst(".java$", ".tmo");
+ if (!javaFileData.outFile.endsWith(".tmo")) {
+ javaFileData.outFile += ".tmo";
+ }
+ } else {
+ try {
+ File dir = new File(alternateOutputDir);
+ if (dir.exists() && dir.isDirectory()) {
+ javaFileData.outFile = alternateOutputDir;
+ } else {
+ if (getIFile() != null) {
+ IProject project = getIFile().getProject();
+ IFolder folder = project.getFolder(alternateOutputDir);
+ if (!folder.exists()) {
+ ContainerCreator containerCreator =
+ new ContainerCreator(folder.getWorkspace(), folder.getFullPath());
+ containerCreator.createContainer(new NullProgressMonitor());
+ }
+ javaFileData.outFile = folder.getLocation().toFile().getAbsolutePath();
+ }
+ }
+
+ javaFileData.outFile += File.separator;
+ javaFileData.outFile += getName();
+ javaFileData.outFile = javaFileData.outFile.replaceFirst(".java$", ".tmo");
+ if (!javaFileData.outFile.endsWith(".tmo")) {
+ javaFileData.outFile += ".tmo";
+ }
+ } catch (CoreException ex) {
+ ex.printStackTrace();
+ javaFileData.outFile = javaFileData.absoluteFilePath.replaceFirst(".java$", ".tmo");
+ if (!javaFileData.outFile.endsWith(".tmo")) {
+ javaFileData.outFile += ".tmo";
+ }
+ }
+ }
+ // outputModel = new OutputModel(javaFileData.outFile);
+
+ // OseeLog.log(TestManagerPlugin.class, Level.FINE, "javaFileData.absoluteJavaPath *"+ javaFileData.absoluteFilePath + "*");
+ // OseeLog.log(TestManagerPlugin.class, Level.FINE, "javaFileData.className *" + javaFileData.name + "*");
+ // OseeLog.log(TestManagerPlugin.class, Level.FINE, "javaFileData.classPath *" + javaFileData.classPath + "*");
+ // OseeLog.log(TestManagerPlugin.class, Level.FINE, "javaFileData.outFile *" + javaFileData.outFile+ "*");
+
+ return javaFileData;
+ }
+
+ public TestFileData updateScriptModelInfo(String alternateOutputDir) {
+ TestFileData javaFileData = getSunData(alternateOutputDir);
+ outputModel = new OutputModel(javaFileData.outFile);
+ return javaFileData;
+ }
+
+ public String getTestClass() {
+ return javaFileData.name;
+ }
+
+ /**
+ * @param outputModel The outputModel to set.
+ */
+ public void setOutputModel(OutputModel outputModel) {
+ this.outputModel = outputModel;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/operations/AddIFileToTestManager.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/operations/AddIFileToTestManager.java
new file mode 100644
index 000000000..359579e53
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/operations/AddIFileToTestManager.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.operations;
+
+import java.util.List;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.ote.ui.test.manager.core.TestManagerEditor;
+import org.eclipse.osee.ote.ui.test.manager.util.PluginUtil;
+import org.eclipse.osee.ote.ui.test.manager.util.TestManagerSelectDialog;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class AddIFileToTestManager {
+ private static AddIFileToTestManager instance = null;
+
+ private AddIFileToTestManager() {
+ }
+
+ public static AddIFileToTestManager getOperation() {
+ if (instance == null) {
+ instance = new AddIFileToTestManager();
+ }
+ return instance;
+ }
+
+ public void removeAllScriptsFromPage() {
+ if (PluginUtil.areTestManagersAvailable() != true) {
+ AWorkbench.popup("ERROR", "Test Manager Not Opened");
+ return;
+ }
+ for (TestManagerEditor editor : PluginUtil.getTestManagers()) {
+ editor.getPageManager().getScriptPage().getScriptTableViewer().getTaskList().removeAllTasks();
+ }
+ }
+
+ public void addFilesToScriptPage(List<String> files, boolean removeOtherScripts) {
+ if (PluginUtil.areTestManagersAvailable() != true) {
+ AWorkbench.popup("ERROR", "Test Manager Not Opened");
+ return;
+ }
+ TestManagerEditor[] itemsToOpen = PluginUtil.getTestManagers();
+ for (TestManagerEditor tme : itemsToOpen) {
+ if (removeOtherScripts) {
+ tme.getPageManager().getScriptPage().getScriptTableViewer().getTaskList().removeAllTasks();
+ }
+ tme.addFiles(files.toArray(new String[files.size()]));
+ }
+ }
+
+ public void addIFileToScriptsPage(String[] fullPath) {
+ if (PluginUtil.areTestManagersAvailable() != true) {
+ AWorkbench.popup("ERROR", "Test Manager Not Opened");
+ return;
+ }
+ TestManagerEditor[] itemsToOpen = PluginUtil.getTestManagers();
+ if (itemsToOpen.length > 1) {
+ TestManagerEditor[] selected = TestManagerSelectDialog.getTestManagerFromUser();
+ if (selected.length > 0) {
+ for(int i = 0; i < fullPath.length; i++){
+ handleItemsSelected(itemsToOpen, fullPath[i]);
+ }
+ }
+ } else {
+ for(int i = 0; i < fullPath.length; i++){
+ handleItemsSelected(itemsToOpen, fullPath[i]);
+ }
+ }
+ }
+
+ private void handleItemsSelected(TestManagerEditor[] items, String fullPath) {
+ for (TestManagerEditor tme : items) {
+ tme.addFile(fullPath);
+ }
+ openFirstItemSelected(items);
+ }
+
+ private void openFirstItemSelected(TestManagerEditor[] items) {
+ // Show first Test Manager Editor
+ TestManagerEditor tme = items[0];
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ page.activate(tme.getSite().getPart());
+ tme.activateScriptsPage();
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/AdvancedPage.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/AdvancedPage.java
new file mode 100644
index 000000000..0e3880cf0
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/AdvancedPage.java
@@ -0,0 +1,168 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.pages;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.ui.plugin.OseeUiActivator;
+import org.eclipse.osee.framework.ui.plugin.util.HelpUtil;
+import org.eclipse.osee.framework.ui.plugin.widgets.IPropertyStoreBasedControl;
+import org.eclipse.osee.framework.ui.plugin.widgets.PropertyStoreControlContributions;
+import org.eclipse.osee.ote.service.ConnectionEvent;
+import org.eclipse.osee.ote.ui.test.manager.core.TestManagerEditor;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+public class AdvancedPage extends TestManagerPage {
+
+ public static final OseeUiActivator plugin = TestManagerPlugin.getInstance();
+ private static final String pageName = "Advanced";
+ private final List<IPropertyStoreBasedControl> contributions;
+ private volatile boolean contributionsInitialized;
+
+ public AdvancedPage(Composite parent, int style, TestManagerEditor parentTestManager) {
+ super(parent, style, parentTestManager);
+ this.contributions = new ArrayList<>();
+ contributionsInitialized = false;
+ }
+
+ private synchronized List<IPropertyStoreBasedControl> getContributions() {
+ if (!contributionsInitialized) {
+ contributionsInitialized = true;
+ contributions.addAll(PropertyStoreControlContributions.getContributions(TestManagerPlugin.PLUGIN_ID));
+ }
+ return contributions;
+ }
+
+ @Override
+ public void createPage() {
+ super.createPage();
+ Composite parent = (Composite) getContent();
+ Composite extensionPanel = new Composite(parent, SWT.NONE);
+ GridLayout gL = new GridLayout();
+ gL.marginWidth = 0;
+ gL.marginHeight = 0;
+ extensionPanel.setLayout(gL);
+ extensionPanel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
+
+ Collections.sort(getContributions(), new Comparator<IPropertyStoreBasedControl>() {
+
+ @Override
+ public int compare(IPropertyStoreBasedControl o1, IPropertyStoreBasedControl o2) {
+ return Integer.valueOf(o1.getPriority()).compareTo(Integer.valueOf(o2.getPriority()));
+ }
+ });
+ for (IPropertyStoreBasedControl widget : getContributions()) {
+
+ try {
+ widget.createControl(extensionPanel);
+ } catch (Throwable e) {
+ TestManagerPlugin.log(Level.SEVERE, "problem creating advance page contribution", e);
+ }
+ }
+
+ createBlankArea(parent, 0, true);
+ computeScrollSize();
+
+ // TODO: Change to use OteHelpContext
+ HelpUtil.setHelp(this, "test_manager_advanced_page", "org.eclipse.osee.ote.help.ui");
+ }
+
+ @Override
+ public String getPageName() {
+ return pageName;
+ }
+
+ private Control createBlankArea(Composite parent, int height, boolean allVertical) {
+ Composite blank = new Composite(parent, SWT.NONE);
+ GridLayout gridLayout = new GridLayout();
+ GridData gd = new GridData();
+ gd.minimumHeight = height;
+ gd.grabExcessHorizontalSpace = true;
+ gd.grabExcessVerticalSpace = allVertical;
+ blank.setLayout(gridLayout);
+ blank.setLayoutData(gd);
+ return parent;
+ }
+
+ protected void createAreaDefaultLayout(Composite parent, boolean allHorizontal, boolean allVertical) {
+ GridLayout layout = new GridLayout();
+ GridData data = new GridData(GridData.FILL_BOTH);
+ data.grabExcessHorizontalSpace = allHorizontal;
+ data.grabExcessVerticalSpace = allVertical;
+ parent.setLayout(layout);
+ parent.setLayoutData(data);
+ }
+
+ @Override
+ public void saveData() {
+ IPropertyStore propertyStore = getTestManager().getPropertyStore();
+ for (IPropertyStoreBasedControl contribution : getContributions()) {
+ contribution.save(propertyStore);
+ }
+ }
+
+ @Override
+ public void restoreData() {
+ IPropertyStore propertyStore = getTestManager().getPropertyStore();
+ for (IPropertyStoreBasedControl contribution : getContributions()) {
+ contribution.load(propertyStore);
+ }
+ }
+
+ @Override
+ public boolean areSettingsValidForRun() {
+ boolean result = true;
+ for (IPropertyStoreBasedControl contribution : getContributions()) {
+ result &= contribution.areSettingsValid();
+ }
+ return result;
+ }
+
+ @Override
+ public String getErrorMessage() {
+ StringBuilder builder = new StringBuilder();
+ for (IPropertyStoreBasedControl contribution : getContributions()) {
+ String message = contribution.getErrorMessage();
+ if (Strings.isValid(message)) {
+ if (builder.length() > 0) {
+ builder.append("\n");
+ }
+ builder.append(message);
+ }
+ }
+ return builder.toString();
+ }
+
+ @Override
+ public boolean onConnection(ConnectionEvent event) {
+ return false;
+ }
+
+ @Override
+ public boolean onDisconnect(ConnectionEvent event) {
+ return false;
+ }
+
+ @Override
+ public boolean onConnectionLost() {
+ return false;
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/HostPage.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/HostPage.java
new file mode 100644
index 000000000..4ad76fa68
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/HostPage.java
@@ -0,0 +1,99 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.pages;
+
+import org.eclipse.osee.framework.ui.plugin.util.HelpUtil;
+import org.eclipse.osee.ote.service.ConnectionEvent;
+import org.eclipse.osee.ote.ui.test.manager.core.TestManagerEditor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Group;
+
+public class HostPage extends TestManagerPage {
+
+ private static final String pageName = "Hosts";
+
+ public HostPage(Composite parent, int style, TestManagerEditor parentTestManager) {
+ super(parent, style, parentTestManager);
+ createPage();
+
+ // TODO: Change to use OteHelpContext
+ HelpUtil.setHelp(this, "test_manager_hosts_page", "org.eclipse.osee.ote.help.ui");
+ }
+
+ @Override
+ public String getPageName() {
+ return pageName;
+ }
+
+ @Override
+ protected void createPage() {
+ super.createPage();
+ Composite parent = (Composite) getContent();
+
+ Group hostGroup = new Group(parent, SWT.NONE);
+ hostGroup.setLayout(new GridLayout());
+ hostGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ hostGroup.setText("Double click a Host to Connect/Disconnect");
+
+ getTestManager().createHostWidget(hostGroup);
+ setMinSize(0, 0);
+ }
+
+ @Override
+ public boolean areSettingsValidForRun() {
+ return getTestManager().isConnected();
+ }
+
+ @Override
+ public void restoreData() {
+ // Do Nothing
+ }
+
+ @Override
+ public void saveData() {
+ // Do Nothing
+ }
+
+ @Override
+ public String getErrorMessage() {
+ StringBuilder builder = new StringBuilder();
+ if (areSettingsValidForRun() != true) {
+ builder.append("Connect to a Test Server");
+ }
+ return builder.toString();
+ }
+
+ @Override
+ public boolean onConnection(ConnectionEvent event) {
+ return false;
+
+ }
+
+ @Override
+ public boolean onDisconnect(ConnectionEvent event) {
+ return false;
+
+ }
+
+ @Override
+ public boolean onConnectionLost() {
+ return false;
+ }
+
+ @Override
+ public void dispose() {
+ super.dispose();
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/ScriptPage.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/ScriptPage.java
new file mode 100644
index 000000000..c79672397
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/ScriptPage.java
@@ -0,0 +1,476 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.pages;
+
+import java.rmi.RemoteException;
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.logging.Level;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.plugin.OseeUiActivator;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.plugin.util.HelpUtil;
+import org.eclipse.osee.framework.ui.swt.Displays;
+import org.eclipse.osee.framework.ui.swt.ImageManager;
+import org.eclipse.osee.ote.service.ConnectionEvent;
+import org.eclipse.osee.ote.ui.test.manager.OteTestManagerImage;
+import org.eclipse.osee.ote.ui.test.manager.configuration.LoadWidget;
+import org.eclipse.osee.ote.ui.test.manager.configuration.SaveWidget;
+import org.eclipse.osee.ote.ui.test.manager.connection.ScriptManager;
+import org.eclipse.osee.ote.ui.test.manager.core.TestManagerEditor;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.jobs.ScriptRunJob;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ScriptTableViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.CoolBar;
+import org.eclipse.swt.widgets.CoolItem;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+
+public abstract class ScriptPage extends TestManagerPage {
+
+ private static final String NOT_CONNECTED = "<< NOT_CONNECTED >>";
+ private static final int ABORT_BTN_TIMER = 5000;
+
+ public enum UpdateableLabel {
+ HOSTLABEL,
+ CONFIGPATHLABEL;
+ }
+
+ public static final OseeUiActivator plugin = TestManagerPlugin.getInstance();
+ private static final String pageName = "Scripts";
+ private ToolItem abortButton;
+ private ToolItem abortBatchButton;
+ private CoolBar coolBar;
+ private ToolItem deleteButton;
+ private Label hostConnectLabel;
+ private LoadWidget loadWidget;
+ protected ToolItem runButton;
+ private SaveWidget saveWidget;
+ private ScriptTableViewer scriptTable;
+ private StatusWindowWidget statusWindow;
+ private final TestManagerEditor testManagerEditor;
+
+ public ScriptPage(Composite parent, int style, TestManagerEditor parentTestManager) {
+ super(parent, style, parentTestManager);
+ this.testManagerEditor = parentTestManager;
+ }
+
+ public void addFile(String fullPath) {
+ scriptTable.addFile(fullPath);
+ }
+
+ @Override
+ public void createPage() {
+ super.createPage();
+ Composite parent = (Composite) getContent();
+ coolBar = new CoolBar(parent, SWT.FLAT);
+
+ createControlsToolBar(coolBar);
+ createConfigurationToolBar(coolBar);
+ packCoolBar();
+
+ SashForm sashForm = new SashForm(parent, SWT.NONE);
+ sashForm.setLayout(new GridLayout());
+ sashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+ sashForm.setOrientation(SWT.VERTICAL);
+ sashForm.SASH_WIDTH = 3;
+
+ createScriptTableSection(sashForm);
+ createStatusWindow(sashForm);
+
+ sashForm.setWeights(new int[] {8, 2});
+ setMinSize(0, 0);
+
+ // TODO: Change to use OteHelpContext
+ HelpUtil.setHelp(this, "test_manager_scripts_page", "org.eclipse.osee.framework.help.ui");
+ }
+
+ public void loadStorageString() {
+ scriptTable.loadStorageString(testManagerEditor.loadValue(testManagerEditor.scriptsQualName));
+ }
+
+ @Override
+ public void dispose() {
+ scriptTable.dispose();
+ testManagerEditor.storeValue(testManagerEditor.scriptsQualName, scriptTable.getStorageString());
+ OseeLog.log(TestManagerPlugin.class, Level.INFO, "ScriptPage Dispose Called");
+ super.dispose();
+ }
+
+ public CoolBar getCoolBar() {
+ return coolBar;
+ }
+
+ public String getOFP() {
+ if (hostConnectLabel == null) {
+ return "";
+ }
+ return hostConnectLabel.getText();
+ }
+
+ @Override
+ public String getPageName() {
+ return pageName;
+ }
+
+ public String getScripts() {
+ if (scriptTable == null) {
+ return "";
+ } else if (scriptTable.getTaskList() == null) {
+ return "";
+ }
+ return scriptTable.getTaskList().toString();
+ }
+
+ public ScriptTableViewer getScriptTableViewer() {
+ return scriptTable;
+ }
+
+ public StatusWindowWidget getStatusWindow() {
+ return statusWindow;
+ }
+
+ public void onScriptRunning(final boolean running) {
+ AWorkbench.getDisplay().asyncExec(new Runnable() {
+ @Override
+ public void run() {
+ if(runButton.isDisposed()){
+ return;
+ }
+ if (running) {
+ runButton.setEnabled(false);
+ abortButton.setEnabled(true);
+ abortBatchButton.setEnabled(true);
+ } else {
+ runButton.setEnabled(true);
+ abortButton.setEnabled(false);
+ abortBatchButton.setEnabled(false);
+ }
+ }
+ });
+ }
+
+ public void packCoolBar() {
+ Point size = this.getSize();
+ coolBar.setSize(coolBar.computeSize(size.x, size.y));
+ }
+
+ private void createConfigurationToolBar(CoolBar coolBar) {
+ CoolItem configCoolItem = new CoolItem(coolBar, SWT.NONE);
+ ToolBar configToolBar = new ToolBar(coolBar, SWT.FLAT | SWT.HORIZONTAL);
+
+ saveWidget = new SaveWidget(this);
+ saveWidget.createToolItem(configToolBar);
+
+ loadWidget = new LoadWidget(this);
+ loadWidget.createToolItem(configToolBar);
+
+ deleteButton = new ToolItem(configToolBar, SWT.PUSH | SWT.CENTER);
+ deleteButton.setImage(ImageManager.getImage(OteTestManagerImage.FILE_DELETE));
+ deleteButton.setToolTipText("Deletes Selected (highlighted) Scripts");
+ deleteButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ handleDeleteButton();
+ }
+ });
+ deleteButton.addListener(SWT.MouseUp, new Listener() {
+ @Override
+ public void handleEvent(Event e) {
+ if (e.button == 3) {
+ handleDeleteButton();
+ }
+ }
+ });
+
+ configToolBar.pack();
+
+ Point size = configToolBar.getSize();
+ configCoolItem.setControl(configToolBar);
+ configCoolItem.setSize(configCoolItem.computeSize(size.x, size.y));
+ configCoolItem.setMinimumSize(size);
+ }
+
+ private void createControlsToolBar(CoolBar coolBar) {
+ CoolItem controlsCoolItem = new CoolItem(coolBar, SWT.NONE);
+ ToolBar controlsToolBar = new ToolBar(coolBar, SWT.FLAT | SWT.HORIZONTAL);
+
+ runButton = new ToolItem(controlsToolBar, SWT.PUSH | SWT.CENTER);
+ runButton.setImage(ImageManager.getImage(OteTestManagerImage.SEL_RUN_EXEC));
+ runButton.setDisabledImage(ImageManager.getImage(OteTestManagerImage.UNSEL_RUN_EXEC));
+ runButton.setToolTipText("Runs the Checked Scripts");
+ runButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ handleRunButton();
+ }
+ });
+ runButton.addListener(SWT.MouseUp, new Listener() {
+ @Override
+ public void handleEvent(Event e) {
+ if (e.button == 3) {
+ handleRunButton();
+ }
+ }
+ });
+ runButton.setEnabled(false);
+
+ // Create and configure the "Abort" button
+ abortButton = new ToolItem(controlsToolBar, SWT.PUSH | SWT.CENTER);
+ abortButton.setImage(ImageManager.getImage(OteTestManagerImage.SEL_ABORT_STOP));
+ abortButton.setDisabledImage(ImageManager.getImage(OteTestManagerImage.UNSEL_ABORT_STOP));
+ abortButton.setToolTipText("Abort Currently Running Script");
+ abortButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ handleAbortButton();
+ abortBatchButton.setEnabled(false);
+ abortButton.setEnabled(false);
+ Timer timer = new Timer();
+ timer.schedule(new EnabledAbortsTimer(), ABORT_BTN_TIMER);
+ }
+ });
+ abortButton.addListener(SWT.MouseUp, new Listener() {
+ @Override
+ public void handleEvent(Event e) {
+ if (e.button == 3) {
+ handleAbortButton();
+ abortBatchButton.setEnabled(false);
+ abortButton.setEnabled(false);
+ Timer timer = new Timer();
+ timer.schedule(new EnabledAbortsTimer(), ABORT_BTN_TIMER);
+ }
+ }
+ });
+ abortButton.setEnabled(false);
+
+ abortBatchButton = new ToolItem(controlsToolBar, SWT.PUSH | SWT.CENTER);
+ abortBatchButton.setImage(ImageManager.getImage(OteTestManagerImage.SEL_BATCH_ABORT_STOP));
+ abortBatchButton.setDisabledImage(ImageManager.getImage(OteTestManagerImage.UNSEL_BATCH_ABORT_STOP));
+ abortBatchButton.setToolTipText("Abort Script Batch");
+ abortBatchButton.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ handleBatchAbortButton();
+ abortBatchButton.setEnabled(false);
+ abortButton.setEnabled(false);
+ Timer timer = new Timer();
+ timer.schedule(new EnabledAbortsTimer(), ABORT_BTN_TIMER);
+ }
+ });
+ abortBatchButton.addListener(SWT.MouseUp, new Listener() {
+ @Override
+ public void handleEvent(Event e) {
+ if (e.button == 3) {
+ handleBatchAbortButton();
+ abortBatchButton.setEnabled(false);
+ abortButton.setEnabled(false);
+ Timer timer = new Timer();
+ timer.schedule(new EnabledAbortsTimer(), ABORT_BTN_TIMER);
+ }
+ }
+ });
+ abortBatchButton.setEnabled(false);
+
+ controlsToolBar.pack();
+
+ Point size = controlsToolBar.getSize();
+ controlsCoolItem.setControl(controlsToolBar);
+ controlsCoolItem.setSize(controlsCoolItem.computeSize(size.x, size.y));
+ controlsCoolItem.setMinimumSize(size);
+ }
+
+ private void createScriptTableSection(Composite parent) {
+ Composite composite = new Composite(parent, SWT.NONE);
+ composite.setLayout(new GridLayout());
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+ scriptTable = new ScriptTableViewer(composite, this.getTestManager());
+ // scriptTable.addDisposeListener(new DisposeListener() {
+ // public void widgetDisposed(DisposeEvent e) {
+ // testManagerEditor.storeValue(testManagerEditor.scriptsQualName, scriptTable.getStorageString());
+ // }
+ // });
+
+ }
+
+ private void createStatusWindow(Composite parent) {
+ statusWindow = new StatusWindowWidget(parent);
+
+ statusWindow.setLabelAndValue(UpdateableLabel.HOSTLABEL.name(), "Selected Host", NOT_CONNECTED, SWT.BOLD,
+ SWT.COLOR_DARK_RED);
+
+ String selectedFile = testManagerEditor.loadValue(testManagerEditor.configFileName);
+ if (!Strings.isValid(selectedFile)) {
+ selectedFile = testManagerEditor.getDefaultConfigPath();
+ testManagerEditor.storeValue(testManagerEditor.configFileName, selectedFile);
+ }
+ OseeLog.log(TestManagerPlugin.class, Level.INFO, "The default config is: " + selectedFile);
+
+ statusWindow.setLabelAndValue(UpdateableLabel.CONFIGPATHLABEL.name(), "Config File Path", selectedFile);
+
+ saveWidget.setStatusLabel(statusWindow);
+ loadWidget.setStatusLabel(statusWindow);
+
+ // // Status ICON Labels
+ // connectStatusIconLabel = new
+ // Label(statusWindow.getStatusIconComposite(), SWT.NONE);
+ // hostWidget.setConnectStatusLabel(connectStatusIconLabel);
+ // connectStatusIconLabel.setVisible(false);
+
+ statusWindow.refresh();
+ }
+
+ // TODO this stuff needs some updating too...
+ protected void handleAbortButton() {
+ TestManagerPlugin.getInstance().getOteConsoleService().write("Aborting Test Script...");
+ try {
+ getScriptManager().abortScript(false);
+ } catch (RemoteException e) {
+ TestManagerPlugin.getInstance().getOteConsoleService().writeError(Lib.exceptionToString(e));
+ }
+ }
+
+ // TODO this stuff needs some updating too...
+ protected void handleBatchAbortButton() {
+ TestManagerPlugin.getInstance().getOteConsoleService().write("Aborting Test Script Batch...");
+ try {
+ getScriptManager().abortScript(true);
+ } catch (RemoteException e) {
+ TestManagerPlugin.getInstance().getOteConsoleService().writeError(Lib.exceptionToString(e));
+ }
+ }
+
+ private void handleDeleteButton() {
+ scriptTable.removeSelectedTasks();
+ }
+
+ private void handleRunButton() {
+ ScriptRunJob runJob = new ScriptRunJob(getTestManager());
+ if (runJob.isRunAllowed()) {
+ runJob.setPriority(Job.LONG);
+ runJob.setUser(true);
+ runJob.schedule();
+ } else {
+ MessageDialog.openError(Displays.getActiveShell(), "Error", runJob.getErrorMessage());
+ }
+ }
+
+ private class EnabledAbortsTimer extends TimerTask {
+
+ @Override
+ public void run() {
+ Displays.ensureInDisplayThread(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ if (!runButton.isEnabled()) {
+ abortBatchButton.setEnabled(true);
+ abortButton.setEnabled(true);
+ }
+ } catch (Throwable th) {
+
+ }
+ }
+ });
+
+ }
+
+ }
+
+ @Override
+ public boolean areSettingsValidForRun() {
+ return getScriptTableViewer().getRunTasks().size() > 0;
+ }
+
+ @Override
+ public String getErrorMessage() {
+ StringBuilder builder = new StringBuilder();
+ if (getScriptTableViewer().getRunTasks().size() <= 0) {
+ builder.append("Scripts not selected.");
+ }
+ return builder.toString();
+ }
+
+ @Override
+ public boolean onConnection(final ConnectionEvent event) {
+ boolean result = getScriptManager().connect(event);
+ Displays.ensureInDisplayThread(new Runnable() {
+ @Override
+ public void run() {
+ runButton.setEnabled(true);
+ abortButton.setEnabled(false);
+ abortBatchButton.setEnabled(false);
+ scriptTable.onConnectionChanged(true);
+ statusWindow.setValue(UpdateableLabel.HOSTLABEL.name(), event.getProperties().getStation(), SWT.BOLD,
+ SWT.COLOR_DARK_GREEN);
+ statusWindow.refresh();
+ }
+
+ });
+ return result;
+ }
+
+ @Override
+ public boolean onDisconnect(ConnectionEvent event) {
+ boolean result = getScriptManager().disconnect(event);
+ Displays.ensureInDisplayThread(new Runnable() {
+ @Override
+ public void run() {
+ runButton.setEnabled(false);
+ abortButton.setEnabled(false);
+ abortBatchButton.setEnabled(false);
+ scriptTable.onConnectionChanged(false);
+ statusWindow.setValue(UpdateableLabel.HOSTLABEL.name(), NOT_CONNECTED, SWT.BOLD, SWT.COLOR_DARK_RED);
+ statusWindow.refresh();
+ }
+ });
+ return result;
+ }
+
+ @Override
+ public boolean onConnectionLost() {
+ boolean result = getScriptManager().onConnectionLost();
+ Displays.ensureInDisplayThread(new Runnable() {
+ @Override
+ public void run() {
+ runButton.setEnabled(false);
+ abortButton.setEnabled(false);
+ abortBatchButton.setEnabled(false);
+ scriptTable.onConnectionChanged(false);
+ statusWindow.setValue(UpdateableLabel.HOSTLABEL.name(), NOT_CONNECTED, SWT.BOLD, SWT.COLOR_DARK_RED);
+ statusWindow.refresh();
+ }
+ });
+ return result;
+ }
+
+ public abstract ScriptManager getScriptManager();
+
+ public void addFiles(String[] files) {
+ scriptTable.addFiles(files);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/StatusWindowWidget.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/StatusWindowWidget.java
new file mode 100644
index 000000000..61d168417
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/StatusWindowWidget.java
@@ -0,0 +1,137 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.pages;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.eclipse.osee.framework.ui.swt.Displays;
+import org.eclipse.osee.framework.ui.swt.FormattedText;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class StatusWindowWidget {
+ private final Map<String, Map<EntryAttribute, Object>> labelValueMap;
+ private final List<String> keys;
+ private final FormattedText statusTextArea;
+
+ private enum EntryAttribute {
+ LABEL,
+ VALUE,
+ STYLE,
+ COLOR;
+ }
+
+ public StatusWindowWidget(Composite parent) {
+ keys = new ArrayList<>();
+ labelValueMap = new HashMap<>();
+ statusTextArea = new FormattedText(parent, SWT.BORDER, SWT.DEFAULT, SWT.DEFAULT, false);
+ statusTextArea.setTextAreaBackground(SWT.COLOR_WHITE);
+ }
+
+ public void setLabelAndValue(String key, String label, String value, int style, int color) {
+ if (!keys.contains(key)) {
+ keys.add(key);
+ }
+ Map<EntryAttribute, Object> entry = new HashMap<>();
+ entry.put(EntryAttribute.LABEL, label);
+ entry.put(EntryAttribute.VALUE, value);
+ entry.put(EntryAttribute.STYLE, new Integer(style));
+ entry.put(EntryAttribute.COLOR, new Integer(color));
+
+ labelValueMap.put(key, entry);
+ }
+
+ public void setLabelAndValue(String key, String label, String value) {
+ setLabelAndValue(key, label, value, SWT.NORMAL, SWT.COLOR_BLACK);
+ }
+
+ public String getValue(String key) {
+ Map<EntryAttribute, Object> entry = labelValueMap.get(key);
+ EntryAttribute attribute = EntryAttribute.VALUE;
+ return entry != null && entry.get(attribute) != null ? (String) entry.get(attribute) : "";
+ }
+
+ public String getLabel(String key) {
+ Map<EntryAttribute, Object> entry = labelValueMap.get(key);
+ EntryAttribute attribute = EntryAttribute.LABEL;
+ return entry != null && entry.get(attribute) != null ? (String) entry.get(attribute) : "";
+ }
+
+ public void setLabel(String key, String label) {
+ Map<EntryAttribute, Object> entry = labelValueMap.get(key);
+ if (entry != null) {
+ entry.put(EntryAttribute.LABEL, label);
+ } else {
+ setLabelAndValue(key, label, "");
+ }
+ }
+
+ public void setValueStyle(String key, int style) {
+ Map<EntryAttribute, Object> entry = labelValueMap.get(key);
+ if (entry != null) {
+ entry.put(EntryAttribute.STYLE, new Integer(style));
+ }
+ }
+
+ public void setValueColor(String key, int color) {
+ Map<EntryAttribute, Object> entry = labelValueMap.get(key);
+ if (entry != null) {
+ entry.put(EntryAttribute.STYLE, new Integer(color));
+ }
+ }
+
+ public void setValue(String key, String value, int style, int color) {
+ Map<EntryAttribute, Object> entry = labelValueMap.get(key);
+ if (entry != null) {
+ entry.put(EntryAttribute.VALUE, value);
+ entry.put(EntryAttribute.STYLE, new Integer(style));
+ entry.put(EntryAttribute.COLOR, new Integer(color));
+ } else {
+ setLabelAndValue(key, "", value, style, color);
+ }
+ }
+
+ public void setValue(String key, String value) {
+ Map<EntryAttribute, Object> entry = labelValueMap.get(key);
+ if (entry != null) {
+ entry.put(EntryAttribute.VALUE, value);
+ } else {
+ setLabelAndValue(key, "", value);
+ }
+ }
+
+ public void refresh() {
+ Displays.ensureInDisplayThread(new Runnable() {
+ @Override
+ public void run() {
+ if(!statusTextArea.isDisposed()){
+ statusTextArea.clearTextArea();
+ for (String key : keys) {
+ Map<EntryAttribute, Object> entry = labelValueMap.get(key);
+ if (entry != null) {
+ String label = (String) entry.get(EntryAttribute.LABEL);
+ String value = (String) entry.get(EntryAttribute.VALUE);
+ Integer style = (Integer) entry.get(EntryAttribute.STYLE);
+ Integer color = (Integer) entry.get(EntryAttribute.COLOR);
+ statusTextArea.addText("\t" + label + ": ", SWT.BOLD, SWT.COLOR_DARK_BLUE);
+ statusTextArea.addText(value + "\n", style, color);
+ }
+ }
+ }
+ }
+ });
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/TestManagerPage.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/TestManagerPage.java
new file mode 100644
index 000000000..d35c44adc
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/TestManagerPage.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.pages;
+
+import org.eclipse.osee.ote.service.ConnectionEvent;
+import org.eclipse.osee.ote.ui.test.manager.core.TestManagerEditor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.ScrolledComposite;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * @author David Diepenbrock
+ */
+public abstract class TestManagerPage extends ScrolledComposite {
+
+ private final TestManagerEditor testManager;
+ private Composite mainComposite;
+
+ public TestManagerPage(Composite parent, int style, TestManagerEditor parentTestManager) {
+ super(parent, style | SWT.H_SCROLL | SWT.V_SCROLL);
+ this.testManager = parentTestManager;
+ }
+
+ protected void createPage() {
+ GridLayout gridLayout = new GridLayout(1, true);
+ this.setLayout(gridLayout);
+
+ this.mainComposite = new Composite(this, SWT.NONE);
+ this.mainComposite.setLayout(new GridLayout());
+ this.mainComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ this.setContent(mainComposite);
+ this.setExpandHorizontal(true);
+ this.setExpandVertical(true);
+ getVerticalBar().setIncrement(25);
+ getVerticalBar().setPageIncrement(200);
+ getHorizontalBar().setIncrement(25);
+ getHorizontalBar().setPageIncrement(200);
+ }
+
+ public void computeScrollSize() {
+ this.computeScrollSize(mainComposite);
+ }
+
+ private void computeScrollSize(Composite viewableArea) {
+ this.setMinSize(viewableArea.computeSize(SWT.DEFAULT, SWT.DEFAULT));
+ }
+
+ public TestManagerEditor getTestManager() {
+ return testManager;
+ }
+
+ public abstract String getPageName();
+
+ public abstract void saveData();
+
+ public abstract void restoreData();
+
+ public abstract boolean areSettingsValidForRun();
+
+ public abstract String getErrorMessage();
+
+ /**
+ * called when test manager is connected to a test host. A return value of true will cause test manager to prompt the
+ * user to check the log. Thus any problems that occur during connection processing should be handled and logged.
+ *
+ * @return true if there were problems during processing and false otherwise.
+ */
+ public abstract boolean onConnection(ConnectionEvent event);
+
+ public abstract boolean onDisconnect(ConnectionEvent event);
+
+ public abstract boolean onConnectionLost();
+
+ @Override
+ public void dispose() {
+ super.dispose();
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/contributions/ScriptExecutionContribution.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/contributions/ScriptExecutionContribution.java
new file mode 100644
index 000000000..b2b352fcc
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/contributions/ScriptExecutionContribution.java
@@ -0,0 +1,119 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.pages.contributions;
+
+import org.eclipse.osee.framework.jdk.core.type.IPropertyStore;
+import org.eclipse.osee.framework.ui.plugin.widgets.IPropertyStoreBasedControl;
+import org.eclipse.osee.ote.ui.test.manager.panels.FileOrDirectorySelectionPanel;
+import org.eclipse.osee.ote.ui.test.manager.panels.LoggingPanel;
+import org.eclipse.osee.ote.ui.test.manager.panels.ScriptExecutionOptionsPanel;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ScriptExecutionContribution implements IPropertyStoreBasedControl {
+ private static final String GROUP_TITLE = "Script Execution Options";
+ private static final String LOGGING_GROUP = "Select a logging level";
+ private static final String EXECUTION_OPTIONS_GROUP = "Execution Options";
+ private static final String SCRIPT_OUTPUT_TOOLTIP =
+ "If the path in the text box is an existing directory all files will be written there.\n" + "If the path is empty the files will be written to the same location as the script.\n" + "In all other cases the path will be relative to the parent project of the file.\n";
+ private static final String SCRIPT_OUTPUT_LABEL = "Script Output Directory: ";
+
+ private FileOrDirectorySelectionPanel scriptDirectoryPanel;
+ private LoggingPanel loggingPanel;
+ private ScriptExecutionOptionsPanel optionsPanel;
+
+ @Override
+ public Control createControl(Composite parent) {
+ Group group = new Group(parent, SWT.NONE);
+ group.setLayout(new GridLayout());
+ group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+ group.setText(GROUP_TITLE);
+
+ this.scriptDirectoryPanel =
+ new FileOrDirectorySelectionPanel(group, SWT.NONE, SCRIPT_OUTPUT_LABEL, SCRIPT_OUTPUT_TOOLTIP, true);
+
+ Composite composite = new Composite(group, SWT.NONE);
+ GridLayout gl = new GridLayout(2, false);
+ gl.marginHeight = 0;
+ gl.marginWidth = 0;
+ composite.setLayout(gl);
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
+
+ Group scriptOptionsGroup = new Group(composite, SWT.NONE);
+ scriptOptionsGroup.setLayout(new GridLayout());
+ scriptOptionsGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
+ scriptOptionsGroup.setText(EXECUTION_OPTIONS_GROUP);
+
+ this.optionsPanel = new ScriptExecutionOptionsPanel(scriptOptionsGroup, SWT.NONE);
+
+ Group loggingGroup = new Group(composite, SWT.NONE);
+ loggingGroup.setLayout(new GridLayout());
+ loggingGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
+ loggingGroup.setText(LOGGING_GROUP);
+
+ this.loggingPanel = new LoggingPanel(loggingGroup, SWT.NONE);
+ return group;
+ }
+
+ @Override
+ public void load(IPropertyStore propertyStore) {
+ this.scriptDirectoryPanel.setSelected(propertyStore.get(TestManagerStorageKeys.SCRIPT_OUTPUT_DIRECTORY_KEY));
+
+ this.optionsPanel.setKeepOldCopiesEnabled(propertyStore.getBoolean(TestManagerStorageKeys.KEEP_OLD_OUTFILE_COPIES_ENABLED_KEY));
+ this.optionsPanel.setBatchModeEnabled(propertyStore.getBoolean(TestManagerStorageKeys.BATCH_MODE_ENABLED_KEY));
+ this.optionsPanel.setAbortOnFail(propertyStore.getBoolean(TestManagerStorageKeys.ABORT_ON_FAIL_KEY));
+ this.optionsPanel.setPauseOnFail(propertyStore.getBoolean(TestManagerStorageKeys.PAUSE_ON_FAIL_KEY));
+ this.optionsPanel.setPrintFailToConsole(propertyStore.getBoolean(TestManagerStorageKeys.PRINT_FAIL_TO_CONSOLE));
+
+ this.loggingPanel.setSelected(propertyStore.get(TestManagerStorageKeys.LOGGING_LEVEL_KEY));
+ }
+
+ @Override
+ public void save(IPropertyStore propertyStore) {
+ propertyStore.put(TestManagerStorageKeys.SCRIPT_OUTPUT_DIRECTORY_KEY, this.scriptDirectoryPanel.getSelected());
+
+ propertyStore.put(TestManagerStorageKeys.LOGGING_LEVEL_KEY, this.loggingPanel.getSelected());
+
+ propertyStore.put(TestManagerStorageKeys.KEEP_OLD_OUTFILE_COPIES_ENABLED_KEY,
+ this.optionsPanel.isKeepOldCopiesEnabled());
+ propertyStore.put(TestManagerStorageKeys.BATCH_MODE_ENABLED_KEY, this.optionsPanel.isBatchModeEnabled());
+ propertyStore.put(TestManagerStorageKeys.ABORT_ON_FAIL_KEY, this.optionsPanel.isAbortOnFail());
+ propertyStore.put(TestManagerStorageKeys.PAUSE_ON_FAIL_KEY, this.optionsPanel.isPauseOnFail());
+ propertyStore.put(TestManagerStorageKeys.PRINT_FAIL_TO_CONSOLE, this.optionsPanel.isPrintFailToConsole());
+ }
+
+ @Override
+ public boolean areSettingsValid() {
+ return scriptDirectoryPanel.isValid();
+ }
+
+ @Override
+ public String getErrorMessage() {
+ StringBuilder builder = new StringBuilder();
+ if (scriptDirectoryPanel.isValid() != true) {
+ builder.append("Script Output Directory: ");
+ builder.append(scriptDirectoryPanel.getErrorMessage());
+ }
+ return builder.toString();
+ }
+
+ @Override
+ public int getPriority() {
+ return 0;
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/contributions/TestManagerStorageKeys.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/contributions/TestManagerStorageKeys.java
new file mode 100644
index 000000000..628b913aa
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/contributions/TestManagerStorageKeys.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.pages.contributions;
+
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TestManagerStorageKeys {
+
+ public static final String BATCH_MODE_ENABLED_KEY = "is.batch.mode.enabled";
+ public static final String KEEP_OLD_OUTFILE_COPIES_ENABLED_KEY = "is.keep.old.outfile.copies.enabled";
+ public static final String ABORT_ON_FAIL_KEY = "is.abort.mode.enabled";
+ public static final String PAUSE_ON_FAIL_KEY = "is.pause.mode.enabled";
+ public static final String PRINT_FAIL_TO_CONSOLE = "is.print.fail.enabled";
+ public static final String LOGGING_LEVEL_KEY = "logging.level";
+ public static final String SCRIPT_OUTPUT_DIRECTORY_KEY = "script.output.directory";
+
+ private TestManagerStorageKeys() {
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/ITaskListViewer.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/ITaskListViewer.java
new file mode 100644
index 000000000..1a2302136
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/ITaskListViewer.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.pages.scriptTable;
+
+public interface ITaskListViewer {
+
+ /**
+ * Update the view to reflect the fact that a task was added to the task list
+ */
+ public void addTask(ScriptTask task);
+
+ /**
+ * Update the view to reflect the fact that multiple tasks were added to the task list
+ */
+ public void addTasks(ScriptTask[] tasks);
+
+ /**
+ * Update the view to reflect the fact that a task was removed from the task list
+ */
+ public void removeTask(ScriptTask task);
+
+ /**
+ * Update the view to reflect the fact that one of the tasks was modified
+ */
+ public void updateTask(ScriptTask task);
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/ScriptTableViewer.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/ScriptTableViewer.java
new file mode 100644
index 000000000..59ab45060
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/ScriptTableViewer.java
@@ -0,0 +1,528 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.pages.scriptTable;
+
+import java.io.File;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Vector;
+import java.util.logging.Level;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.TreeSelection;
+import org.eclipse.nebula.widgets.xviewer.XViewer;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.OseeData;
+import org.eclipse.osee.framework.ui.plugin.OseeUiActivator;
+import org.eclipse.osee.framework.ui.plugin.PluginUiImage;
+import org.eclipse.osee.framework.ui.swt.ImageManager;
+import org.eclipse.osee.ote.ui.markers.MarkerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.configuration.ConfigFactory;
+import org.eclipse.osee.ote.ui.test.manager.configuration.ILoadConfig;
+import org.eclipse.osee.ote.ui.test.manager.configuration.ISaveConfig;
+import org.eclipse.osee.ote.ui.test.manager.core.TestManagerEditor;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.models.OutputModel;
+import org.eclipse.osee.ote.ui.test.manager.models.OutputModelJob;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.xscript.XScriptTable;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.xscript.XScriptTableContentProvider;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.xscript.XScriptTableLabelProvider;
+import org.eclipse.osee.ote.ui.test.manager.util.Dialogs;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DropTarget;
+import org.eclipse.swt.dnd.DropTargetAdapter;
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.swt.dnd.DropTargetListener;
+import org.eclipse.swt.dnd.FileTransfer;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.part.ResourceTransfer;
+
+public class ScriptTableViewer {
+
+ private final ScriptTaskList taskList = new ScriptTaskList();
+ private TestManagerEditor testManagerEditor = null;
+ final int POPUP_NAVIGATOR = 2;
+ final int POPUP_OUTPUT = 0;
+ final int POPUP_SCRIPT = 1;
+ final int POPUP_RESULTS = 3;
+ private XScriptTable scriptTable;
+
+ public ScriptTableViewer(Composite parent, TestManagerEditor editor) {
+ this.testManagerEditor = editor;
+ createWidget(parent);
+ }
+
+ public ScriptTableViewer(Composite parent, TestManagerEditor editor, List<ScriptTask> scriptList) {
+ this(parent, editor);
+ taskList.addTasks(scriptList);
+ }
+
+ public void addFile(String fullPath) {
+ processDroppedFiles(new String[] {fullPath});
+ }
+
+ /*
+ * Close the window and dispose of resources
+ */
+ public void close() {
+ // Shell shell = table.getShell();
+ // if (shell != null && !shell.isDisposed()) shell.dispose();
+ }
+
+ /**
+ * Release resources
+ */
+ public void dispose() {
+ scriptTable.dispose();
+ // Tell the label provider to release its resources
+ // tableViewer.getLabelProvider().dispose();
+ }
+
+ /**
+ * Return the column names in a collection
+ *
+ * @return List containing column names
+ */
+ // public List<String> getColumnNames() {
+ // return Arrays.asList(columnNames);
+ // }
+ /**
+ * Return the parent composite
+ */
+ // public Control getControl() {
+ // return table.getParent();
+ // }
+ /**
+ * Get all tasks marked for run.
+ *
+ * @return Vector of ScriptTask to run
+ */
+ public List<ScriptTask> getRunTasks() {
+ return scriptTable.getVisibleSortedScriptTasksToRun();
+ }
+
+ /**
+ * @return currently selected item
+ */
+ public ISelection getSelection() {
+ return scriptTable.getSelection();
+ }
+
+ /**
+ * Get string of scripts and run selections for storage
+ *
+ * @return <script>-ISRUN-, <script>, <script>-ISRUN
+ */
+ public String getStorageString() {
+ File file = OseeData.getFile("tm.xml");
+ String configFile = testManagerEditor.loadValue(testManagerEditor.configFileName);
+ ISaveConfig saveConfig =
+ ConfigFactory.getInstance().getSaveConfigHandler(testManagerEditor.getPageManager().getScriptPage());
+ try {
+ saveConfig.saveConfig(file);
+ } catch (Exception ex) {
+ Dialogs.popupError("Error Loading File",
+ String.format("Error loading file: [%s]\n%s", configFile, OseeUiActivator.getStackMessages(ex)));
+ }
+
+ return "file:";
+ }
+
+ /**
+ * Return the ExampleTaskList
+ */
+ public ScriptTaskList getTaskList() {
+ return taskList;
+ }
+
+ public Vector<ScriptTask> getTasks() {
+ return taskList.getTasks();
+ }
+
+ /**
+ * @return Returns the testManagerEditor.
+ */
+ public TestManagerEditor getTestManagerEditor() {
+ return testManagerEditor;
+ }
+
+ /**
+ * Set taskList from input list of scripts and run selections
+ *
+ * @param str <script>-ISRUN-, <script>, <script>-ISRUN
+ */
+ public void loadStorageString(String str) {
+ OseeLog.logf(TestManagerPlugin.class, Level.INFO, "Storage String [%s]", str);
+ if (str != null) {
+ if (str.equals("file:")) {
+ File configFile = OseeData.getFile("tm.xml");
+ ILoadConfig loadConfig =
+ ConfigFactory.getInstance().getLoadConfigHandler(this.testManagerEditor.getPageManager().getScriptPage());
+ try {
+ loadConfig.loadConfiguration(configFile);
+ } catch (Exception ex) {
+ Dialogs.popupError("Error Saving File",
+ String.format("Error saving file: [%s]\n%s", configFile, OseeUiActivator.getStackMessages(ex)));
+ }
+ } else {
+ String scripts[] = str.split(",");
+ for (int i = 0; i < scripts.length; i++) {
+ String script = scripts[i];
+ if (!script.equals("")) {
+ boolean run = false;
+ if (script.endsWith("-ISRUN-")) {
+ run = true;
+ script = script.replaceFirst("-ISRUN-", "");
+ }
+ try {
+ ScriptTask task = new ScriptTask(script, testManagerEditor.getAlternateOutputDir());
+ task.setRun(run);
+ taskList.addTask(task);
+ } catch (Exception ex) {
+ OseeLog.logf(TestManagerPlugin.class, Level.SEVERE,
+ ex, "Unable to add file [%s] to script view.", script);
+ }
+ }
+ }
+ }
+ }
+ refresh();
+ }
+
+ public void loadTasksFromList(Vector<ScriptTask> tasks) {
+ taskList.removeAllTasks();
+ taskList.addTasks(tasks);
+ refresh();
+ }
+
+ public void onConnectionChanged(boolean connected) {
+ taskList.onConnected(connected);
+ refresh();
+ }
+
+ public void refresh() {
+ scriptTable.refresh();
+ }
+
+ public void refresh(ScriptTask task) {
+ scriptTable.refresh(task);
+ }
+
+ public void removeSelectedTasks() {
+ IStructuredSelection sel = (IStructuredSelection) scriptTable.getSelection();
+ Iterator<?> iter = sel.iterator();
+ while (iter.hasNext()) {
+ ScriptTask task = (ScriptTask) iter.next();
+ if (task != null) {
+ taskList.removeTask(task);
+ }
+ }
+ refresh();
+ }
+
+ /**
+ * Calls setRun() on all of the tasks in the table with runState.
+ *
+ * @param runState - the state to set all of the tasks's run value to
+ */
+ public void setAllTasksRun(boolean runState) {
+ Iterator<ScriptTask> iter = taskList.getTasks().iterator();
+ while (iter.hasNext()) {
+ ScriptTask task = iter.next();
+ task.setRun(runState);
+ taskList.taskChanged(task);
+ }
+ refresh();
+ }
+
+ /**
+ * Create a new shell, add the widgets, open the shell
+ */
+ private void createWidget(Composite parent) {
+ scriptTable = new XScriptTable(parent, SWT.MULTI | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL);
+ scriptTable.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
+ scriptTable.setContentProvider(new XScriptTableContentProvider());
+ scriptTable.setLabelProvider(new XScriptTableLabelProvider(scriptTable));
+ scriptTable.setInput(taskList);
+ attachDragDropListener();
+ attachKeyListeners();
+ scriptTable.getMenuManager().addMenuListener(new IMenuListener() {
+ @Override
+ public void menuAboutToShow(IMenuManager manager) {
+ getPopupMenu();
+ }
+ });
+ }
+
+ private void attachDragDropListener() {
+ final FileTransfer fileTransfer = FileTransfer.getInstance();
+ final TextTransfer textTransfer = TextTransfer.getInstance();
+ final ResourceTransfer resourceTransfer = ResourceTransfer.getInstance();
+
+ final Transfer types[] = new Transfer[] {fileTransfer, textTransfer, resourceTransfer};
+ // Add Drag/Drop to Table
+ DropTargetListener scriptDropTargetListener = new DropTargetAdapter() {
+ @Override
+ public void drop(DropTargetEvent event) {
+ if (fileTransfer.isSupportedType(event.currentDataType)) {
+ processDroppedFiles((String[]) event.data);
+ } else if(textTransfer.isSupportedType(event.currentDataType)) {
+ processDroppedFiles((String[]) event.data);
+ } else if(resourceTransfer.isSupportedType(event.currentDataType)){
+ IResource[] resources = (IResource[])event.data;
+ String[] asStrings = new String[resources.length];
+ for(int i = 0; i < resources.length; i++) {
+ asStrings[i] = resources[i].getLocation().toOSString();
+ }
+ processDroppedFiles(asStrings);
+ }
+ }
+ @Override
+ public void dropAccept( DropTargetEvent event )
+ {
+ event.detail = DND.DROP_COPY;
+ }
+
+ @Override
+ public void dragEnter( DropTargetEvent event )
+ {
+ event.detail = DND.DROP_COPY;
+ }
+ };
+ // Setup drag/drop of files
+ int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_DEFAULT;
+ DropTarget scriptsTarget = new DropTarget(scriptTable.getTree(), operations);
+ scriptsTarget.setTransfer(types);
+ scriptsTarget.addDropListener(scriptDropTargetListener);
+ }
+
+ private void getPopupMenu() {
+
+ MenuManager menuManager = scriptTable.getMenuManager();
+
+ menuManager.insertBefore(XViewer.MENU_GROUP_PRE, new Action("Open Script") {
+ @Override
+ public void run() {
+ handlePopupMenu(POPUP_SCRIPT);
+ }
+ });
+ menuManager.insertBefore(XViewer.MENU_GROUP_PRE, new Action("Open Output File") {
+ @Override
+ public void run() {
+ handlePopupMenu(POPUP_OUTPUT);
+ }
+ });
+ menuManager.insertBefore(XViewer.MENU_GROUP_PRE, new Action("Refresh Output Results") {
+ @Override
+ public void run() {
+ handlePopupMenu(POPUP_RESULTS);
+ }
+ });
+ menuManager.insertBefore(XViewer.MENU_GROUP_PRE, new Action("Open in Package Explorer") {
+ @Override
+ public void run() {
+ handlePopupMenu(POPUP_NAVIGATOR);
+ }
+ });
+ menuManager.insertBefore(XViewer.MENU_GROUP_PRE, new Separator());
+ menuManager.insertBefore(XViewer.MENU_GROUP_PRE,
+ new Action("Set Selected to Run", ImageManager.getImageDescriptor(PluginUiImage.CHECKBOX_ENABLED)) {
+ @Override
+ public void run() {
+ IStructuredSelection sel = (IStructuredSelection) getSelection();
+ Iterator<?> iter = sel.iterator();
+ while (iter.hasNext()) {
+ ScriptTask task = (ScriptTask) iter.next();
+ task.setRun(true);
+ taskList.taskChanged(task);
+ }
+ refresh();
+ }
+ });
+ menuManager.insertBefore(XViewer.MENU_GROUP_PRE,
+ new Action("Set Selected to Not Run", ImageManager.getImageDescriptor(PluginUiImage.CHECKBOX_DISABLED)) {
+ @Override
+ public void run() {
+ IStructuredSelection sel = (IStructuredSelection) getSelection();
+ Iterator<?> iter = sel.iterator();
+ while (iter.hasNext()) {
+ ScriptTask task = (ScriptTask) iter.next();
+ task.setRun(false);
+ taskList.taskChanged(task);
+ }
+ refresh();
+ }
+ });
+ menuManager.insertBefore(XViewer.MENU_GROUP_PRE, new Separator());
+ menuManager.insertBefore(XViewer.MENU_GROUP_PRE,
+ new Action("Select All to Run", ImageManager.getImageDescriptor(PluginUiImage.CHECKBOX_ENABLED)) {
+ @Override
+ public void run() {
+ setAllTasksRun(true);
+ }
+ });
+ menuManager.insertBefore(XViewer.MENU_GROUP_PRE,
+ new Action("Deselect All to Run", ImageManager.getImageDescriptor(PluginUiImage.CHECKBOX_DISABLED)) {
+ @Override
+ public void run() {
+ setAllTasksRun(false);
+ }
+ });
+ menuManager.insertBefore(XViewer.MENU_GROUP_PRE, new Separator());
+
+ // item = new MenuItem(previewMenu, SWT.CASCADE);
+ // item.setText("Load Test Output Markers");
+ // item.addSelectionListener(new SelectionAdapter() {
+ //
+ // public void widgetSelected(SelectionEvent e) {
+ // TableItem items[] = table.getSelection();
+ // ScriptTask task = null;
+ // if (items.length > 0) {
+ // task = (ScriptTask) items[0].getData();
+ // testManagerEditor.processOutFile(task);
+ // }
+ // AWorkbench.popupView(IPageLayout.ID_PROBLEM_VIEW);
+ // }
+ // });
+ // item = new MenuItem(previewMenu, SWT.CASCADE);
+ // item.setText("Remove Test Output Markers");
+ // item.addSelectionListener(new SelectionAdapter() {
+ //
+ // public void widgetSelected(SelectionEvent e) {
+ // TableItem items[] = table.getSelection();
+ // ScriptTask task = null;
+ // if (items.length > 0) {
+ // task = (ScriptTask) items[0].getData();
+ // MarkerSupport.deleteMarkersFromInputFile(task.getScriptModel().getIFile());
+ // }
+ // }
+ // });
+ //
+ // item = new MenuItem(previewMenu, SWT.CASCADE);
+ // item.setText("Remove All Test Output Markers");
+ // item.addSelectionListener(new SelectionAdapter() {
+ //
+ // public void widgetSelected(SelectionEvent e) {
+ // MarkerSupport.deleteAllMarkers();
+ // }
+ // });
+
+ // item = new MenuItem(previewMenu, SWT.SEPARATOR);
+
+ // return previewMenu;
+ }
+
+ private void handlePopupMenu(int type) {
+ TreeSelection selection = (TreeSelection) scriptTable.getSelection();
+ Object objs = selection.getFirstElement();
+ if (objs instanceof ScriptTask) {
+ ScriptTask task = (ScriptTask) objs;
+ if (type == POPUP_SCRIPT) {
+ task.getScriptModel().openEditor();
+ } else if (type == POPUP_OUTPUT) {
+ task.getScriptModel().getOutputModel().openEditor();
+ refresh();
+ } else if (type == POPUP_NAVIGATOR) {
+ task.getScriptModel().openPackageExplorer();
+ } else if (type == POPUP_RESULTS) {
+ Iterator<?> it = selection.iterator();
+ while (it.hasNext()) {
+ ScriptTask currentTask = (ScriptTask) it.next();
+ OutputModelJob.getSingleton().addTask(currentTask);
+ }
+ }
+ }
+ }
+
+ private void processDroppedFiles(String files[]) {
+ for (int i = 0; i < files.length; i++) {
+ String toProcess = files[i];
+
+ if (toProcess.endsWith(".xml")) {
+ batchDropHandler(new File(toProcess));
+ } else {
+ if (toProcess.endsWith(".java") || toProcess.endsWith(".vxe") || !new File(toProcess).getName().matches(
+ ".*\\..*")) {
+ ScriptTask newTask = new ScriptTask(files[i], testManagerEditor.getAlternateOutputDir());
+ if (!taskList.contains(newTask)) {
+ // newTask.computeExists();
+ OutputModel outputModel = newTask.getScriptModel().getOutputModel();
+ if (outputModel != null) {
+ IFile outputIFile = outputModel.getIFile();
+ if (outputIFile != null && outputIFile.exists()) {
+ MarkerPlugin.addMarkers(newTask.getScriptModel().getOutputModel().getIFile());
+ }
+ }
+ taskList.addTask(newTask);
+ }
+ } else {
+ Dialogs.popupError("Invalid Drop", "Only Java scripts and cppUnit executables can be dropped here.");
+ OseeLog.log(TestManagerPlugin.class, Level.SEVERE, "not .java or cppExe file");
+ return;
+ }
+ }
+ }
+ refresh();
+ this.testManagerEditor.storeValue(testManagerEditor.scriptsQualName, getStorageString());
+ }
+
+ private void batchDropHandler(File batchFile) {
+ try {
+ ILoadConfig loadConfig =
+ ConfigFactory.getInstance().getLoadConfigHandler(testManagerEditor.getPageManager().getScriptPage());
+ loadConfig.loadConfiguration(batchFile);
+ } catch (Exception ex) {
+ Dialogs.popupError("Invalid Drop", String.format("Unable to read batch file\nFile [%s]\n%s",
+ (batchFile != null ? batchFile.getAbsolutePath() : "NULL"), OseeUiActivator.getStackMessages(ex)));
+ }
+ }
+
+ public StructuredViewer getXViewer() {
+ return scriptTable;
+ }
+
+ private void attachKeyListeners() {
+ scriptTable.getTree().addKeyListener(new KeyListener() {
+ @Override
+ public void keyPressed(KeyEvent e) {
+ }
+
+ @Override
+ public void keyReleased(KeyEvent e) {
+ if (e.character == SWT.DEL && (e.stateMask & SWT.CTRL) == 0) {
+ removeSelectedTasks();
+ refresh();
+ }
+ if (e.character == 'r') {
+ refresh();
+ }
+ }
+ });
+ }
+
+ public void addFiles(String[] files) {
+ processDroppedFiles(files);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/ScriptTask.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/ScriptTask.java
new file mode 100644
index 000000000..af00dc87c
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/ScriptTask.java
@@ -0,0 +1,181 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.pages.scriptTable;
+
+import org.eclipse.osee.framework.jdk.core.util.GUID;
+import org.eclipse.osee.ote.ui.test.manager.models.OutputModelJob;
+import org.eclipse.osee.ote.ui.test.manager.models.ScriptModel;
+import org.eclipse.osee.ote.ui.test.manager.models.ScriptModel.ScriptInteractionEnum;
+
+public class ScriptTask {
+
+ public enum ScriptStatusEnum {
+ CANCELLED,
+ CANCELLING,
+ COMPLETE,
+ IN_QUEUE,
+ INCOMPATIBLE,
+ INVALID,
+ NOT_CONNECTED,
+ READY,
+ RUNNING
+ }
+
+ private GUID guid = null;
+ private boolean run = true;
+ private ScriptModel scriptModel = null;
+
+ private ScriptStatusEnum status = ScriptStatusEnum.INCOMPATIBLE;
+
+ /**
+ * @param outputDir alternate output directory for tmo output files null will default to script directory
+ */
+ public ScriptTask(String rawFilename, String outputDir) {
+ scriptModel = new ScriptModel(rawFilename, outputDir);
+ updateStatusOnConnected(false);
+ OutputModelJob.getSingleton().addTask(this);
+ }
+
+ /**
+ * @return Returns the guid.
+ */
+ public GUID getGuid() {
+ return guid;
+ }
+
+ /**
+ * @return Returns the interaction.
+ */
+ public ScriptInteractionEnum getInteraction() {
+ return scriptModel.getInteraction();
+ }
+
+ /**
+ * @return Returns the name.
+ */
+ public String getName() {
+ if (scriptModel == null) {
+ return "";
+ } else {
+ return scriptModel.getName();
+ }
+ }
+
+ /**
+ * @return Returns the passFail.
+ */
+ public String getPassFail() {
+
+ int passTP = scriptModel.getOutputModel().getPassedTestPoints();
+ int failTP = scriptModel.getOutputModel().getFailedTestPoints();
+ if (status == ScriptStatusEnum.RUNNING && scriptModel.getOutputModel().isAborted()){
+ return "(0/0)";
+ }
+ if (scriptModel.getOutputModel().isAborted()) {
+ return "ABORTED";
+ } else if (passTP > 0 || failTP > 0) {
+ if (failTP == 0) {
+ return "PASS (" + passTP + ")";
+ } else {
+ return "FAIL (" + failTP + "/" + (passTP + failTP) + ")";
+ }
+ } else if (status == ScriptStatusEnum.RUNNING) {
+ return "(0/0)";
+ }
+ return "";
+ }
+
+ /**
+ * @return Returns the path.
+ */
+ public String getPath() {
+ return scriptModel.getPath();
+ }
+
+ /**
+ * @return Returns the scriptModel.
+ */
+ public ScriptModel getScriptModel() {
+ return scriptModel;
+ }
+
+ /**
+ * @return Returns the status.
+ */
+ public ScriptStatusEnum getStatus() {
+ return status;
+ }
+
+ public Boolean getRunStatus() {
+ return run;
+ }
+
+ /**
+ * @return Returns the outputExists.
+ */
+ public boolean isOutputExists() {
+ return scriptModel.getOutputModel().exists();
+
+ }
+
+ // public void computeExists() {
+ // exists = scriptModel.getOutputModel().exists();
+ // }
+
+ // public boolean isOutputReadonly() {
+ // return !scriptModel.getOutputModel().getFile().canWrite();
+ // }
+
+ /**
+ * @return Returns the run.
+ */
+ public boolean isRun() {
+ return run;
+ }
+
+ public boolean isRunnable() {
+ return isRun();// && status != ScriptStatusEnum.INCOMPATIBLE
+ // && status != ScriptStatusEnum.INVALID);
+ }
+
+ /**
+ * @param guid The guid to set.
+ */
+ public void setGuid(GUID guid) {
+ this.guid = guid;
+ }
+
+ /**
+ * @param run The run to set.
+ */
+ public void setRun(boolean run) {
+ this.run = run;
+ }
+
+ /**
+ * @param status The status to set.
+ */
+ public void setStatus(ScriptStatusEnum status) {
+ this.status = status;
+ }
+
+ public void updateStatusOnConnected(boolean connected) {
+ /* Always leave the status of INVALID alone */
+ if (status != ScriptStatusEnum.INVALID) {
+ /* If we're not connected, we'll leave the display blank */
+ if (!connected) {
+ status = ScriptStatusEnum.NOT_CONNECTED;
+ } else {
+ status = ScriptStatusEnum.READY;
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/ScriptTaskList.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/ScriptTaskList.java
new file mode 100644
index 000000000..50796e268
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/ScriptTaskList.java
@@ -0,0 +1,121 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.pages.scriptTable;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.Vector;
+
+public class ScriptTaskList {
+
+ private final Set<ITaskListViewer> changeListeners = new HashSet<>();
+ private final Vector<ScriptTask> tasks = new Vector<>();
+ private boolean isConnected = false;
+
+ /**
+ * Constructor
+ */
+ public ScriptTaskList() {
+ super();
+ }
+
+ public void addChangeListener(ITaskListViewer viewer) {
+ changeListeners.add(viewer);
+ }
+
+ /**
+ * Add a new task to the collection of tasks
+ */
+ public void addTask(ScriptTask inTask) {
+ inTask.updateStatusOnConnected(this.isConnected);
+ tasks.add(tasks.size(), inTask);
+ Iterator<ITaskListViewer> iterator = changeListeners.iterator();
+ while (iterator.hasNext()) {
+ iterator.next().addTask(inTask);
+ }
+ }
+
+ public void addTasks(List<ScriptTask> inTasks) {
+ for (ScriptTask task : inTasks) {
+ task.updateStatusOnConnected(isConnected);
+ }
+ ScriptTask[] array = new ScriptTask[inTasks.size()];
+ this.tasks.addAll(inTasks);
+ Iterator<ITaskListViewer> iterator = changeListeners.iterator();
+ while (iterator.hasNext()) {
+ iterator.next().addTasks(this.tasks.toArray(array));
+ }
+ }
+
+ /**
+ * Return the collection of ScriptTask
+ */
+ public Vector<ScriptTask> getTasks() {
+ return tasks;
+ }
+
+ public void onConnected(boolean connected) {
+ synchronized (tasks) {
+ this.isConnected = connected;
+ Iterator<ScriptTask> iter = tasks.iterator();
+ while (iter.hasNext()) {
+ ScriptTask task = iter.next();
+ // task.computeExists();
+ task.updateStatusOnConnected(connected);
+ }
+ }
+ }
+
+ public void removeAllTasks() {
+ this.tasks.removeAllElements();
+ }
+
+ public void removeChangeListener(ITaskListViewer viewer) {
+ changeListeners.remove(viewer);
+ }
+
+ public void removeTask(ScriptTask task) {
+ tasks.remove(task);
+ Iterator<ITaskListViewer> iterator = changeListeners.iterator();
+ while (iterator.hasNext()) {
+ iterator.next().removeTask(task);
+ }
+ }
+
+ public void taskChanged(ScriptTask task) {
+ Iterator<ITaskListViewer> iterator = changeListeners.iterator();
+ while (iterator.hasNext()) {
+ iterator.next().updateTask(task);
+ }
+ }
+
+ @Override
+ public String toString() {
+ String str = "";
+ for (int i = 0; i < tasks.size(); i++) {
+ ScriptTask task = tasks.get(i);
+ str += "\nTask " + task.getName() + " Status: " + task.getStatus();
+ }
+ return str + "\n\n";
+ }
+
+ public boolean contains(ScriptTask newTask) {
+ for (ScriptTask task : tasks) {
+ if (task.getPath().equals(newTask.getPath())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/xscript/XScriptTable.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/xscript/XScriptTable.java
new file mode 100644
index 000000000..afd7e05da
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/xscript/XScriptTable.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.xscript;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.nebula.widgets.xviewer.XViewer;
+import org.eclipse.nebula.widgets.xviewer.core.model.XViewerColumn;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ScriptTask;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.TreeColumn;
+import org.eclipse.swt.widgets.TreeItem;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XScriptTable extends XViewer {
+
+ public XScriptTable(Composite parent, int style) {
+ super(parent, style, new XScriptTableFactory(), false, false);
+ }
+
+ @Override
+ public void handleDoubleClick(TreeColumn col, TreeItem item) {
+ XViewerColumn xcol = (XViewerColumn) col.getData();
+ ScriptTask task = (ScriptTask) item.getData();
+ if (XScriptTableFactory.RESULT.equals(xcol) || XScriptTableFactory.OUPUT_FILE.equals(xcol)) {
+ task.getScriptModel().getOutputModel().openEditor();
+ } else if (XScriptTableFactory.TEST_LOCATION.equals(xcol)) {
+ task.getScriptModel().openPackageExplorer();
+ } else if (XScriptTableFactory.TEST.equals(xcol)) {// != k) {
+ task.getScriptModel().openEditor();
+ }
+ }
+
+ @Override
+ public boolean handleLeftClick(TreeColumn treeColumn, TreeItem treeItem) {
+ XViewerColumn aCol = (XViewerColumn) treeColumn.getData();
+ if (XScriptTableFactory.RUN.equals(aCol)) {
+ ScriptTask task = (ScriptTask) treeItem.getData();
+ task.setRun(!task.isRun());
+ refresh(task);
+ }
+ return super.handleLeftClick(treeColumn, treeItem);
+ }
+
+ @Override
+ public boolean handleLeftClickInIconArea(TreeColumn treeColumn, TreeItem treeItem) {
+ XViewerColumn aCol = (XViewerColumn) treeColumn.getData();
+ if (XScriptTableFactory.RUN.equals(aCol)) {
+ ScriptTask task = (ScriptTask) treeItem.getData();
+ task.setRun(!task.isRun());
+ refresh(task);
+ }
+ return super.handleLeftClickInIconArea(treeColumn, treeItem);
+ }
+
+ public List<ScriptTask> getVisibleSortedScriptTasksToRun() {
+ Object[] objs = getSortedChildren(getInput());
+ List<ScriptTask> runs = new ArrayList<>();
+ for (Object obj : objs) {
+ if (((ScriptTask) obj).isRun()) {
+ runs.add((ScriptTask) obj);
+ }
+ }
+ return runs;
+ }
+
+ public List<ScriptTask> getVisibibleSortedScriptTasks() {
+ Object[] objs = getSortedChildren(getInput());
+ List<ScriptTask> runs = new ArrayList<>();
+ for (Object obj : objs) {
+ runs.add((ScriptTask) obj);
+ }
+ return runs;
+ }
+
+ public boolean isRemoveItemsMenuOptionEnabled() {
+ return false;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/xscript/XScriptTableContentProvider.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/xscript/XScriptTableContentProvider.java
new file mode 100644
index 000000000..91c7bffb3
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/xscript/XScriptTableContentProvider.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.xscript;
+
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ITaskListViewer;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ScriptTask;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ScriptTaskList;
+
+/**
+ * @author Ken J. Aguilar
+ */
+public class XScriptTableContentProvider implements IStructuredContentProvider, ITaskListViewer, ITreeContentProvider {
+
+ @Override
+ public Object[] getElements(Object inputElement) {
+ return getChildren(inputElement);
+ }
+
+ @Override
+ public void dispose() {
+ }
+
+ @Override
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+
+ @Override
+ public void addTask(ScriptTask task) {
+ }
+
+ @Override
+ public void addTasks(ScriptTask[] tasks) {
+ }
+
+ @Override
+ public void removeTask(ScriptTask task) {
+ }
+
+ @Override
+ public void updateTask(ScriptTask task) {
+ }
+
+ @Override
+ public Object[] getChildren(Object parentElement) {
+ if (parentElement instanceof ScriptTaskList) {
+ return ((ScriptTaskList) parentElement).getTasks().toArray();
+ }
+ return null;
+ }
+
+ @Override
+ public Object getParent(Object element) {
+ return null;
+ }
+
+ @Override
+ public boolean hasChildren(Object element) {
+ Object[] children = getChildren(element);
+ if (children != null && children.length > 0) {
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/xscript/XScriptTableFactory.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/xscript/XScriptTableFactory.java
new file mode 100644
index 000000000..6b1cb7471
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/xscript/XScriptTableFactory.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.xscript;
+
+import java.io.File;
+import java.util.logging.Level;
+import org.eclipse.nebula.widgets.xviewer.XViewerFactory;
+import org.eclipse.nebula.widgets.xviewer.core.model.SortDataType;
+import org.eclipse.nebula.widgets.xviewer.core.model.XViewerAlign;
+import org.eclipse.nebula.widgets.xviewer.core.model.XViewerColumn;
+import org.eclipse.nebula.widgets.xviewer.customize.FileStoreCustomizations;
+import org.eclipse.nebula.widgets.xviewer.customize.IXViewerCustomizations;
+import org.eclipse.osee.framework.jdk.core.type.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.util.OseeData;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class XScriptTableFactory extends XViewerFactory {
+ private static String COLUMN_NAMESPACE = "xviewer.script.table";
+ public static XViewerColumn RUN = new XViewerColumn(COLUMN_NAMESPACE + ".run", "Run", 42, XViewerAlign.Left, true,
+ SortDataType.Boolean, false, null);
+ public static XViewerColumn TEST = new XViewerColumn(COLUMN_NAMESPACE + ".test", "Test", 275, XViewerAlign.Left, true,
+ SortDataType.String, false, null);
+ public static XViewerColumn STATUS = new XViewerColumn(COLUMN_NAMESPACE + ".status", "Status", 125, XViewerAlign.Left, true,
+ SortDataType.String, false, null);
+ public static XViewerColumn RESULT = new XViewerColumn(COLUMN_NAMESPACE + ".result", "Result", 125, XViewerAlign.Left, true,
+ SortDataType.String, false, null);
+ public static XViewerColumn OUPUT_FILE = new XViewerColumn(COLUMN_NAMESPACE + ".outfile", "Output File", 70,
+ XViewerAlign.Left, true, SortDataType.String, false, null);
+ public static XViewerColumn TEST_LOCATION = new XViewerColumn(COLUMN_NAMESPACE + ".testlocation", "Test Location",
+ 160, XViewerAlign.Left, true, SortDataType.String, false, null);
+
+ private final FileStoreCustomizations propertyStoreCustomizations;
+
+ private static final String defaultCustomDataXml =
+ "<XTreeProperties name=\"default\" namespace=\"xviewer.script.table\" guid=\"710h7sah9dtt01464nvkkv\"><xSorter><id>xviewer.script.table.test</id></xSorter><xSorter><id>xviewer.script.table.test</id></xSorter><xFilter></xFilter><xCol><id>xviewer.script.table.run</id><name>Run</name><wdth>42</wdth><algn>left</algn><srtFwd>true</srtFwd><show>true</show></xCol><xCol><id>xviewer.script.table.test</id><name>Test</name><wdth>351</wdth><algn>left</algn><srtFwd>true</srtFwd><show>true</show></xCol><xCol><id>xviewer.script.table.result</id><name>Result</name><wdth>110</wdth><algn>left</algn><srtFwd>true</srtFwd><show>true</show></xCol><xCol><id>xviewer.script.table.status</id><name>Status</name><wdth>125</wdth><algn>left</algn><srtFwd>true</srtFwd><show>true</show></xCol><xCol><id>xviewer.script.table.outfile</id><name>Output File</name><wdth>75</wdth><algn>left</algn><srtFwd>true</srtFwd><show>true</show></xCol><xCol><id>xviewer.script.table.testlocation</id><name>Test Location</name><wdth>160</wdth><algn>left</algn><srtFwd>true</srtFwd><show>true</show></xCol></XTreeProperties>";
+
+ public XScriptTableFactory() {
+ super(COLUMN_NAMESPACE);
+ File folder;
+ try {
+ folder = OseeData.getFolder("OteScriptTable").getLocation().toFile();
+ } catch (OseeCoreException ex) {
+ OseeLog.log(XScriptTableFactory.class, Level.SEVERE, ex);
+ folder = new File(System.getProperty("java.io.tmpdir"));
+ }
+ propertyStoreCustomizations =
+ new FileStoreCustomizations(folder, "OteScript", ".xml", "DefaultOteScript.xml", defaultCustomDataXml);
+ registerColumns(RUN, TEST, RESULT, STATUS, OUPUT_FILE, TEST_LOCATION);
+ }
+
+ @Override
+ public IXViewerCustomizations getXViewerCustomizations() {
+ return propertyStoreCustomizations;
+ }
+
+ @Override
+ public boolean isAdmin() {
+ return true;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/xscript/XScriptTableLabelProvider.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/xscript/XScriptTableLabelProvider.java
new file mode 100644
index 000000000..0fb36e4bd
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/pages/scriptTable/xscript/XScriptTableLabelProvider.java
@@ -0,0 +1,125 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.xscript;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.nebula.widgets.xviewer.XViewerLabelProvider;
+import org.eclipse.nebula.widgets.xviewer.core.model.XViewerColumn;
+import org.eclipse.osee.framework.ui.plugin.OseeUiActivator;
+import org.eclipse.osee.framework.ui.swt.ImageManager;
+import org.eclipse.osee.ote.ui.test.manager.OteTestManagerImage;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ScriptTask;
+import org.eclipse.osee.ote.ui.test.manager.pages.scriptTable.ScriptTask.ScriptStatusEnum;
+import org.eclipse.swt.graphics.Image;
+
+public class XScriptTableLabelProvider extends XViewerLabelProvider {
+ public static final OseeUiActivator plugin = TestManagerPlugin.getInstance();
+ private static Image checkedImage = ImageManager.getImage(OteTestManagerImage.CHECKBOX_ENABLED);
+ private static Image outputImage = ImageManager.getImage(OteTestManagerImage.CHECK);
+ private static Map<ScriptStatusEnum, Image> statusImage = new HashMap<>();
+ private static Image uncheckedImage = ImageManager.getImage(OteTestManagerImage.CHECKBOX_DISABLED);
+
+ public XScriptTableLabelProvider(XScriptTable viewer) {
+ super(viewer);
+ if (statusImage.isEmpty()) {
+ statusImage.put(ScriptStatusEnum.NOT_CONNECTED, ImageManager.getImage(OteTestManagerImage.ALERT_OBJ));
+ statusImage.put(ScriptStatusEnum.READY, ImageManager.getImage(OteTestManagerImage.SCRIPT_READY_SM));
+ statusImage.put(ScriptStatusEnum.IN_QUEUE, ImageManager.getImage(OteTestManagerImage.SCRIPT_IN_QUEUE_SM));
+ statusImage.put(ScriptStatusEnum.RUNNING, ImageManager.getImage(OteTestManagerImage.SCRIPT_RUNNING));
+ statusImage.put(ScriptStatusEnum.COMPLETE, ImageManager.getImage(OteTestManagerImage.SCRIPT_COMPLETE_SM));
+ statusImage.put(ScriptStatusEnum.CANCELLED, ImageManager.getImage(OteTestManagerImage.SCRIPT_CANCELLED_SM));
+ statusImage.put(ScriptStatusEnum.CANCELLING, ImageManager.getImage(OteTestManagerImage.SCRIPT_CANCELLING_SM));
+ statusImage.put(ScriptStatusEnum.INVALID, ImageManager.getImage(OteTestManagerImage.ERROR_STACK));
+ statusImage.put(ScriptStatusEnum.INCOMPATIBLE, ImageManager.getImage(OteTestManagerImage.ERROR_STACK));
+ }
+ };
+
+ private Image getOutputImage(ScriptTask task) {
+ if (task.isOutputExists()) {
+ return outputImage;
+ }
+ return null;
+ }
+
+ private Image getPassFailImage(ScriptTask task) {
+ Matcher m = Pattern.compile("(FAIL|ABORTED)").matcher(task.getPassFail());
+ if (m.find()) {
+ return statusImage.get(ScriptStatusEnum.INVALID);
+ }
+ return null;
+ }
+
+ /**
+ * Returns the image with the given key, or <code>null</code> if not found.
+ */
+ private Image getRunImage(boolean isSelected) {
+ return isSelected ? checkedImage : uncheckedImage;
+ }
+
+ private Image getStatusImage(ScriptStatusEnum status) {
+ return statusImage.get(status);
+ }
+
+ @Override
+ public Image getColumnImage(Object element, XViewerColumn col, int columnIndex) throws Exception {
+ if (XScriptTableFactory.OUPUT_FILE.equals(col)) {
+ return getOutputImage(((ScriptTask) element));
+ } else if (XScriptTableFactory.RUN.equals(col)) {
+ return getRunImage(((ScriptTask) element).isRun());
+ } else if (XScriptTableFactory.STATUS.equals(col)) {
+ return getStatusImage(((ScriptTask) element).getStatus());
+ } else if (XScriptTableFactory.RESULT.equals(col)) {
+ return getPassFailImage(((ScriptTask) element));
+ }
+ return null;
+ }
+
+ @Override
+ public String getColumnText(Object element, XViewerColumn col, int columnIndex) throws Exception {
+ ScriptTask task = (ScriptTask) element;
+ if (XScriptTableFactory.STATUS.equals(col)) {
+ return task.getStatus().toString();
+ } else if (XScriptTableFactory.RESULT.equals(col)) {
+ return task.getPassFail();
+ } else if (XScriptTableFactory.TEST.equals(col)) {
+ return task.getName();
+ } else if (XScriptTableFactory.TEST_LOCATION.equals(col)) {
+ return task.getPath();
+ } else if (XScriptTableFactory.RUN.equals(col)) {
+ return task.getRunStatus().toString();
+ }
+
+ return "";
+ }
+
+ @Override
+ public void addListener(ILabelProviderListener listener) {
+ }
+
+ @Override
+ public void dispose() {
+ }
+
+ @Override
+ public boolean isLabelProperty(Object element, String property) {
+ return false;
+ }
+
+ @Override
+ public void removeListener(ILabelProviderListener listener) {
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/panels/FileOrDirectorySelectionPanel.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/panels/FileOrDirectorySelectionPanel.java
new file mode 100644
index 000000000..3aa64e986
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/panels/FileOrDirectorySelectionPanel.java
@@ -0,0 +1,160 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.panels;
+
+import java.io.File;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
+import org.eclipse.osee.framework.ui.swt.ImageManager;
+import org.eclipse.osee.ote.ui.test.manager.OteTestManagerImage;
+import org.eclipse.osee.ote.ui.test.manager.util.Dialogs;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.DirectoryDialog;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class FileOrDirectorySelectionPanel extends Composite {
+
+ private static final Image FILE_SELECT_IMAGE = ImageManager.getImage(OteTestManagerImage.FILE);
+ private static final String DIRECTORY_ERROR_MESSAGE = "Directory should be blank or set an accessible directory.";
+ private static final String FILE_ERROR_MESSAGE = "Unable to access file.";
+ private static final String DEFAULT_FILE = "/dev/null";
+
+ private StyledText textField;
+ private Label labelField;
+ private final String labelText;
+ private final String toolTipText;
+ private final boolean isDirectory;
+
+ public FileOrDirectorySelectionPanel(Composite parent, int style, String labelText, String toolTipText, boolean isDirectory) {
+ super(parent, style);
+ this.labelText = labelText;
+ this.toolTipText = toolTipText;
+ this.isDirectory = isDirectory;
+ GridLayout gl = new GridLayout(3, false);
+ gl.marginHeight = 0;
+ gl.marginWidth = 0;
+ this.setLayout(gl);
+ this.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+ createControl(this);
+ }
+
+ private void createControl(Composite parent) {
+ labelField = new Label(parent, SWT.NONE);
+ labelField.setLayoutData(new GridData(SWT.BEGINNING, SWT.FILL, false, false));
+ labelField.setText(labelText);
+ labelField.setToolTipText(toolTipText);
+
+ textField = new StyledText(parent, SWT.BORDER);
+ textField.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+
+ if (isDirectory != true) {
+ textField.setText(DEFAULT_FILE);
+ }
+ Button fileDialog = new Button(parent, SWT.NONE);
+ fileDialog.setLayoutData(new GridData(SWT.FILL, SWT.END, false, false));
+ fileDialog.setImage(FILE_SELECT_IMAGE);
+ fileDialog.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ createDialog();
+ }
+ });
+
+ }
+
+ private void createDialog() {
+ Shell shell = AWorkbench.getActiveShell();
+ String selection = "";
+ if (isDirectory == true) {
+ DirectoryDialog directoryDialog = new DirectoryDialog(shell, SWT.OPEN);
+
+ String defaultDir = textField.getText();
+ File dir = new File(defaultDir);
+ if (dir.isFile() || dir.isDirectory()) {
+ directoryDialog.setFilterPath(defaultDir);
+ } else {
+ directoryDialog.setFilterPath("Y:\\");
+ }
+ selection = directoryDialog.open();
+ } else {
+ FileDialog fileDialog = new FileDialog(shell, SWT.OPEN);
+ selection = fileDialog.open();
+ }
+ setSelected(selection);
+ }
+
+ private void verifySelection() {
+ String text = getSelected();
+ if (isValid() != true) {
+ if (isDirectory == true) {
+ text = "";
+ } else {
+ text = DEFAULT_FILE;
+ }
+ Dialogs.popupError("Error", getErrorMessage());
+ }
+ if (textField.getText().equals(text) != true) {
+ textField.setText(text);
+ }
+ }
+
+ private boolean isValidFile(String text) {
+ File file = new File(text);
+ return file != null && file.exists() != false && file.canWrite() != false;
+ }
+
+ public boolean isValid() {
+ boolean toReturn = false;
+ String text = getSelected();
+ if (isDirectory == true) {
+ toReturn = Strings.isValid(text) == true ? isValidFile(text) : true;
+ } else {
+ // if (Strings.isValid(text) == true) {
+ // if (text.equals(DEFAULT_FILE) == true) {
+ toReturn = true;
+ // } else {
+ // toReturn = isValidFile(text);
+ // }
+ // }
+ }
+ return toReturn;
+ }
+
+ public String getErrorMessage() {
+ return isDirectory == true ? DIRECTORY_ERROR_MESSAGE : FILE_ERROR_MESSAGE;
+ }
+
+ public String getSelected() {
+ return textField != null && textField.isDisposed() != true ? textField.getText() : "";
+ }
+
+ public void setSelected(String value) {
+ if (textField != null && textField.isDisposed() != true) {
+ if (Strings.isValid(value)) {
+ textField.setText(value);
+ }
+ verifySelection();
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/panels/LoggingPanel.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/panels/LoggingPanel.java
new file mode 100644
index 000000000..7139e96ed
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/panels/LoggingPanel.java
@@ -0,0 +1,137 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.panels;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class LoggingPanel extends Composite {
+
+ private enum LoggingLevel {
+ Minimal(Level.WARNING),
+ Detailed(Level.INFO),
+ All(Level.ALL);
+
+ private Level level;
+
+ LoggingLevel(Level level) {
+ this.level = level;
+ }
+
+ public Level getLevel() {
+ return level;
+ }
+
+ public static LoggingLevel fromLevel(Level value) {
+ LoggingLevel toReturn = LoggingLevel.Detailed;
+ if (value != null) {
+ for (LoggingLevel formatType : LoggingLevel.values()) {
+ if (formatType.getLevel().equals(value)) {
+ toReturn = formatType;
+ break;
+ }
+ }
+ }
+ return toReturn;
+ }
+
+ }
+
+ private Map<LoggingLevel, Button> buttonMap;
+ private LoggingLevel lastSelected;
+
+ public LoggingPanel(Composite parent, int style) {
+ super(parent, style);
+ GridLayout gl = new GridLayout();
+ gl.marginHeight = 0;
+ gl.marginWidth = 0;
+ this.setLayout(gl);
+ this.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+ createControl(this);
+ }
+
+ private void createControl(Composite parent) {
+ LoggingLevel[] levels = LoggingLevel.values();
+ this.buttonMap = new HashMap<>();
+ Composite composite = new Composite(parent, SWT.NONE);
+ GridLayout gl = new GridLayout();
+ gl.marginHeight = 0;
+ gl.marginWidth = 0;
+ composite.setLayout(gl);
+ composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
+
+ for (int index = 0; index < levels.length; index++) {
+ LoggingLevel level = levels[index];
+
+ Button button = new Button(composite, SWT.RADIO);
+ button.setData(level);
+ button.setText(level.name());
+ button.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ Object object = e.getSource();
+ if (object instanceof Button) {
+ setSelected((Button) object);
+ }
+ }
+
+ });
+ boolean isDefault = index == 1;
+ button.setSelection(isDefault);
+ if (isDefault != false) {
+ lastSelected = level;
+ }
+ buttonMap.put(level, button);
+ }
+ }
+
+ private void setSelected(Button button) {
+ if (button.getSelection() != false) {
+ lastSelected = (LoggingLevel) button.getData();
+ }
+ }
+
+ public String getSelected() {
+ return lastSelected.getLevel().toString();
+ }
+
+ public void setSelected(String value) {
+ Level level = LoggingLevel.Detailed.getLevel();
+ try {
+ level = Level.parse(value);
+ } catch (Exception ex) {
+ OseeLog.logf(TestManagerPlugin.class, Level.WARNING,
+ "Error parsing log level [%s] using default [%s]", value, level);
+ }
+
+ LoggingLevel loggingLevel = LoggingLevel.fromLevel(level);
+ this.lastSelected = loggingLevel;
+ for (LoggingLevel keys : buttonMap.keySet()) {
+ Button button = buttonMap.get(keys);
+ button.setSelection(keys.equals(loggingLevel));
+ }
+ }
+
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/panels/ScriptExecutionOptionsPanel.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/panels/ScriptExecutionOptionsPanel.java
new file mode 100644
index 000000000..6b41c5e52
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/panels/ScriptExecutionOptionsPanel.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.panels;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class ScriptExecutionOptionsPanel extends Composite {
+ private Button saveOutputCheck;
+ private Button batchModeCheck;
+ private Button abortScriptOnFirstFail;
+ private Button pauseScriptOnFail;
+ private Button printFailToConsole;
+
+ public ScriptExecutionOptionsPanel(Composite parent, int style) {
+ super(parent, style);
+ GridLayout gl = new GridLayout();
+ gl.marginHeight = 0;
+ gl.marginWidth = 0;
+ this.setLayout(gl);
+ this.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+ createControl(this);
+ }
+
+ private void createControl(Composite parent) {
+ saveOutputCheck = new Button(parent, SWT.CHECK);
+ saveOutputCheck.setText("Keep copies of old Output Files");
+ saveOutputCheck.setToolTipText("Select to save existing output filename\n" + "to file \"<output>.[num].tmo\" for each succssive run.\n" + "De-select overwrites output file.\n\n" + " eg. myScript.tmo = current output\n" + " myScript.1.tmo = oldest output file\n" + " myScript.2.tmo = output before current");
+
+ batchModeCheck = new Button(parent, SWT.CHECK);
+ batchModeCheck.setText("Run in batch mode");
+ batchModeCheck.setToolTipText("If any prompts exist, they are skipped if this option is selected.");
+
+ abortScriptOnFirstFail = new Button(parent, SWT.CHECK);
+ abortScriptOnFirstFail.setText("Abort script on first fail");
+ abortScriptOnFirstFail.setToolTipText("Any script fail will cause the current script to be aborted.");
+
+ pauseScriptOnFail = new Button(parent, SWT.CHECK);
+ pauseScriptOnFail.setText("Pause script on fail");
+ pauseScriptOnFail.setToolTipText("Each script failure will cause a promptPause to occur.");
+
+ printFailToConsole = new Button(parent, SWT.CHECK);
+ printFailToConsole.setText("Print failures to console");
+ printFailToConsole.setToolTipText("Prints each failure to the console as the script runs.");
+ }
+
+ public boolean isKeepOldCopiesEnabled() {
+ return saveOutputCheck.getSelection();
+ }
+
+ public void setKeepOldCopiesEnabled(boolean isEnabled) {
+ saveOutputCheck.setSelection(isEnabled);
+ }
+
+ public boolean isBatchModeEnabled() {
+ return batchModeCheck.getSelection();
+ }
+
+ public void setBatchModeEnabled(boolean isEnabled) {
+ batchModeCheck.setSelection(isEnabled);
+ }
+
+ public boolean isAbortOnFail(){
+ return abortScriptOnFirstFail.getSelection();
+ }
+
+ public void setAbortOnFail(boolean isEnabled){
+ abortScriptOnFirstFail.setSelection(isEnabled);
+ }
+
+ public boolean isPauseOnFail(){
+ return pauseScriptOnFail.getSelection();
+ }
+
+ public void setPauseOnFail(boolean isEnabled){
+ pauseScriptOnFail.setSelection(isEnabled);
+ }
+
+ public boolean isPrintFailToConsole(){
+ return printFailToConsole.getSelection();
+ }
+
+ public void setPrintFailToConsole(boolean isEnabled){
+ printFailToConsole.setSelection(isEnabled);
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/preferences/TestManagerPreferencePage.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/preferences/TestManagerPreferencePage.java
new file mode 100644
index 000000000..06e2e7b0d
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/preferences/TestManagerPreferencePage.java
@@ -0,0 +1,101 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.preferences;
+
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.eclipse.osee.ote.ui.test.manager.preferences.environment.EnvironmentPreferencePage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TestManagerPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
+
+ public static final String TEST_MANAGER_KEY = "org.eclipse.osee.ote.ui.test.manager.PreferencePage";
+ private EnvironmentPreferencePage environmentPreferencePage;
+
+ @Override
+ public void init(IWorkbench workbench) {
+ // Initialize the preference store we wish to use
+ setPreferenceStore(TestManagerPlugin.getInstance().getPreferenceStore());
+ }
+
+ @Override
+ public boolean performOk() {
+ environmentPreferencePage.storeVariables();
+
+ return super.performOk();
+ }
+
+ private Control createBlankArea(Composite parent, int height, boolean allVertical) {
+ Composite blank = new Composite(parent, SWT.NONE);
+ GridLayout gridLayout = new GridLayout();
+ GridData gd = new GridData();
+ gd.minimumHeight = height;
+ gd.grabExcessHorizontalSpace = true;
+ gd.grabExcessVerticalSpace = allVertical;
+ blank.setLayout(gridLayout);
+ blank.setLayoutData(gd);
+ return parent;
+ }
+
+ private Control createDefaultEvironmentVariablesArea(Composite parent) {
+
+ SashForm sashForm = new SashForm(parent, SWT.VERTICAL);
+ GridLayout gridLayout = new GridLayout();
+ gridLayout.numColumns = 1;
+
+ GridData d = new GridData(GridData.FILL_BOTH);
+ d.grabExcessHorizontalSpace = true;
+ d.grabExcessVerticalSpace = true;
+ sashForm.setLayout(gridLayout);
+ sashForm.setLayoutData(d);
+
+ environmentPreferencePage = new EnvironmentPreferencePage(sashForm);
+
+ return parent;
+ }
+
+ private void createPageDescription(Composite parent) {
+ new Label(parent, SWT.NONE).setText("Test Manager Settings:");
+ }
+
+ @Override
+ protected Control createContents(Composite parent) {
+
+ createPageDescription(parent);
+ createBlankArea(parent, 0, false);
+ createDefaultEvironmentVariablesArea(parent);
+ // createBlankArea(parent, 300, true);
+
+ return parent;
+ }
+
+ @Override
+ protected void performApply() {
+ performOk();
+ }
+
+ @Override
+ protected void performDefaults() {
+
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/preferences/environment/EnvironmentPageDataViewer.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/preferences/environment/EnvironmentPageDataViewer.java
new file mode 100644
index 000000000..eeebfb510
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/preferences/environment/EnvironmentPageDataViewer.java
@@ -0,0 +1,136 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.preferences.environment;
+
+import java.util.ArrayList;
+import org.eclipse.osee.framework.ui.swt.Displays;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyleRange;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class EnvironmentPageDataViewer {
+
+ private Group environmentVariable;
+ private EnvironmentPreferenceNode nodeToDisplay;
+ private final ArrayList<StyleRange> styleArray;
+ private StyledText textArea;
+
+ public EnvironmentPageDataViewer(Composite parent) {
+ createArea(parent);
+ styleArray = new ArrayList<>();
+ }
+
+ public void clearTextArea() {
+ textArea.setText("");
+ styleArray.clear();
+ textArea.redraw();
+ }
+
+ public void setNodeToDisplay(EnvironmentPreferenceNode nodeToDisplay) {
+ this.nodeToDisplay = nodeToDisplay;
+ update();
+ }
+
+ public void setTitleName(String name) {
+ environmentVariable.setText("Preview Environment Variable: " + name);
+ environmentVariable.redraw();
+ }
+
+ public void update() {
+ clearTextArea();
+ if (nodeToDisplay != null) {
+ setTitleName(nodeToDisplay.getEnvName());
+ addEntry(nodeToDisplay.getEnvName(), nodeToDisplay.getValue());
+ } else {
+ setTitleName("NONE SELECTED");
+ }
+ }
+
+ private void addEntry(String name, String value) {
+ addEntryName(name);
+ addEntryValue(value);
+ }
+
+ private void addEntryName(String name) {
+ if (name != null) {
+ String temp = textArea.getText();
+ temp += "\n\t";
+ int startIndex = temp.length();
+ temp += name;
+ textArea.setText(temp);
+ StyleRange tempStyle = new StyleRange();
+ styleArray.add(tempStyle);
+ tempStyle.fontStyle = SWT.BOLD;
+ tempStyle.start = startIndex;
+ tempStyle.length = name.length();
+ tempStyle.underline = true;
+ tempStyle.foreground = Displays.getSystemColor(SWT.COLOR_DARK_BLUE);
+ textArea.setStyleRanges(styleArray.toArray(new StyleRange[styleArray.size()]));
+ textArea.redraw();
+ }
+ }
+
+ private void addEntryValue(String value) {
+ if (value != null) {
+ String temp = textArea.getText();
+ temp += " = ";
+ int startIndex = temp.length();
+ String toAdd = value.replaceAll(":", ":\n\t\t");
+ temp += toAdd;
+ textArea.setText(temp + "\n");
+ StyleRange tempStyle = new StyleRange();
+ styleArray.add(tempStyle);
+ tempStyle.fontStyle = SWT.ITALIC;
+ tempStyle.start = startIndex;
+ tempStyle.length = toAdd.length();
+ tempStyle.foreground = Displays.getSystemColor(SWT.COLOR_BLACK);
+ textArea.setStyleRanges(styleArray.toArray(new StyleRange[styleArray.size()]));
+ textArea.redraw();
+ }
+ }
+
+ private Control createArea(Composite parent) {
+ GridData d = new GridData(GridData.FILL_BOTH);
+
+ environmentVariable = new Group(parent, SWT.NONE);
+ environmentVariable.setText("Preview Environment Variable:");
+ GridLayout gridLayout = new GridLayout();
+ gridLayout.numColumns = 1;
+ environmentVariable.setLayout(gridLayout);
+ environmentVariable.setLayoutData(d);
+
+ Composite topLevelComposite = new Composite(environmentVariable, SWT.NONE);
+ gridLayout = new GridLayout();
+ gridLayout.numColumns = 1;
+ topLevelComposite.setLayout(gridLayout);
+ topLevelComposite.setLayoutData(d);
+ topLevelComposite.setToolTipText("Select a Value From the Tree to Display");
+
+ textArea = new StyledText(topLevelComposite, SWT.BORDER | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
+ textArea.setEditable(false);
+ GridLayout gL = new GridLayout();
+ gL.numColumns = 1;
+ textArea.setLayout(gL);
+ textArea.setLayoutData(d);
+ textArea.setBackground(Displays.getSystemColor(SWT.COLOR_WHITE));
+ textArea.setToolTipText("Select a Value From the Tree to Display");
+
+ return parent;
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/preferences/environment/EnvironmentPageEventHandler.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/preferences/environment/EnvironmentPageEventHandler.java
new file mode 100644
index 000000000..8544f9eaf
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/preferences/environment/EnvironmentPageEventHandler.java
@@ -0,0 +1,124 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.preferences.environment;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import org.eclipse.jface.viewers.CheckStateChangedEvent;
+import org.eclipse.jface.viewers.CheckboxTreeViewer;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.window.Window;
+import org.eclipse.osee.framework.jdk.core.type.TreeObject;
+import org.eclipse.osee.framework.jdk.core.type.TreeParent;
+import org.eclipse.osee.framework.ui.swt.Displays;
+import org.eclipse.osee.ote.ui.test.manager.util.EnvVariableDetailsDialogHelper;
+import org.eclipse.osee.ote.ui.test.manager.util.EnvVariableDialogHelper;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class EnvironmentPageEventHandler {
+
+ private EnvironmentPreferenceNode currentSelection;
+ private final EnvironmentPageDataViewer environmentPageDataViewer;
+ private final ArrayList<EnvironmentPreferenceNode> treeInputList;
+ private final CheckboxTreeViewer treeViewer;
+
+ public EnvironmentPageEventHandler(Composite parent, CheckboxTreeViewer treeViewer, ArrayList<EnvironmentPreferenceNode> treeInputList) {
+ this.treeViewer = treeViewer;
+ this.treeInputList = treeInputList;
+ this.environmentPageDataViewer = new EnvironmentPageDataViewer(parent);
+ }
+
+ public void editEnvVariable(EnvironmentPreferenceNode node) {
+ EnvVariableDetailsDialogHelper selection = new EnvVariableDetailsDialogHelper(node.getEnvName(), node.getValue());
+ Displays.pendInDisplayThread(selection);
+ if (selection.getResult() != Window.CANCEL) {
+ node.setValue(selection.getSelection());
+ environmentPageDataViewer.update();
+ }
+ }
+
+ public void handleAddEnvironmentVariableEvent() {
+ EnvVariableDialogHelper selection = new EnvVariableDialogHelper();
+ Displays.pendInDisplayThread(selection);
+ if (selection.getResult() != Window.CANCEL) {
+ this.addEnvironmentVariable(selection.getSelection());
+ treeViewer.refresh();
+ }
+ }
+
+ public void handleCheckStateChangeEvent(CheckStateChangedEvent event) {
+ Object obj = event.getElement();
+ if (obj != null) {
+ EnvironmentPreferenceNode tempSelection = null;
+
+ if (obj instanceof EnvironmentPreferenceNode) {
+ tempSelection = (EnvironmentPreferenceNode) obj;
+ tempSelection.setChecked(event.getChecked());
+ currentSelection = tempSelection;
+ environmentPageDataViewer.setNodeToDisplay(currentSelection);
+ }
+ }
+ }
+
+ public void handleEditVariableEvent() {
+ ISelection sel = this.treeViewer.getSelection();
+ if (!sel.isEmpty()) {
+ TreeObject selectedItem = (TreeObject) ((StructuredSelection) sel).getFirstElement();
+ if (selectedItem instanceof EnvironmentPreferenceNode) {
+ editEnvVariable((EnvironmentPreferenceNode) selectedItem);
+ }
+ }
+ }
+
+ public void handleRemoveSelectedViewEvent() {
+ StructuredSelection sel = (StructuredSelection) treeViewer.getSelection();
+ if (!sel.isEmpty()) {
+ Iterator<?> it = sel.iterator();
+ while (it.hasNext()) {
+ TreeObject leaf = (TreeObject) it.next();
+ if (leaf instanceof TreeParent) {
+ treeInputList.remove(leaf);
+ environmentPageDataViewer.setNodeToDisplay(null);
+ } else {
+ leaf.getParent().removeChild(leaf);
+ environmentPageDataViewer.update();
+ }
+ }
+ treeViewer.refresh();
+ }
+ }
+
+ public void handleTreeSelectionEvent(SelectionChangedEvent event) {
+ ISelection sel = event.getSelection();
+ if (!sel.isEmpty()) {
+ TreeObject selectedItem = (TreeObject) ((StructuredSelection) sel).getFirstElement();
+
+ EnvironmentPreferenceNode tempSelection = null;
+
+ if (selectedItem instanceof EnvironmentPreferenceNode) {
+ tempSelection = (EnvironmentPreferenceNode) selectedItem;
+ currentSelection = tempSelection;
+ environmentPageDataViewer.setNodeToDisplay(currentSelection);
+ }
+ treeViewer.refresh();
+ }
+ }
+
+ private void addEnvironmentVariable(String name) {
+ EnvironmentPreferenceNode node = new EnvironmentPreferenceNode(name);
+ treeInputList.add(node);
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/preferences/environment/EnvironmentPreferenceNode.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/preferences/environment/EnvironmentPreferenceNode.java
new file mode 100644
index 000000000..1d2cbe6b8
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/preferences/environment/EnvironmentPreferenceNode.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.preferences.environment;
+
+import org.eclipse.osee.framework.jdk.core.type.TreeParent;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class EnvironmentPreferenceNode extends TreeParent {
+
+ public boolean checked;
+ public String value;
+
+ public EnvironmentPreferenceNode(String name) {
+ super(name);
+ checked = false;
+ value = "";
+ }
+
+ public String getEnvName() {
+ return getName();
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ @Override
+ public boolean isChecked() {
+ return checked;
+ }
+
+ @Override
+ public void setChecked(boolean selected) {
+ this.checked = selected;
+ }
+
+ public void setEnvName(String name) {
+ setName(name);
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/preferences/environment/EnvironmentPreferencePage.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/preferences/environment/EnvironmentPreferencePage.java
new file mode 100644
index 000000000..2fe8f8626
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/preferences/environment/EnvironmentPreferencePage.java
@@ -0,0 +1,331 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.preferences.environment;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.viewers.CheckStateChangedEvent;
+import org.eclipse.jface.viewers.CheckboxTreeViewer;
+import org.eclipse.jface.viewers.ICheckStateListener;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.osee.framework.jdk.core.type.TreeObject;
+import org.eclipse.osee.framework.jdk.core.type.TreeParent;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.ui.swt.ImageManager;
+import org.eclipse.osee.ote.ui.test.manager.OteTestManagerImage;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class EnvironmentPreferencePage {
+ public static final String CHECKED = "selected";
+ public static final String NAME = "name";
+ public static final String NUMBER_OF_VALUES = "numberOfValues";
+ public static final String PAGE_KEY = "org.eclipse.osee.ote.ui.test.manager.EnvironmentPreferencePage";
+ public static final String VALUE = "value";
+
+ public static Map<String, String> getSelectedItems() {
+ Map<String, String> environmentVariables = new HashMap<>();
+
+ ArrayList<EnvironmentPreferenceNode> envList = loadVariables();
+
+ for (EnvironmentPreferenceNode node : envList) {
+ if (node.isChecked()) {
+ String name = node.getEnvName();
+ String value = node.getValue();
+ if (Strings.isValid(name)) {
+ environmentVariables.put(name, value != null ? value : "");
+ }
+ }
+ }
+ return environmentVariables;
+ }
+
+ private static ArrayList<EnvironmentPreferenceNode> loadVariables() {
+ ArrayList<EnvironmentPreferenceNode> list = new ArrayList<>();
+ IPreferenceStore prefStore = TestManagerPlugin.getInstance().getPreferenceStore();
+
+ int numberOfValues = prefStore.getInt(PAGE_KEY + "." + NUMBER_OF_VALUES);
+ for (int index = 0; index < numberOfValues; index++) {
+ String name = prefStore.getString(PAGE_KEY + "." + NAME + "_" + index);
+ String value = prefStore.getString(PAGE_KEY + "." + VALUE + "_" + index);
+ String selectedString = prefStore.getString(PAGE_KEY + "." + CHECKED + "_" + index);
+ boolean selected = Boolean.parseBoolean(selectedString);
+
+ if (name != null && name != "") {
+ EnvironmentPreferenceNode node = new EnvironmentPreferenceNode(name);
+ node.setValue((value != null ? value : ""));
+ node.setChecked(selected);
+ list.add(node);
+ }
+ }
+ return list;
+ }
+
+ private Button addButton;
+
+ private Composite buttonComposite;
+ private EnvironmentPageEventHandler environmentPageEventHandler;
+ private Button removeButton;
+
+ private final ArrayList<EnvironmentPreferenceNode> treeInputList;
+
+ private CheckboxTreeViewer treeViewer;
+
+ public EnvironmentPreferencePage(Composite parent) {
+ this.treeInputList = loadVariables();
+ this.createTreeArea(parent);
+ }
+
+ public ISelection getSelection() {
+ return treeViewer.getSelection();
+ }
+
+ public void refresh() {
+ treeViewer.refresh();
+ }
+
+ public void storeVariables() {
+ IPreferenceStore prefStore = TestManagerPlugin.getInstance().getPreferenceStore();
+ prefStore.setValue(PAGE_KEY + "." + NUMBER_OF_VALUES, treeInputList.size());
+ int index = 0;
+ for (EnvironmentPreferenceNode node : treeInputList) {
+ index = treeInputList.indexOf(node);
+ String name = node.getEnvName();
+ if (name != null && name != "") {
+ prefStore.putValue(PAGE_KEY + "." + NAME + "_" + index, name);
+ String value = node.getValue();
+ prefStore.putValue(PAGE_KEY + "." + VALUE + "_" + index, (value != null ? value : ""));
+ prefStore.putValue(PAGE_KEY + "." + CHECKED + "_" + index, Boolean.toString(node.isChecked()));
+ }
+ }
+ }
+
+ private void attachListeners() {
+ treeViewer.getTree().addKeyListener(new KeyListener() {
+ @Override
+ public void keyPressed(KeyEvent e) {
+ }
+
+ @Override
+ public void keyReleased(KeyEvent e) {
+ if (e.character == SWT.DEL && (e.stateMask & SWT.CTRL) == 0) {
+ environmentPageEventHandler.handleRemoveSelectedViewEvent();
+ }
+ }
+ });
+
+ treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+ @Override
+ public void selectionChanged(SelectionChangedEvent event) {
+ environmentPageEventHandler.handleTreeSelectionEvent(event);
+ }
+ });
+
+ treeViewer.getTree().addMouseListener(new MouseListener() {
+ @Override
+ public void mouseDoubleClick(MouseEvent e) {
+ environmentPageEventHandler.handleEditVariableEvent();
+ }
+
+ @Override
+ public void mouseDown(MouseEvent e) {
+ }
+
+ @Override
+ public void mouseUp(MouseEvent e) {
+ }
+ });
+
+ treeViewer.addCheckStateListener(new ICheckStateListener() {
+
+ @Override
+ public void checkStateChanged(CheckStateChangedEvent event) {
+ environmentPageEventHandler.handleCheckStateChangeEvent(event);
+ }
+
+ });
+ }
+
+ private Control createButtonArea(Composite parent) {
+
+ buttonComposite = new Composite(parent, SWT.NONE);
+ GridLayout gridLayout = new GridLayout();
+ gridLayout.numColumns = 1;
+ GridData gd = new GridData(SWT.FILL);
+ buttonComposite.setLayout(gridLayout);
+ buttonComposite.setLayoutData(gd);
+
+ addButton = new Button(buttonComposite, SWT.PUSH);
+ addButton.setText("Add");
+ addButton.addSelectionListener(new SelectionListener() {
+
+ @Override
+ public void widgetDefaultSelected(SelectionEvent e) {
+ widgetSelected(e);
+ }
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ environmentPageEventHandler.handleAddEnvironmentVariableEvent();
+ }
+ });
+
+ removeButton = new Button(buttonComposite, SWT.PUSH);
+ removeButton.setText("Remove");
+ removeButton.addSelectionListener(new SelectionListener() {
+
+ @Override
+ public void widgetDefaultSelected(SelectionEvent e) {
+ widgetSelected(e);
+ }
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ environmentPageEventHandler.handleRemoveSelectedViewEvent();
+ }
+
+ });
+ return parent;
+ }
+
+ private Control createTreeArea(Composite parent) {
+
+ Group defaultEnvironmentVariablesGroup = new Group(parent, SWT.NONE);
+ defaultEnvironmentVariablesGroup.setText("Select Default Environment Variables to Use");
+ GridLayout gL = new GridLayout();
+ gL.numColumns = 2;
+ GridData gd = new GridData(GridData.FILL_BOTH);
+ gd.grabExcessHorizontalSpace = true;
+ gd.grabExcessVerticalSpace = true;
+ defaultEnvironmentVariablesGroup.setLayout(gL);
+ defaultEnvironmentVariablesGroup.setLayoutData(gd);
+
+ Composite areaComposite = new Composite(defaultEnvironmentVariablesGroup, SWT.NONE);
+ GridLayout treeLayout = new GridLayout();
+ treeLayout.numColumns = 1;
+ GridData gd1 = new GridData();
+ gd1.horizontalAlignment = GridData.FILL;
+ gd1.verticalAlignment = GridData.FILL;
+ gd1.grabExcessHorizontalSpace = true;
+ gd1.grabExcessVerticalSpace = true;
+ areaComposite.setLayout(treeLayout);
+ areaComposite.setLayoutData(gd1);
+
+ GridData treeGridData = new GridData();
+ treeGridData.grabExcessHorizontalSpace = true;
+ treeGridData.grabExcessVerticalSpace = true;
+ treeGridData.horizontalAlignment = GridData.FILL;
+ treeGridData.verticalAlignment = GridData.FILL;
+
+ treeViewer =
+ new CheckboxTreeViewer(areaComposite, SWT.MULTI | SWT.CHECK | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
+ treeViewer.getTree().setLayoutData(treeGridData);
+ treeViewer.setContentProvider(new ITreeContentProvider() {
+
+ @Override
+ public void dispose() {
+
+ }
+
+ @Override
+ public Object[] getChildren(Object parentElement) {
+ if (parentElement != null && parentElement instanceof TreeParent) {
+ TreeParent parent = (TreeParent) parentElement;
+ if (parent.hasChildren()) {
+ return parent.getChildren();
+ }
+ }
+ return new Object[0];
+ }
+
+ @Override
+ public Object[] getElements(Object inputElement) {
+ if (inputElement != null && inputElement instanceof ArrayList<?>) {
+ ArrayList<?> elementArray = (ArrayList<?>) inputElement;
+ return elementArray.toArray();
+ }
+ return new Object[0];
+ }
+
+ @Override
+ public Object getParent(Object element) {
+ if (element != null && element instanceof TreeObject) {
+ TreeObject child = (TreeObject) element;
+ return child.getParent();
+ }
+ return new Object();
+ }
+
+ @Override
+ public boolean hasChildren(Object element) {
+ if (element instanceof TreeParent) {
+ TreeParent parent = (TreeParent) element;
+ return parent.hasChildren();
+ }
+ return false;
+ }
+
+ @Override
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+
+ }
+ });
+ treeViewer.setLabelProvider(new LabelProvider() {
+
+ @Override
+ public Image getImage(Object obj) {
+ return ImageManager.getImage(OteTestManagerImage.ENVIRONMENT);
+ }
+
+ @Override
+ public String getText(Object obj) {
+ return obj.toString();
+ }
+ });
+ treeViewer.setInput(treeInputList);
+ treeViewer.getTree().setToolTipText("Double click on an item to edit.\nClick once to preview content.");
+
+ environmentPageEventHandler = new EnvironmentPageEventHandler(parent, treeViewer, treeInputList);
+
+ createButtonArea(defaultEnvironmentVariablesGroup);
+
+ attachListeners();
+
+ for (EnvironmentPreferenceNode parentNode : treeInputList) {
+ treeViewer.setChecked(parentNode, parentNode.isChecked());
+ }
+
+ return parent;
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/ClassServerInst.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/ClassServerInst.java
new file mode 100644
index 000000000..7a8549a03
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/ClassServerInst.java
@@ -0,0 +1,209 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.util;
+
+import java.io.File;
+import java.net.BindException;
+import java.net.InetAddress;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.CorePreferences;
+import org.eclipse.osee.framework.ui.ws.AWorkspace;
+import org.eclipse.osee.ote.classserver.ClassServer;
+import org.eclipse.osee.ote.classserver.PathResourceFinder;
+import org.eclipse.osee.ote.runtimemanager.UserLibResourceFinder;
+
+public class ClassServerInst {
+ private ClassServer classServer;
+ private String classServerPath;
+ private PathResourceFinder pathResourceFinder;
+
+ private static ClassServerInst instance = null;
+
+ public static ClassServerInst getInstance() {
+ if (instance == null) {
+ instance = new ClassServerInst();
+ }
+ return instance;
+ }
+
+ /**
+ * Creates a new ClassServer which will serve all projects currently in the workspace
+ */
+ private ClassServerInst() {
+ try {
+ InetAddress useHostAddress = CorePreferences.getDefaultInetAddress();
+ classServer = new ClassServer(0, useHostAddress)//;
+ {
+ @Override
+ protected void fileDownloaded(String fp, InetAddress addr) {
+ System.out.println("ClassServerInst: File " + fp + " downloaded to " + addr);
+ }
+ };
+ pathResourceFinder = new PathResourceFinder(new String[] {}, false);
+ classServer.addResourceFinder(new UserLibResourceFinder());
+ classServer.addResourceFinder(new OTEBuilderResourceFinder());
+ classServer.addResourceFinder(pathResourceFinder);
+ classServer.start();
+
+ classServerPath = classServer.getHostName().toString();// "http://" + useHostAddress.getHostAddress() + ":" + classServer.getPort() + "/";
+
+ Job job = new Job("Populating TM classserver with projects.") {
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ try {
+ addAnyNewProjects();
+ } catch (Throwable th) {
+ OseeLog.log(ClassServerInst.class, Level.SEVERE, th.getMessage(), th);
+ }
+ return Status.OK_STATUS;
+ }
+
+ };
+ job.schedule();
+ } catch (BindException ex) {
+ OseeLog.log(
+ ClassServerInst.class,
+ Level.SEVERE,
+ "Class Server not started. Likely the IP address used is not local. Set your IP address in the advanced page.",
+ ex);
+ } catch (Exception ex) {
+ OseeLog.log(ClassServerInst.class, Level.SEVERE, "Class Server not started.", ex);
+ }
+ }
+
+ /**
+ * Adds any newly created or checked out projects in the workspace to the ClassServer.
+ */
+ public void addAnyNewProjects() {
+ // the ClassServer maintains a list and checks that any passed in projects are not already in
+ // its list before adding new ones, so it is safe to simply pass the entire list of projects
+ pathResourceFinder.addPaths(getAllProjects());
+ }
+
+ /**
+ * @return the path to the class server, to be passed to the environment upon connection
+ */
+ public String getClassServerPath() {
+ return classServerPath;
+ }
+
+ /**
+ * Stops the class server. This should be called upon termination of the testManager
+ */
+ public void stopServer() {
+ classServer.terminate();
+ }
+
+ private String[] getAllProjects() {
+ ArrayList<String> list = new ArrayList<>();
+
+ IProject[] projects = AWorkspace.getProjects();
+ for (IProject project : projects) {
+ // If the project start with a '.', (i.e. a hidden project) do not include it in the class
+ // server
+ // This will keep .osee.data and others from being served
+ if (!project.isOpen()) {
+ continue;
+ }
+
+ IProjectDescription description;
+ try {
+ description = project.getDescription();
+ if (!project.getName().startsWith(".") && description.hasNature("org.eclipse.jdt.core.javanature")) {
+ List<File> fileList = getJavaProjectProjectDependancies(JavaCore.create(project));
+ for (File file : fileList) {
+ list.add(file.getAbsolutePath());
+ }
+ }
+ } catch (CoreException ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ return list.toArray(new String[list.size()]);
+ }
+
+ /*
+ * START Code Duplicated from AJavaProject because of release dependencies
+ */
+ private final Map<IJavaProject, IClasspathEntry[]> cachedPath =
+ new HashMap<IJavaProject, IClasspathEntry[]>();
+
+ private IClasspathEntry[] localGetResolvedClasspath(IJavaProject javaProject) throws JavaModelException {
+ IClasspathEntry[] paths = cachedPath.get(javaProject);
+ if (paths == null) {
+ paths = javaProject.getResolvedClasspath(true);
+ cachedPath.put(javaProject, paths);
+ }
+ return paths;
+ }
+
+ private ArrayList<File> getJavaProjectProjectDependancies(IJavaProject javaProject) {
+ ArrayList<File> urls = new ArrayList<File>();
+ try {
+ IClasspathEntry[] paths = localGetResolvedClasspath(javaProject);
+ for (int i = 0; i < paths.length; i++) {
+ if (paths[i].getEntryKind() == IClasspathEntry.CPE_LIBRARY) {
+ if (paths[i].getPath().toFile().exists()) {
+ // urls.add(paths[i].getPath().toFile());
+ } else {
+ File file = null;
+ file = new File(AWorkspace.getWorkspacePath().concat(paths[i].getPath().toOSString()));
+ if (file.exists()) {
+ urls.add(file);
+ }
+ }
+ } else if (paths[i].getEntryKind() == IClasspathEntry.CPE_PROJECT) {
+ urls.add(new File(AWorkspace.getWorkspacePath().concat(
+ paths[i].getPath().toFile().getPath().concat(File.separator + "bin" + File.separator))));
+ } else if (paths[i].getEntryKind() == IClasspathEntry.CPE_SOURCE) {
+ File projectlocation = javaProject.getProject().getLocation().toFile();
+ File projecttricky = javaProject.getProject().getFullPath().toFile();
+ IPath output = paths[i].getOutputLocation();
+ File fileLocation;
+ if (output == null) {
+ fileLocation = javaProject.getOutputLocation().toFile();
+ } else {
+ fileLocation = paths[i].getOutputLocation().toFile();
+ }
+ String realLocation =
+ fileLocation.toString().replace(projecttricky.toString(), projectlocation.toString());
+ urls.add(new File(realLocation));
+ }
+ }
+
+ } catch (JavaModelException ex) {
+ ex.printStackTrace();
+ }
+ return urls;
+ }
+ /*
+ * STOP Code Duplicated from AJavaProject because of release dependencies
+ */
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/Dialogs.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/Dialogs.java
new file mode 100644
index 000000000..6b11da236
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/Dialogs.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.util;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.ui.PlatformUI;
+
+public class Dialogs {
+
+ public static void popupError(String title, String message) {
+ MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), title, message);
+ }
+
+ public static void popupInformational(String title, String message) {
+ MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), title, message);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/EnvVariableDetailsDialog.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/EnvVariableDetailsDialog.java
new file mode 100644
index 000000000..083c4caaf
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/EnvVariableDetailsDialog.java
@@ -0,0 +1,167 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.util;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.logging.Level;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.jdk.core.util.Strings;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.ui.test.manager.internal.TestManagerPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class EnvVariableDetailsDialog extends MessageDialog {
+
+ private Button cancelButton;
+ private final String dialogMessage;
+
+ private Button okButton;
+
+ private Button importButton;
+
+ private String selection;
+ private boolean selectionOk;
+ private StyledText textArea;
+
+ public EnvVariableDetailsDialog(Shell parentShell, String dialogTitle, Image dialogTitleImage, String dialogMessage, int dialogImageType, String[] dialogButtonLabels, int defaultIndex, String oldValue) {
+ super(parentShell, dialogTitle, dialogTitleImage, null, dialogImageType, dialogButtonLabels, defaultIndex);
+
+ this.selectionOk = false;
+ this.selection = oldValue;
+ this.dialogMessage = dialogMessage;
+ }
+
+ public String getSelection() {
+ return selection;
+ }
+
+ public boolean isValid() {
+ return selectionOk;
+ }
+
+ @Override
+ protected Control createButtonBar(Composite parent) {
+ Control c = super.createButtonBar(parent);
+ okButton = getButton(0);
+ cancelButton = getButton(1);
+
+ okButton.addSelectionListener(new SelectionListener() {
+
+ @Override
+ public void widgetDefaultSelected(SelectionEvent e) {
+ widgetSelected(e);
+ }
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ selectionOk = true;
+
+ }
+ });
+
+ cancelButton.addSelectionListener(new SelectionListener() {
+
+ @Override
+ public void widgetDefaultSelected(SelectionEvent e) {
+ widgetSelected(e);
+ }
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ selectionOk = false;
+ }
+ });
+ return c;
+ }
+
+ @Override
+ protected Control createCustomArea(Composite parent) {
+ // super.createCustomArea(parent);
+
+ GridData d = new GridData(GridData.FILL);
+
+ Group setValueGroup = new Group(parent, SWT.NONE);
+ GridLayout gridLayout = new GridLayout();
+ gridLayout.numColumns = 1;
+ setValueGroup.setLayout(gridLayout);
+ setValueGroup.setText(dialogMessage);
+
+ Composite topLevelComposite = new Composite(setValueGroup, SWT.NONE);
+ gridLayout = new GridLayout();
+ gridLayout.numColumns = 1;
+ topLevelComposite.setLayout(gridLayout);
+ topLevelComposite.setLayoutData(d);
+
+ importButton = new Button(setValueGroup, SWT.NONE);
+ importButton.setLayoutData(new GridData(SWT.END, SWT.CENTER, false, false));
+ importButton.setText("Import");
+ importButton.addSelectionListener(new SelectionAdapter() {
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ FileDialog dialog = new FileDialog(EnvVariableDetailsDialog.this.getShell(), SWT.OPEN);
+
+ String result = dialog.open();
+ if (Strings.isValid(result)) {
+ String importedData;
+ try {
+ importedData = Lib.fileToString(new File(result));
+ textArea.setText(textArea.getText() + importedData);
+ selection = textArea.getText();
+ } catch (IOException ex) {
+ OseeLog.log(TestManagerPlugin.class, Level.SEVERE, ex);
+ }
+ }
+ }
+ });
+
+ textArea = new StyledText(setValueGroup, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER | SWT.WRAP);
+ GridData gd = new GridData();
+ gd.grabExcessHorizontalSpace = true;
+ gd.horizontalAlignment = GridData.FILL;
+ gd.horizontalSpan = 1;
+ gd.heightHint = 200;
+ gd.widthHint = 400;
+ textArea.setLayoutData(gd);
+
+ textArea.setText((selection != null ? selection : ""));
+
+ textArea.addModifyListener(new ModifyListener() {
+ @Override
+ public void modifyText(ModifyEvent e) {
+ selection = textArea.getText();
+ }
+ });
+
+ return parent;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/EnvVariableDetailsDialogHelper.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/EnvVariableDetailsDialogHelper.java
new file mode 100644
index 000000000..25b96be5c
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/EnvVariableDetailsDialogHelper.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.util;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.window.Window;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class EnvVariableDetailsDialogHelper implements Runnable {
+
+ private final String nameOfVariableToSet;
+ private int result;
+ private String selection;
+
+ public EnvVariableDetailsDialogHelper(String nameOfVariableToSet, String oldValue) {
+ this.nameOfVariableToSet = nameOfVariableToSet;
+ this.selection = oldValue;
+ }
+
+ public int getResult() {
+ return result;
+ }
+
+ public String getSelection() {
+ return selection;
+ }
+
+ @Override
+ public void run() {
+ EnvVariableDetailsDialog dlg =
+ new EnvVariableDetailsDialog(null, "Edit " + nameOfVariableToSet, null, nameOfVariableToSet + " Value:",
+ MessageDialog.NONE, new String[] {"OK", "Cancel"}, 0, selection);
+
+ result = dlg.open();
+
+ if (result == Window.OK) {
+ if (dlg.isValid()) {
+ String info = dlg.getSelection();
+ if (info != null) {
+ selection = info;
+ } else {
+ selection = "";
+ }
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/EnvVariableDialog.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/EnvVariableDialog.java
new file mode 100644
index 000000000..a2e3acd19
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/EnvVariableDialog.java
@@ -0,0 +1,125 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.util;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class EnvVariableDialog extends MessageDialog {
+
+ private Button cancelButton;
+ private final String dialogMessage;
+
+ private Button okButton;
+
+ private String selection;
+ private boolean selectionOk;
+ private StyledText textArea;
+
+ public EnvVariableDialog(Shell parentShell, String dialogTitle, Image dialogTitleImage, String dialogMessage, int dialogImageType, String[] dialogButtonLabels, int defaultIndex) {
+ super(parentShell, dialogTitle, dialogTitleImage, null, dialogImageType, dialogButtonLabels, defaultIndex);
+ this.dialogMessage = dialogMessage;
+ this.selectionOk = false;
+ }
+
+ public String getSelection() {
+ return selection;
+ }
+
+ public boolean isValid() {
+ return selectionOk;
+ }
+
+ @Override
+ protected Control createButtonBar(Composite parent) {
+ Control c = super.createButtonBar(parent);
+ okButton = getButton(0);
+ cancelButton = getButton(1);
+
+ okButton.addSelectionListener(new SelectionListener() {
+
+ @Override
+ public void widgetDefaultSelected(SelectionEvent e) {
+ widgetSelected(e);
+ }
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ selectionOk = true;
+
+ }
+ });
+
+ cancelButton.addSelectionListener(new SelectionListener() {
+
+ @Override
+ public void widgetDefaultSelected(SelectionEvent e) {
+ widgetSelected(e);
+ }
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ selectionOk = false;
+ }
+ });
+ return c;
+ }
+
+ @Override
+ protected Control createCustomArea(Composite parent) {
+ super.createCustomArea(parent);
+
+ GridData gd = new GridData(SWT.FILL);
+ // gd.minimumWidth = 200;
+ gd.grabExcessHorizontalSpace = true;
+
+ Composite addView = new Composite(parent, SWT.NONE);
+ GridLayout gridLayout = new GridLayout();
+ gridLayout.numColumns = 2;
+ addView.setLayout(gridLayout);
+ addView.setLayoutData(gd);
+
+ new Label(addView, SWT.NONE).setText(dialogMessage);
+
+ GridData gd1 = new GridData(SWT.FILL);
+ gd1.minimumWidth = 200;
+ gd1.grabExcessHorizontalSpace = true;
+
+ textArea = new StyledText(addView, SWT.SINGLE | SWT.BORDER);
+ textArea.setLayoutData(gd1);
+ textArea.addModifyListener(new ModifyListener() {
+
+ @Override
+ public void modifyText(ModifyEvent e) {
+ selection = textArea.getText();
+ }
+ });
+
+ return parent;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/EnvVariableDialogHelper.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/EnvVariableDialogHelper.java
new file mode 100644
index 000000000..5664f06be
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/EnvVariableDialogHelper.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.util;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.window.Window;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class EnvVariableDialogHelper implements Runnable {
+
+ private int result;
+ private String selection;
+
+ public EnvVariableDialogHelper() {
+
+ }
+
+ public int getResult() {
+ return result;
+ }
+
+ public String getSelection() {
+ return selection;
+ }
+
+ @Override
+ public void run() {
+ EnvVariableDialog dlg =
+ new EnvVariableDialog(null, "Add Environment Variable", null, "Enter Name:", MessageDialog.NONE, new String[] {
+ "OK",
+ "Cancel"}, 0);
+
+ result = dlg.open();
+
+ if (result == Window.OK) {
+ if (dlg.isValid()) {
+ String info = dlg.getSelection();
+ if (info != null) {
+ selection = info;
+ } else {
+ selection = "";
+ }
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/OTEBuilderResourceFinder.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/OTEBuilderResourceFinder.java
new file mode 100644
index 000000000..f1e1a6f48
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/OTEBuilderResourceFinder.java
@@ -0,0 +1,42 @@
+package org.eclipse.osee.ote.ui.test.manager.util;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.classserver.ResourceFinder;
+import org.eclipse.osee.ote.ui.builder.OTEPackagingBuilder;
+
+/**
+ * Resource finder for the OTE builder jars. This will enable the downloading of jars from the
+ * same http server that provides the precompiled jars.
+ *
+ * @author Andrew M. Finkbeiner
+ */
+public class OTEBuilderResourceFinder extends ResourceFinder {
+ private File rootFolder;
+
+ public OTEBuilderResourceFinder() {
+ super();
+ rootFolder = OTEPackagingBuilder.getWorkspaceArchiveFolder();
+ }
+
+ @Override
+ public byte[] find(String path) throws IOException {
+ try {
+ File bundleFile = new File(rootFolder, path);
+ if(bundleFile.exists()){
+ return Lib.inputStreamToBytes(new FileInputStream(bundleFile));
+ }
+ } catch (Exception ex) {
+ OseeLog.logf(getClass(), Level.SEVERE, "Error trying to read: [%s]", path);
+ }
+ return null;
+ }
+
+ @Override
+ public void dispose() {
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/PluginUtil.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/PluginUtil.java
new file mode 100644
index 000000000..b74dee98c
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/PluginUtil.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.util;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.osee.ote.ui.test.manager.core.TestManagerEditor;
+import org.eclipse.ui.IEditorReference;
+import org.eclipse.ui.IViewReference;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+
+public class PluginUtil {
+
+ public static List<IViewReference> findAllViews(String viewID) {
+ ArrayList<IViewReference> list = new ArrayList<>();
+ IWorkbenchWindow windows[] = PlatformUI.getWorkbench().getWorkbenchWindows();
+ for (IWorkbenchWindow window : windows) {
+ IWorkbenchPage pages[] = window.getPages();
+ for (IWorkbenchPage page : pages) {
+ IViewReference viewRefs[] = page.getViewReferences();
+ for (IViewReference viewRef : viewRefs) {
+ if (viewRef.getId().equals(viewID)) {
+ list.add(viewRef);
+ }
+ }
+
+ }
+ }
+ return list;
+ }
+
+ public static boolean areTestManagersAvailable() {
+ return getTestManagers().length > 0;
+ }
+
+ public static TestManagerEditor[] getTestManagers() {
+ List<TestManagerEditor> tmes = new ArrayList<>();
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ if (window != null) {
+ IWorkbenchPage page = window.getActivePage();
+ if (page != null) {
+ IEditorReference editors[] = page.getEditorReferences();
+ if (editors != null) {
+ for (int j = 0; j < editors.length; j++) {
+ IEditorReference editor = editors[j];
+ IWorkbenchPart part = editor.getPart(true);
+ if (part instanceof TestManagerEditor) {
+ tmes.add((TestManagerEditor) part);
+ }
+ }
+ }
+ }
+ }
+ return tmes.toArray(new TestManagerEditor[tmes.size()]);
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/TestManagerSelectDialog.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/TestManagerSelectDialog.java
new file mode 100644
index 000000000..51283fff7
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/TestManagerSelectDialog.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.util;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.window.Window;
+import org.eclipse.osee.framework.ui.swt.Displays;
+import org.eclipse.osee.ote.ui.test.manager.core.TestManagerEditor;
+import org.eclipse.ui.dialogs.ListSelectionDialog;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class TestManagerSelectDialog {
+ private final static String MESSAGE = "Select A Test Manager";
+ private ListSelectionDialog listSelectionDialog;
+ private LabelProvider labelProvider;
+
+ private TestManagerSelectDialog() {
+ this.labelProvider = new LabelProvider() {
+ @Override
+ public String getText(Object element) {
+ if (element instanceof TestManagerEditor) {
+ return ((TestManagerEditor) element).getPartName();
+ }
+ return "Unknown element type";
+ }
+ };
+ TestManagerEditor[] input = PluginUtil.getTestManagers();
+ this.listSelectionDialog =
+ new ListSelectionDialog(Displays.getActiveShell(), input, new ArrayContentProvider(), labelProvider, MESSAGE);
+ this.listSelectionDialog.setTitle(MESSAGE);
+ if (input.length > 0) {
+ this.listSelectionDialog.setInitialSelections(new Object[] {input[0]});
+ }
+ }
+
+ public int open() {
+ return listSelectionDialog.open();
+ }
+
+ public TestManagerEditor[] getResult() {
+ List<TestManagerEditor> tmes = new ArrayList<>();
+ for (Object object : listSelectionDialog.getResult()) {
+ tmes.add((TestManagerEditor) object);
+ }
+ return tmes.toArray(new TestManagerEditor[tmes.size()]);
+ }
+
+ public static TestManagerEditor[] getTestManagerFromUser() {
+ TestManagerEditor[] toReturn = null;
+ TestManagerSelectDialog dialog = new TestManagerSelectDialog();
+ int result = dialog.open();
+ if (result == Window.OK) {
+ toReturn = dialog.getResult();
+ }
+ return toReturn != null ? toReturn : new TestManagerEditor[0];
+ }
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/WidgetFactory.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/WidgetFactory.java
new file mode 100644
index 000000000..fe1a5e612
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/util/WidgetFactory.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.util;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+
+/**
+ * @author David Diepenbrock
+ */
+public class WidgetFactory {
+
+ /**
+ * Creates a <code>Label</code> for use on a GridLayout.
+ *
+ * @param comp The composite this label will be on.
+ * @param horizontalSpan The number of columns this Label should span in the grid
+ * @return The created label - with no text
+ */
+ public static Label createLabelForGrid(Composite comp, int horizontalSpan) {
+ Label label = new Label(comp, SWT.NONE);
+ GridData gd = new GridData();
+ gd.horizontalSpan = horizontalSpan;
+ label.setLayoutData(gd);
+ return label;
+ }
+
+ /**
+ * Creates a <code>Label</code> for use on a GridLayout. The <code>Label</code> will only span 1 column in the grid.
+ *
+ * @param comp The composite this label will be on.
+ * @param str The text for the label
+ * @return The created label
+ */
+ public static Label createLabelForGrid(Composite comp, String str) {
+ return createLabelForGrid(comp, str, 1);
+ }
+
+ /**
+ * Creates a <code>Label</code> for use on a GridLayout.
+ *
+ * @param comp The composite this label will be on.
+ * @param labelText The text for the label
+ * @param horizontalSpan The number of columns this Label should span in the grid
+ * @return The created label
+ */
+ public static Label createLabelForGrid(Composite comp, String labelText, int horizontalSpan) {
+ Label label = createLabelForGrid(comp, horizontalSpan);
+ label.setText(labelText);
+ return label;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/wizards/TestManagerNewWizard.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/wizards/TestManagerNewWizard.java
new file mode 100644
index 000000000..16c9979ac
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/wizards/TestManagerNewWizard.java
@@ -0,0 +1,167 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.wizards;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.InvocationTargetException;
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWizard;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.ide.IDE;
+
+/**
+ * This is a sample new wizard. Its role is to create a new file resource in the provided container. If the container
+ * resource (a folder or a project) is selected in the workspace when the wizard is opened, it will accept it as the
+ * target container. The wizard creates one file with the extension "mpe". If a sample multi-page editor (also available
+ * as a template) is registered for the same extension, it will be able to open it.
+ */
+
+public class TestManagerNewWizard extends Wizard implements INewWizard {
+ private TestManagerNewWizardPage page;
+
+ private ISelection selection;
+
+ /**
+ * Constructor for SampleNewWizard.
+ */
+ public TestManagerNewWizard() {
+ super();
+ setNeedsProgressMonitor(true);
+ }
+
+ /**
+ * Adding the page to the wizard.
+ */
+
+ @Override
+ public void addPages() {
+ page = new TestManagerNewWizardPage(selection);
+ addPage(page);
+ }
+
+ /**
+ * We will accept the selection in the workbench to see if we can initialize from it.
+ *
+ * @see IWorkbenchWizard#init(IWorkbench, IStructuredSelection)
+ */
+ @Override
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ this.selection = selection;
+ }
+
+ /**
+ * This method is called when 'Finish' button is pressed in the wizard. We will create an operation and run it using
+ * wizard as execution context.
+ */
+ @Override
+ public boolean performFinish() {
+ final String containerName = page.getContainerName();
+ final String fileName = page.getFileName();
+ IRunnableWithProgress op = new IRunnableWithProgress() {
+ @Override
+ public void run(IProgressMonitor monitor) throws InvocationTargetException {
+ try {
+ doFinish(containerName, fileName, monitor);
+ } catch (CoreException e) {
+ throw new InvocationTargetException(e);
+ } finally {
+ monitor.done();
+ }
+ }
+ };
+ try {
+ getContainer().run(true, false, op);
+ } catch (InterruptedException e) {
+ return false;
+ } catch (InvocationTargetException e) {
+ Throwable realException = e.getTargetException();
+ MessageDialog.openError(getShell(), "Error", realException.getMessage());
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * The worker method. It will find the container, create the file if missing or just replace its contents, and open
+ * the editor on the newly created file.
+ */
+
+ private void doFinish(String containerName, String fileName, IProgressMonitor monitor) throws CoreException {
+ // create a sample file
+ monitor.beginTask("Creating " + fileName, 2);
+ IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+ IResource resource = root.findMember(new Path(containerName));
+ if (!resource.exists() || !(resource instanceof IContainer)) {
+ throwCoreException("Container \"" + containerName + "\" does not exist.");
+ }
+ IContainer container = (IContainer) resource;
+ final IFile file = container.getFile(new Path(fileName + ".tmc"));
+ try {
+ InputStream stream = openContentStream();
+ if (file.exists()) {
+ file.setContents(stream, true, true, monitor);
+ } else {
+ file.create(stream, true, monitor);
+ }
+ stream.close();
+ } catch (IOException e) {
+ }
+ monitor.worked(1);
+ monitor.setTaskName("Opening file for editing...");
+ getShell().getDisplay().asyncExec(new Runnable() {
+ @Override
+ public void run() {
+ IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+ try {
+ IDE.openEditor(page, file, true);
+ } catch (PartInitException e) {
+ }
+ }
+ });
+ monitor.worked(1);
+ }
+
+ /**
+ * We will initialize file contents with a sample text.
+ */
+
+ private InputStream openContentStream() {
+ String contents =
+ "<testManager>\n" + "<contact></contact>\n" + "<description>Find those bugs</description>\n" +
+ "<distributionStatement></distributionStatement>\n</testManager>\n";
+ return new ByteArrayInputStream(contents.getBytes());
+ }
+
+ private void throwCoreException(String message) throws CoreException {
+ IStatus status = new Status(IStatus.ERROR, "org.eclipse.osee.ote.ui.test.manager", IStatus.OK, message, null);
+ throw new CoreException(status);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/wizards/TestManagerNewWizardPage.java b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/wizards/TestManagerNewWizardPage.java
new file mode 100644
index 000000000..288146838
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/src/org/eclipse/osee/ote/ui/test/manager/wizards/TestManagerNewWizardPage.java
@@ -0,0 +1,212 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.test.manager.wizards;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.dialogs.IDialogPage;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.dialogs.ContainerSelectionDialog;
+
+/**
+ * The "New" wizard page allows setting the container for the new file as well as the file name. The page will only
+ * accept file name without the extension OR with the extension that matches the expected one (mpe).
+ */
+
+public class TestManagerNewWizardPage extends WizardPage {
+ private Text containerText;
+
+ private Text fileText;
+
+ private final ISelection selection;
+
+ /**
+ * Constructor for SampleNewWizardPage.
+ */
+ public TestManagerNewWizardPage(ISelection selection) {
+ super("wizardPage");
+ setTitle("Test Manager Editor File");
+ setDescription("This wizard creates a new Test Manager file.");
+ this.selection = selection;
+ }
+
+ /**
+ * @see IDialogPage#createControl(Composite)
+ */
+ @Override
+ public void createControl(Composite parent) {
+ Composite container = new Composite(parent, SWT.NULL);
+ GridLayout layout = new GridLayout();
+ container.setLayout(layout);
+ layout.numColumns = 3;
+ layout.verticalSpacing = 9;
+ Label label = new Label(container, SWT.NULL);
+ label.setText("&Container:");
+
+ containerText = new Text(container, SWT.BORDER | SWT.SINGLE);
+ GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+ containerText.setLayoutData(gd);
+ containerText.addModifyListener(new ModifyListener() {
+ @Override
+ public void modifyText(ModifyEvent e) {
+ dialogChanged();
+ }
+ });
+
+ Button button = new Button(container, SWT.PUSH);
+ button.setText("Browse...");
+ button.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ handleBrowse();
+ }
+ });
+ label = new Label(container, SWT.NULL);
+ label.setText("&File name:");
+
+ fileText = new Text(container, SWT.BORDER | SWT.SINGLE);
+ gd = new GridData(GridData.FILL_HORIZONTAL);
+ fileText.setLayoutData(gd);
+ fileText.addModifyListener(new ModifyListener() {
+ @Override
+ public void modifyText(ModifyEvent e) {
+ dialogChanged();
+ }
+ });
+ initialize();
+ dialogChanged();
+ setControl(container);
+ }
+
+ public String getContainerName() {
+ return containerText.getText();
+ }
+
+ public String getFileName() {
+ return fileText.getText();
+ }
+
+ /**
+ * Ensures that both text fields are set.
+ */
+
+ private void dialogChanged() {
+ String container = getContainerName();
+ String fileName = getFileName();
+ IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+ IResource resource = root.findMember(new Path(container));
+ IContainer rcontainer = (IContainer) resource;
+
+ if (container.length() == 0) {
+ updateStatus("File container must be specified");
+ return;
+ }
+ if (fileName.length() == 0) {
+ updateStatus("File name must be specified");
+ return;
+ }
+
+ // verify extension isn't there
+ if (fileName.endsWith("tmc") == true || fileName.endsWith(".") == true) {
+ updateStatus("Do not add .tmc extenstion.");
+ return;
+ }
+ // verify title is alpha-numeric with spaces and dashes
+ Matcher m = Pattern.compile("^[\\w]+([\\w_]*[\\w])?$").matcher(fileName);
+ boolean match = false;
+ while (m.find()) {
+ match = true;
+ }
+ if (!match) {
+ updateStatus("Filename must be alpha-numeric with \"_\" \n" + "And can not begin or end with a space.");
+ return;
+ }
+ // verify existing file doesn't exist
+ final IFile file = rcontainer.getFile(new Path(fileName + ".tmc"));
+ if (file.exists()) {
+ updateStatus("File with this name already exists.");
+ return;
+ }
+ int dotLoc = fileName.lastIndexOf('.');
+ if (dotLoc != -1) {
+ String ext = fileName.substring(dotLoc + 1);
+ if (ext.equalsIgnoreCase("tmc") == false) {
+ updateStatus("File extension must be \"tmc\"");
+ return;
+ }
+ }
+ updateStatus(null);
+ }
+
+ /**
+ * Uses the standard container selection dialog to choose the new value for the container field.
+ */
+
+ private void handleBrowse() {
+ ContainerSelectionDialog dialog =
+ new ContainerSelectionDialog(getShell(), ResourcesPlugin.getWorkspace().getRoot(), false,
+ "Select new file container");
+ if (dialog.open() == Window.OK) {
+ Object[] result = dialog.getResult();
+ if (result.length == 1) {
+ containerText.setText(((Path) result[0]).toOSString());
+ }
+ }
+ }
+
+ /**
+ * Tests if the current workbench selection is a suitable container to use.
+ */
+
+ private void initialize() {
+ if (selection != null && selection.isEmpty() == false && selection instanceof IStructuredSelection) {
+ IStructuredSelection ssel = (IStructuredSelection) selection;
+ if (ssel.size() > 1) {
+ return;
+ }
+ Object obj = ssel.getFirstElement();
+ if (obj instanceof IResource) {
+ IContainer container;
+ if (obj instanceof IContainer) {
+ container = (IContainer) obj;
+ } else {
+ container = ((IResource) obj).getParent();
+ }
+ containerText.setText(container.getFullPath().toString());
+ }
+ }
+ }
+
+ private void updateStatus(String message) {
+ setErrorMessage(message);
+ setPageComplete(message == null);
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui.test.manager/support/output.xsd b/org.eclipse.osee.ote.ui.test.manager/support/output.xsd
new file mode 100644
index 000000000..e1731d7fc
--- /dev/null
+++ b/org.eclipse.osee.ote.ui.test.manager/support/output.xsd
@@ -0,0 +1,191 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <!-- ====================== -->
+ <!-- AUTHOR: Charles Shaw -->
+ <!-- ====================== -->
+
+ <!-- This is included only once as the first element in TestScript -->
+ <xs:element name="Config">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="ScriptName" type="xs:string"/>
+ <xs:element name="Environment" type="xs:string"/>
+ <xs:element name="TestEnvironmentVersion" type="xs:string"/>
+ <xs:element name="UserName" type="xs:string"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <!-- This is included only once as the last element in TestScript -->
+ <xs:element name="ScriptResult">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="ElapsedTime" type="xs:integer"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <!-- Location is used in multiple elements -->
+ <xs:element name="Location">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Source" type="xs:string"/>
+ <xs:element name="Line" type="xs:integer"/>
+ <xs:element name="Time" type="xs:integer"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="Debug">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="Location"/>
+ <xs:element name="Message" type="xs:string"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="Support">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="Location"/>
+ <xs:element name="Message" type="xs:string"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="Severe">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="Location"/>
+ <xs:element name="Message" type="xs:string"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="Warning">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="Location"/>
+ <xs:element name="Message" type="xs:string"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="Attention">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="Location"/>
+ <xs:element name="Message" type="xs:string"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <!-- CheckPoint and CheckGroup are both used by TestPoint -->
+ <xs:element name="CheckPoint">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="TestPointName" type="xs:string"/>
+ <xs:element name="Expected" type="xs:string"/>
+ <xs:element name="Actual" type="xs:string"/>
+ <xs:element name="Result" type="xs:string"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <!-- Used to build permutations or the elements in the group -->
+ <xs:group name="Checks">
+ <xs:choice>
+ <xs:element ref="CheckPoint" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element ref="CheckGroup" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:choice>
+ </xs:group>
+
+ <xs:element name="CheckGroup">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="GroupName"/>
+ <xs:element name="Result"/>
+ <xs:group ref="Checks" maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attribute name="Mode" type="xs:string" use="required"/>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="TestPoint">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Number" type="xs:integer"/>
+ <xs:element name="Result" type="xs:string"/>
+ <xs:element ref="Location"/>
+ <xs:group ref="Checks" minOccurs="0" maxOccurs="1"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <!-- Used to build permutations or the elements in the group -->
+ <xs:group name="Messages">
+ <xs:choice>
+ <xs:element ref="Trace" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element ref="Debug" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element ref="TestPoint" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element ref="Support" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element ref="Severe" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element ref="Warning" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element ref="Attention" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:choice>
+ </xs:group>
+
+ <!-- Both Trace and TestCase can hold any element, any number of times -->
+ <!-- With the exception that only TestScript can hold a TestCase -->
+ <xs:element name="Trace">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="ObjectName" type="xs:string"/>
+ <xs:element name="MethodName" type="xs:string"/>
+ <xs:element name="MethodArgument" type="xs:string"/>
+ <xs:element ref="Location"/>
+ <xs:group ref="Messages" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+
+ <xs:element name="Tracability">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="RequirementId" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="TestCase">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Number" type="xs:integer"/>
+ <xs:element ref="Tracability"/>
+ <xs:group ref="Messages" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="ScriptInit">
+ <xs:complexType>
+ <xs:group ref="Messages" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:complexType>
+ </xs:element>
+
+ <!-- Base Element in the XML -->
+ <xs:element name="TestScript">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="Config"/>
+ <xs:element ref="ScriptInit"/>
+ <xs:element ref="TestCase" maxOccurs="unbounded"/>
+ <xs:element ref="ScriptResult"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+</xs:schema> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui/.classpath b/org.eclipse.osee.ote.ui/.classpath
new file mode 100644
index 000000000..1fa3e6803
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.ote.ui/.pmd b/org.eclipse.osee.ote.ui/.pmd
new file mode 100644
index 000000000..c7b0a9fb3
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/.pmd
@@ -0,0 +1,925 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<pmd>
+ <useProjectRuleSet>false</useProjectRuleSet>
+ <ruleSetFile>.ruleset</ruleSetFile>
+ <rules>
+ <rule>
+ <name>LooseCoupling</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneMethodMustImplementCloneable</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedImports</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SignatureDeclareThrowsException</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IfStmtsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>WhileLoopsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IfElseStmtsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ForLoopsMustUseBraces</name>
+ <ruleset>Braces Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseSingleton</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanReturns</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanExpressions</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SwitchStmtsShouldHaveDefault</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDeeplyNestedIfStmts</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidReassigningParameters</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SwitchDensity</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConstructorCallsOverridableMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AccessorClassGeneration</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalFieldCouldBeStatic</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloseResource</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonStaticInitializer</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DefaultLabelNotLastInSwitchStmt</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonCaseLabelInSwitchStatement</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>OptimizableToArrayCall</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BadComparison</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EqualsNull</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConfusingTernary</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InstantiationToGetClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IdempotentOperations</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimpleDateFormatNeedsLocale</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ImmutableField</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseLocaleWithCaseConversions</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidProtectedFieldInFinalClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AssignmentToNonFinalStatic</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingStaticMethodInNonInstantiatableClass</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidSynchronizedAtMethodLevel</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingBreakInSwitch</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseNotifyAllInsteadOfNotify</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidInstanceofChecksInCatchClause</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractClassWithoutAbstractMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyConditional</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CompareObjectsWithEquals</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PositionLiteralsFirstInComparisons</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryLocalBeforeReturn</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NonThreadSafeSingleton</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UncommentedEmptyMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UncommentedEmptyConstructor</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidConstantsInterface</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnsynchronizedStaticDateFormatter</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PreserveStackTrace</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseCollectionIsEmpty</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassWithOnlyPrivateConstructorsShouldBeFinal</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyMethodInAbstractClassShouldBeAbstract</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SingularField</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReturnEmptyArrayRatherThanNull</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractClassWithoutAnyMethod</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooFewBranchesForASwitchStatement</name>
+ <ruleset>Design Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCatchingThrowable</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SignatureDeclareThrowsException</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExceptionAsFlowControl</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCatchingNPE</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingRawExceptionTypes</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingNullPointerException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidRethrowingException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotExtendJavaLangError</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotThrowExceptionInFinally</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThrowingNewInstanceOfSameException</name>
+ <ruleset>Strict Exception Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedPrivateField</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedLocalVariable</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedPrivateMethod</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedFormalParameter</name>
+ <ruleset>Unused Code Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MoreThanOneLogger</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LoggerIsNotStaticFinal</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SystemPrintln</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidPrintStackTrace</name>
+ <ruleset>Java Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDuplicateLiterals</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringInstantiation</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringToString</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InefficientStringBuffering</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryCaseChange</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseStringBufferLength</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AppendCharacterWithChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ConsecutiveLiteralAppends</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseIndexOfChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InefficientEmptyStringCheck</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>InsufficientStringBufferDeclaration</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessStringValueOf</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StringBufferInstantiationWithChar</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseEqualsToCompareStrings</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidStringBufferField</name>
+ <ruleset>String and StringBuffer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceVectorWithList</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceHashtableWithMap</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReplaceEnumerationWithIterator</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidEnumAsIdentifier</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidAssertAsIdentifier</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>IntegerInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ByteInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ShortInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LongInstantiation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseBeforeAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseAfterAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4TestShouldUseTestAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnit4SuitesShouldUseSuiteAnnotation</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitUseExpected</name>
+ <ruleset>Migration Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseProperClassLoader</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MDBAndSessionBeanNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>RemoteSessionInterfaceNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LocalInterfaceSessionNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LocalHomeNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>RemoteInterfaceNamingConvention</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotCallSystemExit</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>StaticEJBFieldShouldBeFinal</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotUseThreads</name>
+ <ruleset>J2EE Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidInstantiatingObjectsInLoops</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseArrayListInsteadOfVector</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyStartsWith</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseStringBufferForStringAppends</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseArraysAsList</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidArrayLoops</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryWrapperObjectCreation</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AddEmptyString</name>
+ <ruleset>Optimization Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyCatchBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyIfStmt</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyWhileStmt</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyTryBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyFinallyBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptySwitchStatements</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JumbledIncrementer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ForLoopShouldBeWhileLoop</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryConversionTemporary</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>OverrideBothEqualsAndHashcode</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoubleCheckedLocking</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ReturnFromFinallyBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptySynchronizedBlock</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryReturn</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyStaticInitializer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnconditionalIfStatement</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyStatementNotInLoop</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanInstantiation</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryFinalModifier</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CollapsibleIfStatements</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessOverridingMethod</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassCastExceptionWithToArray</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDecimalLiteralsInBigDecimalConstructor</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UselessOperationOnImmutable</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MisplacedNullCheck</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedNullCheckInEquals</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidThreadGroup</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BrokenNullCheck</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BigIntegerInstantiation</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingOctalValues</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingHardCodedIP</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CheckResultSet</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidMultipleUnaryOperators</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyInitializer</name>
+ <ruleset>Basic Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodReturnsInternalArray</name>
+ <ruleset>Security Code Guidelines</ruleset>
+ </rule>
+ <rule>
+ <name>ArrayIsStoredDirectly</name>
+ <ruleset>Security Code Guidelines</ruleset>
+ </rule>
+ <rule>
+ <name>CouplingBetweenObjects</name>
+ <ruleset>Coupling Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveImports</name>
+ <ruleset>Coupling Rules</ruleset>
+ </rule>
+ <rule>
+ <name>LooseCoupling</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DuplicateImports</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DontImportJavaLang</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedImports</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ImportFromSamePackage</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyStaticImports</name>
+ <ruleset>Import Statement Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitStaticSuite</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitSpelling</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitAssertionsShouldIncludeMessage</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>JUnitTestsShouldIncludeAssert</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TestClassWithoutTestCases</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryBooleanAssertion</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertEqualsInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertSameInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseAssertNullInsteadOfAssertTrue</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SimplifyBooleanAssertion</name>
+ <ruleset>JUnit Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NullAssignment</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnusedModifier</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AssignmentInOperand</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AtLeastOneConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DontImportSun</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousOctalEscape</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CallSuperInConstructor</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UnnecessaryParentheses</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DefaultPackage</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanInversion</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DataflowAnomalyAnalysis</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFinalLocalVariable</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingShortType</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingVolatile</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidUsingNativeCode</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidAccessibilityAlteration</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>DoNotCallGarbageCollectionExplicitly</name>
+ <ruleset>Controversial Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodNamingConventions</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ClassNamingConventions</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AbstractNaming</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidDollarSigns</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MethodWithSameNameAsEnclosingClass</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousHashcodeMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousConstantFieldName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>SuspiciousEqualsMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFieldNameMatchingTypeName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidFieldNameMatchingMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NoPackage</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>PackageCase</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MisleadingVariableName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>BooleanGetMethodName</name>
+ <ruleset>Naming Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NPathComplexity</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveMethodLength</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveParameterList</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessiveClassLength</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CyclomaticComplexity</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ExcessivePublicCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyFields</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssMethodCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssTypeCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>NcssConstructorCount</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>TooManyMethods</name>
+ <ruleset>Code Size Rules</ruleset>
+ </rule>
+ <rule>
+ <name>EmptyFinalizer</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeOnlyCallsSuperFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeOverloaded</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeDoesNotCallSuperFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>FinalizeShouldBeProtected</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>AvoidCallingFinalize</name>
+ <ruleset>Finalizer Rules</ruleset>
+ </rule>
+ <rule>
+ <name>UseCorrectExceptionLogging</name>
+ <ruleset>Jakarta Commons Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ProperLogger</name>
+ <ruleset>Jakarta Commons Logging Rules</ruleset>
+ </rule>
+ <rule>
+ <name>MissingSerialVersionUID</name>
+ <ruleset>JavaBean Rules</ruleset>
+ </rule>
+ <rule>
+ <name>ProperCloneImplementation</name>
+ <ruleset>Clone Implementation Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneThrowsCloneNotSupportedException</name>
+ <ruleset>Clone Implementation Rules</ruleset>
+ </rule>
+ <rule>
+ <name>CloneMethodMustImplementCloneable</name>
+ <ruleset>Type Resolution Rules</ruleset>
+ </rule>
+ </rules>
+ <includeDerivedFiles>false</includeDerivedFiles>
+ <violationsAsErrors>true</violationsAsErrors>
+</pmd>
diff --git a/org.eclipse.osee.ote.ui/.project b/org.eclipse.osee.ote.ui/.project
new file mode 100644
index 000000000..34fe749ab
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ote.ui</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.ui/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.ui/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..a2f785b11
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,46 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Test Core Gui Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.ui;singleton:=true
+Bundle-Version: 0.25.3.qualifier
+Bundle-Activator: org.eclipse.osee.ote.ui.internal.TestCoreGuiPlugin
+Bundle-Vendor: Eclipse Open System Engineering Environment
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.osee.ote.ui,
+ org.eclipse.osee.ote.ui.navigate
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Import-Package: org.eclipse.core.resources,
+ org.eclipse.core.runtime,
+ org.eclipse.core.runtime.jobs,
+ org.eclipse.core.runtime.preferences,
+ org.eclipse.jface.action,
+ org.eclipse.jface.resource,
+ org.eclipse.jface.viewers,
+ org.eclipse.osee.connection.service,
+ org.eclipse.osee.framework.core.exception,
+ org.eclipse.osee.framework.core.operation,
+ org.eclipse.osee.framework.jdk.core.type,
+ org.eclipse.osee.framework.jdk.core.util,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.osee.framework.plugin.core,
+ org.eclipse.osee.framework.plugin.core.util,
+ org.eclipse.osee.framework.ui.plugin,
+ org.eclipse.osee.framework.ui.plugin.util,
+ org.eclipse.osee.framework.ui.plugin.workspace,
+ org.eclipse.osee.framework.ui.plugin.xnavigate,
+ org.eclipse.osee.framework.ui.swt,
+ org.eclipse.osee.ote.core,
+ org.eclipse.osee.ote.core.environment.interfaces,
+ org.eclipse.osee.ote.message,
+ org.eclipse.osee.ote.message.event,
+ org.eclipse.osee.ote.remote.messages,
+ org.eclipse.osee.ote.service,
+ org.eclipse.swt,
+ org.eclipse.swt.widgets,
+ org.eclipse.ui.console,
+ org.eclipse.ui.internal.console,
+ org.osgi.framework,
+ org.osgi.service.event;version="1.3.0",
+ org.osgi.util.tracker
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.ui.workbench
diff --git a/org.eclipse.osee.ote.ui/build.properties b/org.eclipse.osee.ote.ui/build.properties
new file mode 100644
index 000000000..e684dd6e5
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/build.properties
@@ -0,0 +1,8 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ images/,\
+ build.properties,\
+ schema/
diff --git a/org.eclipse.osee.ote.ui/images/checkout.gif b/org.eclipse.osee.ote.ui/images/checkout.gif
new file mode 100644
index 000000000..e7b7fb4d8
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/images/checkout.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui/images/connected_sm.gif b/org.eclipse.osee.ote.ui/images/connected_sm.gif
new file mode 100644
index 000000000..b397d8b2c
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/images/connected_sm.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui/images/welcome_item3.gif b/org.eclipse.osee.ote.ui/images/welcome_item3.gif
new file mode 100644
index 000000000..311f57fe9
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/images/welcome_item3.gif
Binary files differ
diff --git a/org.eclipse.osee.ote.ui/plugin.xml b/org.eclipse.osee.ote.ui/plugin.xml
new file mode 100644
index 000000000..5fa1f5a67
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/plugin.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+ <extension-point id="WorkspaceSetup" name="WorkspaceSetup" schema="schema/WorkspaceSetup.exsd"/>
+ <extension
+ point="org.eclipse.ui.views">
+ <category
+ name="OSEE Test"
+ id="osee.test.category">
+ </category>
+ <view
+ allowMultiple="false"
+ category="osee.test.category"
+ class="org.eclipse.osee.ote.ui.navigate.OteNavigateView"
+ icon="images/welcome_item3.gif"
+ id="org.eclipse.osee.ote.ui.navigate.OteNavigateView"
+ name="OTE Navigator"/>
+ </extension>
+ <extension
+ id="testnature"
+ name="Test Nature"
+ point="org.eclipse.core.resources.natures">
+ <runtime>
+ <run
+ class="org.eclipse.osee.ote.ui.ProjectNatureTest">
+ </run>
+ </runtime>
+ </extension>
+ <extension
+ point="org.eclipse.ui.perspectives">
+ <perspective
+ class="org.eclipse.osee.ote.ui.TestPerspective"
+ fixed="false"
+ icon="images/welcome_item3.gif"
+ id="org.eclipse.osee.ote.ui.TestPerspective"
+ name="OSEE Test"/>
+ </extension>
+ <extension point="org.eclipse.ui.popupMenus">
+ <objectContribution adaptable="true"
+ objectClass="org.eclipse.core.resources.IFile"
+ nameFilter="*.java" id="org.eclipse.osee.ote.ui.menucontribution">
+ <menu
+ label="OTE"
+ path="additions"
+ id="org.eclipse.osee.ote.ui">
+ <separator
+ name="placeholder">
+ </separator>
+ </menu>
+ </objectContribution>
+ <viewerContribution
+ targetID="#CompilationUnitEditorContext"
+ id="viewConf">
+ <menu
+ label="OTE"
+ path="additions"
+ id="org.eclipse.osee.ote.ui.viewer">
+ <separator
+ name="placeholder">
+ </separator>
+ </menu>
+ </viewerContribution>
+
+ </extension>
+ <extension
+ point="org.eclipse.ui.console.consolePageParticipants">
+ <consolePageParticipant
+ class="org.eclipse.osee.ote.ui.internal.OteConsolePageParticipant"
+ id="org.eclipse.osee.ote.ui.oteConsolePreferences">
+ <enablement>
+ <instanceof value="org.eclipse.osee.ote.ui.OteConsole"/>
+ </enablement>
+ </consolePageParticipant>
+ </extension>
+</plugin>
diff --git a/org.eclipse.osee.ote.ui/pom.xml b/org.eclipse.osee.ote.ui/pom.xml
new file mode 100644
index 000000000..c14a84447
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/pom.xml
@@ -0,0 +1,35 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.osee</groupId>
+ <artifactId>org.eclipse.osee.ote.parent</artifactId>
+ <version>0.25.3-SNAPSHOT</version>
+ <relativePath>../org.eclipse.osee.ote.parent</relativePath>
+ </parent>
+
+ <artifactId>org.eclipse.osee.ote.ui</artifactId>
+ <packaging>eclipse-plugin</packaging>
+ <name>OTE Ui (Incubation)</name>
+
+ <build>
+ <!-- workaround for https://issues.sonatype.org/browse/TYCHO-168 -->
+ <resources>
+ <resource>
+ <directory>src</directory>
+ <excludes>
+ <exclude>**/*.java</exclude>
+ </excludes>
+ </resource>
+ </resources>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-source-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui/schema/WorkspaceSetup.exsd b/org.eclipse.osee.ote.ui/schema/WorkspaceSetup.exsd
new file mode 100644
index 000000000..7b8506105
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/schema/WorkspaceSetup.exsd
@@ -0,0 +1,107 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.osee.ote.ui" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.osee.ote.ui" id="WorkspaceSetup" name="WorkspaceSetup"/>
+ </appInfo>
+ <documentation>
+ Contributions to this extension point provide a .psf file defining the project set to configure on the workspace and an optional icon image to be associated with this configuration file. The Extension ID defines the name of the icon created on the test navigation view.
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appInfo>
+ <meta.element />
+ </appInfo>
+ </annotation>
+ <complexType>
+ <sequence>
+ <element ref="WorkspaceConfig"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="WorkspaceConfig">
+ <annotation>
+ <appInfo>
+ <meta.element icon="icon"/>
+ </appInfo>
+ </annotation>
+ <complexType>
+ <attribute name="configFile" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="resource"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="since"/>
+ </appInfo>
+ <documentation>
+ [Enter the first release in which this extension point appears.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="examples"/>
+ </appInfo>
+ <documentation>
+ [Enter extension point usage example here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="apiInfo"/>
+ </appInfo>
+ <documentation>
+ [Enter API information here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="implementation"/>
+ </appInfo>
+ <documentation>
+ [Enter information about supplied implementation of this extension point.]
+ </documentation>
+ </annotation>
+
+
+</schema>
diff --git a/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/IOteConsoleService.java b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/IOteConsoleService.java
new file mode 100644
index 000000000..457e13725
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/IOteConsoleService.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui;
+
+import java.io.IOException;
+import org.eclipse.osee.framework.jdk.core.util.IConsoleInputListener;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public interface IOteConsoleService {
+
+ void addInputListener(IConsoleInputListener listener);
+
+ void removeInputListener(IConsoleInputListener listener);
+
+ void write(String value);
+
+ void write(String value, int type, boolean popup);
+
+ void writeError(String string);
+
+ void prompt(String str) throws IOException;
+
+ void popup();
+}
diff --git a/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/OteConsole.java b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/OteConsole.java
new file mode 100644
index 000000000..29d11135e
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/OteConsole.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.osee.ote.ui.internal.prefs.OteConsolePreferences;
+import org.eclipse.osee.ote.ui.internal.prefs.OteConsolePrefsUtil;
+import org.eclipse.ui.console.IOConsole;
+
+/**
+ * This class provides a way to set the high and low water marks of the console to limit the output buffer.
+ * @author Michael P. Masterson
+ */
+public class OteConsole extends IOConsole {
+ /**
+ * Arbitrary number is arbitrary.
+ */
+ private static final int HIGH_TO_LOW_DIFF = 100;
+
+ private int limit;
+ private boolean noLimit;
+
+ /**
+ * @param name
+ * @param consoleType
+ * @param imageDescriptor
+ */
+ public OteConsole(String name, ImageDescriptor imageDescriptor) {
+ super(name, imageDescriptor);
+ limit = OteConsolePrefsUtil.getInt(OteConsolePreferences.BUFFER_LIMIT);
+ noLimit = OteConsolePrefsUtil.getBoolean(OteConsolePreferences.NO_BUFFER_LIMIT);
+ setWaterMarks();
+ }
+
+ /**
+ * When the limit is too small (less than {@value #HIGH_TO_LOW_DIFF}), the low and high mark will be right next to eachother
+ * meaning that characters will be deleted from the beginning at the same speed as they are being written
+ * to the end. Otherwise, every time the limit is hit, the buffer will shrink by {@value #HIGH_TO_LOW_DIFF}.
+ */
+ private void setWaterMarks() {
+ int lowMark, highMark;
+
+ if(noLimit) {
+ lowMark = -1;
+ highMark = -1;
+ } else if( limit > HIGH_TO_LOW_DIFF ){
+ lowMark = limit - HIGH_TO_LOW_DIFF;
+ highMark = limit;
+ } else {
+ lowMark = limit -1;
+ highMark = limit;
+ }
+
+ setWaterMarks(lowMark, highMark);
+ }
+
+ /**
+ * @param limit the buffer size limit in bytes
+ */
+ public void setLimit(int limit) {
+ this.limit = limit;
+ setWaterMarks();
+ }
+
+ public void setNoLimit(boolean noLimit) {
+ this.noLimit = noLimit;
+ setWaterMarks();
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/OteConsoleWrapper.java b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/OteConsoleWrapper.java
new file mode 100644
index 000000000..067b1a328
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/OteConsoleWrapper.java
@@ -0,0 +1,270 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.PrintStream;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.logging.Level;
+
+import org.eclipse.osee.framework.jdk.core.util.IConsoleInputListener;
+import org.eclipse.osee.framework.jdk.core.util.Lib;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.swt.Displays;
+import org.eclipse.osee.ote.ui.internal.TestCoreGuiPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.ui.console.ConsolePlugin;
+import org.eclipse.ui.console.IConsole;
+import org.eclipse.ui.console.IOConsole;
+import org.eclipse.ui.console.IOConsoleOutputStream;
+
+/**
+ * This class is needed to get the OTE specific OTE Console class which will provide the ability to set the buffer limit of the console
+ * @author Michael P. Masterson
+ */
+public class OteConsoleWrapper {
+ private IOConsoleOutputStream streamOut = null;
+
+ private IOConsoleOutputStream streamErr = null;
+
+ private IOConsoleOutputStream streamPrompt = null;
+
+ private final IOConsole console;
+
+ private final HandleInput inputHandler;
+
+ private final boolean time;
+
+ private final Thread thread;
+
+ private boolean newline;
+
+ public OteConsoleWrapper(String title) {
+ this(title, true, true);
+ }
+
+ public OteConsoleWrapper(String title, boolean time, boolean newline) {
+ console = createConsole(title);
+ this.time = time;
+ this.newline = newline;
+ this.inputHandler = new HandleInput();
+
+ thread = new Thread(inputHandler);
+ thread.setName("Osee console input handler");
+ ConsolePlugin.getDefault().getConsoleManager().addConsoles(new IConsole[] {console});
+ Displays.ensureInDisplayThread(new Runnable() {
+ @Override
+ public void run() {
+ streamOut = console.newOutputStream();// newMessageStream();
+ streamOut.setColor(Displays.getSystemColor(SWT.COLOR_BLACK));
+ streamOut.setActivateOnWrite(false);
+ streamErr = console.newOutputStream();
+ streamErr.setColor(Displays.getSystemColor(SWT.COLOR_RED));
+ streamErr.setActivateOnWrite(false);
+ streamPrompt = console.newOutputStream();
+ streamPrompt.setColor(Displays.getSystemColor(SWT.COLOR_BLUE));
+ streamPrompt.setActivateOnWrite(false);
+ }
+ });
+ thread.start();
+ }
+
+ /**
+ * @param low
+ * @param high
+ * @see org.eclipse.ui.console.IOConsole#setWaterMarks(int, int)
+ */
+ public void setWaterMarks(int low, int high) {
+ this.console.setWaterMarks(low, high);
+ }
+
+ /**
+ * This should only be called once in the constructor. This method may be overridden by subclasses if a different
+ * instance of an IOConsole is required.
+ * @param title
+ * @return a new IOConsole with the title provided
+ */
+ protected IOConsole createConsole(String title) {
+ return new OteConsole(title, null);
+ }
+
+ public PrintStream getPrintStream() {
+ return new PrintStream(streamOut);
+ }
+
+ public void shutdown() {
+ thread.interrupt();
+ try {
+ thread.join(5000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ } finally {
+ ConsolePlugin.getDefault().getConsoleManager().removeConsoles(new IConsole[] {console});
+ }
+ }
+
+ public static final int CONSOLE_ERROR = 0;
+
+ public static final int CONSOLE_OUT = 1;
+
+ public static final int CONSOLE_PROMPT = 2;
+
+ /**
+ * Writes string to console without popping console forward
+ * @param str
+ */
+ public void write(String str) {
+ write(str, false);
+ }
+
+ /**
+ * Writes string to console without popping console forward
+ * @param str
+ */
+ public void writeError(String str) {
+ write(str, CONSOLE_ERROR, true);
+ }
+
+ /**
+ * Writes string to console
+ * @param str
+ *
+ * @param popup bring console window forward
+ */
+ public void write(String str, boolean popup) {
+ write(str, CONSOLE_OUT, popup);
+ }
+
+ /**
+ * Write string to console
+ * @param str
+ *
+ * @param type CONSOLE_ERROR, CONSOLE_OUT, CONSOLE_PROMPT
+ */
+ public void write(String str, int type) {
+ write(str, type, false);
+ }
+
+ /**
+ * Write string to console
+ * @param str
+ *
+ * @param type CONSOLE_ERROR, CONSOLE_OUT, CONSOLE_PROMPT
+ * @param popup bring console window forward
+ */
+ public void write(String str, int type, boolean popup) {
+ String time = "";
+ if (this.time) {
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(new Date());
+
+ if (cal.get(Calendar.HOUR) == 0) {
+ time = "12";
+ } else {
+ time = "" + cal.get(Calendar.HOUR);
+ }
+ time = Lib.padLeading(time, '0', 2);
+ String minute = "" + cal.get(Calendar.MINUTE);
+ minute = Lib.padLeading(minute, '0', 2);
+ time += ":" + minute + " => ";
+ }
+ try {
+ sendToStreams(type, time);
+ if (str.length() > 100000) {
+ int i = 0;
+
+ while (i < str.length()) {
+ int endIndex = i + 100000;
+ endIndex = endIndex > str.length() ? str.length() : endIndex;
+ String chunk = str.substring(i, endIndex);
+ sendToStreams(type, chunk);
+ i = endIndex;
+ }
+ } else {
+ sendToStreams(type, str);
+ }
+ if(newline ){
+ sendToStreams(type, "\n");
+ }
+ if (popup) {
+ popup();
+ }
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ public void prompt(String str) throws IOException {
+ sendToStreams(CONSOLE_PROMPT, str);
+ }
+
+ private void sendToStreams(int type, String str) throws IOException {
+ if (type == CONSOLE_ERROR && streamErr != null) {
+ streamErr.write(str);
+ }
+ if (type == CONSOLE_PROMPT && streamPrompt != null) {
+ streamPrompt.write(str);
+ }
+ if (type == CONSOLE_OUT && streamOut != null) {
+ streamOut.write(str);
+ }
+ }
+
+ public void popup() {
+ ConsolePlugin.getDefault().getConsoleManager().showConsoleView(console);
+ }
+
+ public void addInputListener(IConsoleInputListener listener) {
+ inputHandler.addListener(listener);
+ }
+
+ public void removeInputListener(IConsoleInputListener listener) {
+ inputHandler.removeListener(listener);
+ }
+
+ private class HandleInput implements Runnable {
+
+ private final CopyOnWriteArrayList<IConsoleInputListener> listeners;
+
+ public HandleInput() {
+ listeners = new CopyOnWriteArrayList<>();
+ }
+
+ public void addListener(IConsoleInputListener listener) {
+ listeners.add(listener);
+ }
+
+ public void removeListener(IConsoleInputListener listener) {
+ listeners.remove(listener);
+ }
+
+ @Override
+ public void run() {
+ BufferedReader input = new BufferedReader(new InputStreamReader(console.getInputStream()));
+ try {
+ String line = null;
+ while ((line = input.readLine()) != null) {
+ for (IConsoleInputListener listener : listeners) {
+ listener.lineRead(line);
+ }
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ OseeLog.log(TestCoreGuiPlugin.class, Level.INFO, "done with the handling of input");
+ }
+
+ }
+}
diff --git a/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/OteImage.java b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/OteImage.java
new file mode 100644
index 000000000..0839ac7ae
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/OteImage.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.osee.framework.ui.swt.ImageManager;
+import org.eclipse.osee.framework.ui.swt.KeyedImage;
+import org.eclipse.osee.ote.ui.internal.TestCoreGuiPlugin;
+
+/**
+ * @author Andrew M. Finkbeiner
+ */
+public enum OteImage implements KeyedImage {
+ CHECKOUT("checkout.gif"),
+ CONNECTED("connected_sm.gif"),
+ OTE("welcome_item3.gif");
+
+ private final String fileName;
+
+ private OteImage(String fileName) {
+ this.fileName = fileName;
+ }
+
+ @Override
+ public ImageDescriptor createImageDescriptor() {
+ return ImageManager.createImageDescriptor(TestCoreGuiPlugin.PLUGIN_ID, "images", fileName);
+ }
+
+ @Override
+ public String getImageKey() {
+ return TestCoreGuiPlugin.PLUGIN_ID + ".images." + fileName;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/OteRemoteConsole.java b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/OteRemoteConsole.java
new file mode 100644
index 000000000..4dfeafe5f
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/OteRemoteConsole.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui;
+
+import java.rmi.RemoteException;
+import java.util.logging.Level;
+
+import org.eclipse.osee.connection.service.IServiceConnector;
+import org.eclipse.osee.framework.jdk.core.util.IConsoleInputListener;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.core.environment.interfaces.IRemoteCommandConsole;
+import org.eclipse.osee.ote.core.environment.interfaces.ITestEnvironment;
+import org.eclipse.osee.ote.service.ConnectionEvent;
+import org.eclipse.osee.ote.service.ITestConnectionListener;
+import org.eclipse.osee.ote.ui.internal.TestCoreGuiPlugin;
+
+public class OteRemoteConsole implements IConsoleInputListener, ITestConnectionListener {
+
+ private IRemoteCommandConsole remoteConsole;
+ private ITestEnvironment env;
+ private final IOteConsoleService oteConsoleService;
+
+ public OteRemoteConsole(IOteConsoleService oteConsoleService) {
+ this.oteConsoleService = oteConsoleService;
+ }
+
+ @Override
+ public void lineRead(String line) {
+ try {
+ String result = remoteConsole.doCommand(line);
+ oteConsoleService.write(result);
+ } catch (RemoteException e) {
+ OseeLog.log(TestCoreGuiPlugin.class, Level.SEVERE, "exception executing command " + line, e);
+ oteConsoleService.writeError("Exception during executing of command. See Error Log");
+ }
+ }
+
+ public void close() {
+ if (env != null) {
+ try {
+ env.closeCommandConsole(remoteConsole);
+ } catch (Exception e) {
+ OseeLog.log(TestCoreGuiPlugin.class, Level.INFO, "failed to close remote terminal", e);
+ }
+ }
+
+ oteConsoleService.removeInputListener(this);
+
+ env = null;
+ }
+
+ @Override
+ public void onConnectionLost(IServiceConnector connector) {
+ oteConsoleService.removeInputListener(this);
+
+ env = null;
+ }
+
+ @Override
+ public void onPostConnect(ConnectionEvent event) {
+ try {
+ env = event.getEnvironment();
+ remoteConsole = env.getCommandConsole();
+ oteConsoleService.addInputListener(this);
+ } catch (RemoteException e) {
+ OseeLog.log(TestCoreGuiPlugin.class, Level.SEVERE, "exception acquiring remote console", e);
+ }
+ }
+
+ @Override
+ public void onPreDisconnect(ConnectionEvent event) {
+ close();
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/ProjectNatureTest.java b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/ProjectNatureTest.java
new file mode 100644
index 000000000..1b59976f2
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/ProjectNatureTest.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectNature;
+import org.eclipse.core.runtime.CoreException;
+
+public class ProjectNatureTest implements IProjectNature {
+
+ public static final String TEST_NATURE = "org.eclipse.osee.ote.ui.testnature";
+
+ private static List<IProject> testProjects = new ArrayList<>();
+
+ private IProject project;
+
+ @Override
+ public void configure() throws CoreException {
+ testProjects.add(project);
+ }
+
+ @Override
+ public void deconfigure() throws CoreException {
+ testProjects.remove(project);
+ }
+
+ @Override
+ public IProject getProject() {
+ return project;
+ }
+
+ @Override
+ public void setProject(IProject project) {
+ this.project = project;
+ }
+
+ public static List<IProject> getTestProjects() {
+ return testProjects;
+ }
+}
diff --git a/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/RemoteConsoleLauncher.java b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/RemoteConsoleLauncher.java
new file mode 100644
index 000000000..bb69e50c2
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/RemoteConsoleLauncher.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui;
+
+import org.eclipse.osee.ote.service.IOteClientService;
+import org.eclipse.osee.ote.ui.internal.TestCoreGuiPlugin;
+import org.osgi.framework.ServiceReference;
+import org.osgi.util.tracker.ServiceTracker;
+
+public class RemoteConsoleLauncher extends ServiceTracker {
+
+ private OteRemoteConsole remoteConsole;
+
+ private final IOteConsoleService oteConsoleService;
+
+ public RemoteConsoleLauncher(IOteConsoleService oteConsoleService) {
+ super(TestCoreGuiPlugin.getContext(), IOteClientService.class.getName(), null);
+ this.oteConsoleService = oteConsoleService;
+ }
+
+ @Override
+ public Object addingService(ServiceReference reference) {
+ IOteClientService clientService = (IOteClientService) super.addingService(reference);
+ remoteConsole = new OteRemoteConsole(oteConsoleService);
+ clientService.addConnectionListener(remoteConsole);
+ return clientService;
+ }
+
+ @Override
+ public void close() {
+ if (remoteConsole != null) {
+ IOteClientService service = (IOteClientService) getService();
+ service.removeConnectionListener(remoteConsole);
+ remoteConsole.close();
+ }
+ super.close();
+ }
+
+ @Override
+ public void removedService(ServiceReference reference, Object service) {
+ if (remoteConsole != null) {
+ remoteConsole.close();
+ remoteConsole = null;
+ }
+ super.removedService(reference, service);
+ }
+}
diff --git a/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/TestPerspective.java b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/TestPerspective.java
new file mode 100644
index 000000000..62263829c
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/TestPerspective.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.osee.ote.ui;
+
+import org.eclipse.osee.ote.ui.navigate.OteNavigateView;
+import org.eclipse.ui.IFolderLayout;
+import org.eclipse.ui.IPageLayout;
+import org.eclipse.ui.IPerspectiveFactory;
+
+public class TestPerspective implements IPerspectiveFactory {
+
+ public TestPerspective() {
+ super();
+ }
+
+ @Override
+ public void createInitialLayout(IPageLayout layout) {
+ defineActions(layout);
+ defineLayout(layout);
+ }
+
+ public void defineActions(IPageLayout layout) {
+
+ // Add "show views".
+ // layout.addShowViewShortcut("org.eclipse.osee.framework.ui.service.control.view.ServiceManagerView");
+ layout.addShowViewShortcut(OteNavigateView.VIEW_ID);
+ // layout.addShowViewShortcut(EgiView.VIEW_ID);
+ // layout.addShowViewShortcut(EufdView.VIEW_ID);
+ // layout.addShowViewShortcut(GunView.VIEW_ID);
+ // layout.addShowViewShortcut(IhdssView.VIEW_ID);
+ // layout.addShowViewShortcut(KeyboardView.VIEW_ID);
+ // layout.addShowViewShortcut(LmpView.VIEW_ID);
+ // layout.addShowViewShortcut(MpdView.VIEW_ID);
+ // layout.addShowViewShortcut(MtadsView.VIEW_ID);
+ // layout.addShowViewShortcut(RocketView.VIEW_ID);
+ // layout.addShowViewShortcut(UtaView.VIEW_ID);
+ // layout.addShowViewShortcut(EmulatorsView.VIEW_ID);
+ layout.addShowViewShortcut("org.eclipse.pde.runtime.LogView");
+ layout.addShowViewShortcut("org.eclipse.ui.console.ConsoleView");
+ layout.addShowViewShortcut("org.eclipse.jdt.ui.PackageExplorer");
+ layout.addShowViewShortcut(IPageLayout.ID_PROBLEM_VIEW);
+
+ }
+
+ public void defineLayout(IPageLayout layout) {
+ // Editors are placed for free.
+ String editorArea = layout.getEditorArea();
+
+ // Place navigator and outline to left of
+ // editor area.
+ IFolderLayout left = layout.createFolder("left", IPageLayout.LEFT, (float) 0.20, editorArea);
+ left.addView(OteNavigateView.VIEW_ID);
+ left.addView("org.eclipse.jdt.ui.PackageExplorer");
+
+ IFolderLayout lower = layout.createFolder("bottom", IPageLayout.BOTTOM, (float) 0.65, editorArea);
+ lower.addView("org.eclipse.pde.runtime.LogView");
+ lower.addView("org.eclipse.ui.console.ConsoleView");
+ lower.addView(IPageLayout.ID_PROBLEM_VIEW);
+
+ // string found in JavaUI.ID_ACTION_SET
+ layout.addActionSet("org.eclipse.jdt.ui.JavaActionSet");
+
+ // string found in JavaUI.ID_ELEMENT_CRATION_ACTION_SET
+ layout.addActionSet("org.eclipse.jdt.ui.JavaElementCreationActionSet");
+ layout.addActionSet(IPageLayout.ID_NAVIGATE_ACTION_SET);
+
+ }
+}
diff --git a/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/OteConsolePageParticipant.java b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/OteConsolePageParticipant.java
new file mode 100644
index 000000000..4b2615f61
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/OteConsolePageParticipant.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.internal;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.osee.ote.ui.OteConsole;
+import org.eclipse.osee.ote.ui.internal.wizard.OteConsolePrefsWizard;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.console.IConsole;
+import org.eclipse.ui.console.IConsolePageParticipant;
+import org.eclipse.ui.part.IPageBookViewPage;
+import org.eclipse.ui.part.IPageSite;
+
+public class OteConsolePageParticipant implements IConsolePageParticipant {
+
+ private IPageBookViewPage page;
+ private IActionBars bars;
+ private Action optionsButton;
+ private OteConsole console;
+
+ @Override
+ public <T> T getAdapter(Class<T> adapter) {
+ return null;
+ }
+
+ @Override
+ public void init(IPageBookViewPage page, IConsole console) {
+ this.console = (OteConsole) console;
+ this.page = page;
+ IPageSite site = page.getSite();
+ this.bars = site.getActionBars();
+
+ createOptionsButton();
+
+ bars.getMenuManager().add(optionsButton);
+
+ bars.updateActionBars();
+ }
+
+ private void createOptionsButton() {
+ this.optionsButton = new Action("Preferences") {
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.action.Action#run()
+ */
+ @Override
+ public void run() {
+ WizardDialog wd = new WizardDialog(Display.getCurrent().getActiveShell(), new OteConsolePrefsWizard(console));
+ wd.open();
+ }
+ };
+ }
+
+ @Override
+ public void dispose() {
+ this.page = null;
+ this.bars = null;
+ this.optionsButton = null;
+ }
+
+ @Override
+ public void activated() {
+ update();
+ }
+
+ private void update() {
+ if(page == null) {
+ return;
+ }
+
+ optionsButton.setEnabled(true);
+
+ bars.updateActionBars();
+ }
+
+ @Override
+ public void deactivated() {
+ update();
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/OteConsoleServiceImpl.java b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/OteConsoleServiceImpl.java
new file mode 100644
index 000000000..ef4d4bf46
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/OteConsoleServiceImpl.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.internal;
+
+import java.io.IOException;
+
+import org.eclipse.osee.framework.jdk.core.util.IConsoleInputListener;
+import org.eclipse.osee.ote.ui.IOteConsoleService;
+import org.eclipse.osee.ote.ui.OteConsoleWrapper;
+
+/**
+ * @author Roberto E. Escobar
+ */
+public class OteConsoleServiceImpl implements IOteConsoleService {
+
+ private final OteConsoleWrapper console = new OteConsoleWrapper("OTE Console");
+
+ private OteConsoleWrapper getConsole() {
+ return console;
+ }
+
+ @Override
+ public void addInputListener(IConsoleInputListener listener) {
+ if (listener != null) {
+ getConsole().addInputListener(listener);
+ }
+ }
+
+ @Override
+ public void removeInputListener(IConsoleInputListener listener) {
+ if (listener != null) {
+ getConsole().removeInputListener(listener);
+ }
+ }
+
+ @Override
+ public void write(String value) {
+ getConsole().write(value);
+ }
+
+ @Override
+ public void writeError(String value) {
+ getConsole().writeError(value);
+ }
+
+ @Override
+ public void prompt(String value) throws IOException {
+ getConsole().prompt(value);
+ }
+
+ @Override
+ public void popup() {
+ getConsole().popup();
+ }
+
+ @Override
+ public void write(String value, int type, boolean popup) {
+ getConsole().write(value, type, popup);
+ }
+
+ public void close() {
+ getConsole().shutdown();
+ }
+ }
diff --git a/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/OteServerConsole.java b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/OteServerConsole.java
new file mode 100644
index 000000000..9290154d2
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/OteServerConsole.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.internal;
+
+import java.io.IOException;
+
+import org.eclipse.osee.framework.jdk.core.util.IConsoleInputListener;
+import org.eclipse.osee.framework.ui.plugin.util.OseeConsole;
+import org.eclipse.osee.ote.message.event.OteEventMessageUtil;
+import org.eclipse.osee.ote.remote.messages.ConsoleInputMessage;
+import org.eclipse.osee.ote.remote.messages.ConsoleOutputMessage;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventHandler;
+
+public class OteServerConsole {
+
+ private final OseeConsole console = new OseeConsole("OTE Server", false, false);
+ private ServiceRegistration<EventHandler> registration;
+
+ public OteServerConsole() {
+ console.addInputListener(new OTEServerConsoleInputListener());
+ registration = OteEventMessageUtil.subscribe(ConsoleOutputMessage.TOPIC, new ConsoleOutputHandler(console));
+ }
+
+ private OseeConsole getConsole() {
+ return console;
+ }
+
+ public void close() {
+ getConsole().shutdown();
+ if(registration != null){
+ registration.unregister();
+ registration = null;
+ }
+ }
+
+ private static class ConsoleOutputHandler implements EventHandler {
+
+ private OseeConsole console;
+ private ConsoleOutputMessage output;
+
+ public ConsoleOutputHandler(OseeConsole console) {
+ this.console = console;
+ this.output = new ConsoleOutputMessage();
+ }
+
+ @Override
+ public void handleEvent(Event arg0) {
+ output.setBackingBuffer(OteEventMessageUtil.getBytes(arg0));
+ try {
+ console.write(output.getString());
+ } catch (IOException e) {
+ e.printStackTrace();
+ } catch (ClassNotFoundException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ }
+
+ private static class OTEServerConsoleInputListener implements IConsoleInputListener {
+
+ private ConsoleInputMessage input = new ConsoleInputMessage();
+
+ @Override
+ public void lineRead(String line) {
+ try {
+ input.setString(line);
+ OteEventMessageUtil.sendEvent(input);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ }
+}
diff --git a/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/TestCoreGuiPlugin.java b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/TestCoreGuiPlugin.java
new file mode 100644
index 000000000..23431b236
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/TestCoreGuiPlugin.java
@@ -0,0 +1,171 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.internal;
+
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.osee.framework.core.operation.AbstractOperation;
+import org.eclipse.osee.framework.core.operation.Operations;
+import org.eclipse.osee.framework.jdk.core.type.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.plugin.core.IWorkbenchUserService;
+import org.eclipse.osee.framework.ui.plugin.workspace.SafeWorkspaceAccess;
+import org.eclipse.osee.ote.ui.IOteConsoleService;
+import org.eclipse.osee.ote.ui.RemoteConsoleLauncher;
+import org.eclipse.osee.ote.ui.internal.prefs.OteConsolePreferences;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * The main plugin class to be used in the desktop.
+ */
+@SuppressWarnings("rawtypes")
+public class TestCoreGuiPlugin extends AbstractUIPlugin {
+
+ public static final String PLUGIN_ID = "org.eclipse.osee.ote.ui";
+
+ private static TestCoreGuiPlugin instance;
+
+ private ServiceRegistration oteConsoleServiceRegistration;
+ private ServiceTracker workbenchUserServiceTracker;
+
+ private ServiceTracker workspaceStartTracker;
+ private OteConsoleServiceImpl oteConsoleService;
+ private BundleContext context;
+
+ @Override
+ public void start(final BundleContext context) throws Exception {
+ this.context = context;
+ instance = this;
+ createWorkspaceTracker(context);
+ if (System.getProperty("NO_OTE_ARTIFACT_BULK_LOAD") == null) {
+ startOTEArtifactBulkLoad();
+ }
+ super.start(context);
+ }
+
+ /**
+ * @param context
+ */
+ @SuppressWarnings("unchecked")
+ private void createWorkspaceTracker(final BundleContext context) {
+ workspaceStartTracker = new ServiceTracker(context, SafeWorkspaceAccess.class.getName(), null) {
+ private RemoteConsoleLauncher tracker;
+
+ @Override
+ public void removedService(ServiceReference reference, Object service) {
+ if (oteConsoleService != null) {
+ oteConsoleServiceRegistration.unregister();
+ oteConsoleService.close();
+ oteConsoleService = null;
+ }
+ if (tracker != null) {
+ tracker.close();
+ }
+ super.removedService(reference, service);
+ }
+
+ @Override
+ public void close() {
+ if (tracker != null) {
+ tracker.close();
+ }
+ super.close();
+ }
+
+ @Override
+ public void modifiedService(ServiceReference reference, Object service) {
+ // do nothing
+ }
+
+ @Override
+ public Object addingService(ServiceReference reference) {
+ oteConsoleService = new OteConsoleServiceImpl();
+ oteConsoleServiceRegistration =
+ context.registerService(IOteConsoleService.class.getName(), oteConsoleService, null);
+ if (System.getProperty("NO_OTE_REMOTE_CONSOLE") == null) {
+ tracker = new RemoteConsoleLauncher(oteConsoleService);
+ tracker.open(true);
+ }
+ return super.addingService(reference);
+ }
+ };
+ workspaceStartTracker.open(true);
+
+ workbenchUserServiceTracker = new ServiceTracker(context, IWorkbenchUserService.class.getName(), null);
+ workbenchUserServiceTracker.open();
+ }
+
+ public static void setDefaultPreferences() {
+ IPreferenceStore store = getDefault().getPreferenceStore();
+ for( OteConsolePreferences pref : OteConsolePreferences.values()) {
+ store.setDefault(pref.getPropKey(), pref.getDefaultValue().toString());
+ }
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ if (workbenchUserServiceTracker != null) {
+ workbenchUserServiceTracker.close();
+ }
+ if (oteConsoleServiceRegistration != null) {
+ oteConsoleServiceRegistration.unregister();
+ oteConsoleService.close();
+ oteConsoleService = null;
+ }
+ workspaceStartTracker.close();
+ instance = null;
+
+ super.stop(context);
+ }
+
+ private void startOTEArtifactBulkLoad() {
+ Operations.executeAsJob(new AbstractOperation("OTE Persistance Bulk Load", PLUGIN_ID) {
+
+ @Override
+ protected void doWork(IProgressMonitor monitor) throws Exception {
+ try{
+ if (getWorkbenchUserService() != null) {
+ getWorkbenchUserService().getUser();
+ }
+ } catch (Throwable th){
+ OseeLog.log(getClass(), Level.WARNING, "Unable to connect to OSEE Data Store, user information will default to system properties.", th);
+ }
+ }
+ }, false);
+ }
+
+ private IWorkbenchUserService getWorkbenchUserService() throws OseeCoreException {
+ IWorkbenchUserService service = null;
+ try {
+ service = (IWorkbenchUserService) workbenchUserServiceTracker.waitForService(3000);
+ } catch (InterruptedException ex) {
+ OseeCoreException.wrapAndThrow(ex);
+ }
+ return service;
+ }
+
+ public static TestCoreGuiPlugin getDefault() {
+ return instance;
+ }
+
+ public IOteConsoleService getOteConsoleService() {
+ return oteConsoleService;
+ }
+
+ public static BundleContext getContext() {
+ return instance.context;
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/prefs/OteConsolePreferences.java b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/prefs/OteConsolePreferences.java
new file mode 100644
index 000000000..8c8bdf724
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/prefs/OteConsolePreferences.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.internal.prefs;
+
+/**
+ * @author Michael P. Masterson
+ */
+public enum OteConsolePreferences {
+ BUFFER_LIMIT("org.eclipse.osee.ote.ui.bufferLimit", 1000000),
+ NO_BUFFER_LIMIT("org.eclipse.osee.ote.ui.noLimit", false);
+
+
+ private String propKey;
+ private Object defaultValue;
+
+ private OteConsolePreferences(String propKey, Object defaultValue) {
+ this.propKey = propKey;
+ this.defaultValue = defaultValue;
+ }
+
+ /**
+ * @return the defaultValue
+ */
+ public Object getDefaultValue() {
+ return defaultValue;
+ }
+
+ /**
+ * @return the propKey
+ */
+ public String getPropKey() {
+ return propKey;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/prefs/OteConsolePrefsUtil.java b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/prefs/OteConsolePrefsUtil.java
new file mode 100644
index 000000000..d4a6a2dad
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/prefs/OteConsolePrefsUtil.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.internal.prefs;
+
+import org.eclipse.osee.ote.ui.internal.TestCoreGuiPlugin;
+
+/**
+ * @author Michael P. Masterson
+ */
+public class OteConsolePrefsUtil {
+
+ public static int getInt(OteConsolePreferences bufferLimit) {
+ String propKey = bufferLimit.getPropKey();
+ lateLoadDefaults(propKey);
+ return TestCoreGuiPlugin.getDefault().getPreferenceStore().getInt(propKey);
+ }
+
+ public static String getString(OteConsolePreferences bufferLimit) {
+ String propKey = bufferLimit.getPropKey();
+ lateLoadDefaults(propKey);
+ return TestCoreGuiPlugin.getDefault().getPreferenceStore().getString(propKey);
+ }
+
+ public static boolean getBoolean(OteConsolePreferences bufferLimit) {
+ String propKey = bufferLimit.getPropKey();
+ lateLoadDefaults(propKey);
+ return TestCoreGuiPlugin.getDefault().getPreferenceStore().getBoolean(propKey);
+ }
+
+ public static void setInt(OteConsolePreferences preference, int value) {
+ TestCoreGuiPlugin.getDefault().getPreferenceStore().setValue(preference.getPropKey(), value);
+ }
+
+ public static void setString(OteConsolePreferences preference, String value) {
+ TestCoreGuiPlugin.getDefault().getPreferenceStore().setValue(preference.getPropKey(), value);
+ }
+
+ public static void setBoolean(OteConsolePreferences preference, boolean value) {
+ TestCoreGuiPlugin.getDefault().getPreferenceStore().setValue(preference.getPropKey(), value);
+ }
+
+ private static void lateLoadDefaults(String keyStr) {
+ TestCoreGuiPlugin plugin = TestCoreGuiPlugin.getDefault();
+ String defaultString = plugin.getPreferenceStore().getDefaultString(keyStr);
+ if(defaultString == null || defaultString.length() <= 0) {
+ TestCoreGuiPlugin.setDefaultPreferences();
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/wizard/OteConsolePrefsWizPage.java b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/wizard/OteConsolePrefsWizPage.java
new file mode 100644
index 000000000..73c3985f1
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/wizard/OteConsolePrefsWizPage.java
@@ -0,0 +1,177 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.internal.wizard;
+
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.osee.ote.ui.internal.prefs.OteConsolePreferences;
+import org.eclipse.osee.ote.ui.internal.prefs.OteConsolePrefsUtil;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * @author Michael P. Masterson
+ */
+public class OteConsolePrefsWizPage extends WizardPage {
+
+ private Text bufferText;
+ private Label errorLabel;
+ private Button noLimitCheckbox;
+
+ private int bufferLimit;
+ private boolean noLimitSelection;
+
+ /**
+ * @param pageName
+ */
+ public OteConsolePrefsWizPage() {
+ super("OTE Console Preferences Wizard");
+ setTitle("OTE Console Options");
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ public void createControl(Composite parent) {
+ Composite main = new Composite(parent, SWT.NONE);
+ GridLayoutFactory.fillDefaults().numColumns(1).applyTo(main);
+
+ addBufferLimit(main);
+ addErrorLabel(main);
+ determinePageComplete();
+
+ setControl(main);
+ }
+
+ private void addErrorLabel(Composite parent) {
+ this.errorLabel = new Label(parent, SWT.NONE);
+ GridDataFactory.fillDefaults().grab(true, true).applyTo(errorLabel);
+ errorLabel.setVisible(false);
+ }
+
+ /**
+ *
+ */
+ private void determinePageComplete() {
+ boolean allIsWell = false;
+ String bufferLimitStr = bufferText.getText();
+ if(bufferLimitStr != null && bufferLimitStr.length() > 0 ) {
+ try {
+ Integer.parseInt(bufferLimitStr);
+ allIsWell = true;
+ } catch (NumberFormatException ex) {
+ errorLabel.setText("Buffer limit must be a number between 0 and " + Integer.MAX_VALUE);
+ allIsWell = false;
+ }
+ }
+
+ errorLabel.setVisible(!allIsWell);
+ setPageComplete(allIsWell);
+ }
+
+ /**
+ * @param parent
+ */
+ private void addBufferLimit(Composite parent) {
+ Group comp = new Group(parent, SWT.NONE);
+ GridDataFactory.fillDefaults().grab(false, false).applyTo(comp);
+ GridLayoutFactory.fillDefaults().numColumns(2).applyTo(comp);
+ comp.setText("Select Console Buffer Limit (Bytes)");
+
+ bufferText = new Text(comp, SWT.BORDER);
+ GridDataFactory.fillDefaults().grab(true, true).applyTo(bufferText);
+
+ String defaultText = OteConsolePrefsUtil.getString(OteConsolePreferences.BUFFER_LIMIT);
+ bufferText.setText(defaultText);
+
+ noLimitCheckbox = new Button(comp, SWT.CHECK);
+ noLimitCheckbox.setText("No Limit");
+ boolean defaultNoLimit = OteConsolePrefsUtil.getBoolean(OteConsolePreferences.NO_BUFFER_LIMIT);
+ noLimitCheckbox.setSelection(defaultNoLimit);
+
+
+ bufferText.setEnabled(!defaultNoLimit);
+
+ noLimitCheckbox.addSelectionListener(new SelectionAdapter() {
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+ */
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ boolean isNoLimit = noLimitCheckbox.getSelection();
+ bufferText.setEnabled(!isNoLimit);
+ determinePageComplete();
+ savePreferences();
+ }
+ });
+
+ bufferText.addKeyListener(new KeyAdapter() {
+ @Override
+ public void keyReleased(KeyEvent e) {
+ determinePageComplete();
+ }
+ });
+
+ bufferText.addFocusListener(new FocusListener() {
+
+ @Override
+ public void focusLost(FocusEvent e) {
+ determinePageComplete();
+ savePreferences();
+ }
+
+ @Override
+ public void focusGained(FocusEvent e) {
+ }
+ });
+ }
+
+ /**
+ *
+ */
+ protected void savePreferences() {
+ if(isPageComplete() && !bufferText.isDisposed()) {
+ saveNoLimitSelection();
+ saveBufferLimit();
+ OteConsolePrefsUtil.setInt(OteConsolePreferences.BUFFER_LIMIT, getBufferLimit());
+ OteConsolePrefsUtil.setBoolean(OteConsolePreferences.NO_BUFFER_LIMIT, getNoLimitSelection());
+ }
+ }
+
+ private void saveNoLimitSelection() {
+ this.noLimitSelection = noLimitCheckbox.getSelection();
+ }
+
+ public boolean getNoLimitSelection() {
+ return noLimitSelection;
+ }
+
+ private void saveBufferLimit() {
+ this.bufferLimit = Integer.parseInt(bufferText.getText());
+ }
+
+ public int getBufferLimit() {
+ return bufferLimit;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/wizard/OteConsolePrefsWizard.java b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/wizard/OteConsolePrefsWizard.java
new file mode 100644
index 000000000..ad3245e98
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/internal/wizard/OteConsolePrefsWizard.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.internal.wizard;
+
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.osee.ote.ui.OteConsole;
+
+/**
+ * @author Michael P. Masterson
+ */
+public class OteConsolePrefsWizard extends Wizard {
+
+ OteConsolePrefsWizPage mainPage;
+ private OteConsole console;
+
+ /**
+ * @param console
+ */
+ public OteConsolePrefsWizard(OteConsole console) {
+ this.console = console;
+ mainPage = new OteConsolePrefsWizPage();
+ }
+
+ @Override
+ public boolean performFinish() {
+ int bufferLimit = mainPage.getBufferLimit();
+ boolean noLimitSelected = mainPage.getNoLimitSelection();
+
+ console.setLimit(bufferLimit);
+ console.setNoLimit(noLimitSelected);
+
+ return true;
+ }
+
+ @Override
+ public void addPages() {
+ addPage(mainPage);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/OteNavigateView.java b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/OteNavigateView.java
new file mode 100644
index 000000000..17b8ffe49
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/OteNavigateView.java
@@ -0,0 +1,126 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.navigate;
+
+import java.util.logging.Level;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.IRegistryEventListener;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.action.Action;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.plugin.PluginUiImage;
+import org.eclipse.osee.framework.ui.plugin.util.HelpUtil;
+import org.eclipse.osee.framework.ui.plugin.xnavigate.XNavigateComposite;
+import org.eclipse.osee.framework.ui.swt.ImageManager;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.part.ViewPart;
+
+/**
+ * Insert the type's description here.
+ *
+ * @see ViewPart
+ */
+public class OteNavigateView extends ViewPart {
+
+ public static final String VIEW_ID = "org.eclipse.osee.ote.ui.navigate.OteNavigateView";
+ private XNavigateComposite xNavComp;
+
+ @Override
+ public void setFocus() {
+ if (xNavComp != null) {
+ xNavComp.setFocus();
+ }
+ }
+
+ /*
+ * @see IWorkbenchPart#createPartControl(Composite)
+ */
+ @Override
+ public void createPartControl(Composite parent) {
+ xNavComp = new XNavigateComposite(new OteNavigateViewItems(), parent, SWT.NONE);
+
+ xNavComp.getFilteredTree().getViewer().setSorter(new OteNavigateViewerSorter());
+
+ createActions();
+ xNavComp.refresh();
+
+ addExtensionPointListenerBecauseOfWorkspaceLoading();
+
+ // TODO: Change to use OteHelpContext
+ HelpUtil.setHelp(parent, "ote_navigator", "org.eclipse.osee.ote.help.ui");
+ HelpUtil.setHelp(xNavComp, "ote_navigator", "org.eclipse.osee.ote.help.ui");
+ }
+
+ private void addExtensionPointListenerBecauseOfWorkspaceLoading() {
+ IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
+ extensionRegistry.addListener(new IRegistryEventListener() {
+ @Override
+ public void added(IExtension[] extensions) {
+ try {
+ refresh();
+ } catch (Exception ex) {
+ OseeLog.log(getClass(), Level.SEVERE, ex);
+ }
+ }
+
+ @Override
+ public void added(IExtensionPoint[] extensionPoints) {
+ try {
+ refresh();
+ } catch (Exception ex) {
+ OseeLog.log(getClass(), Level.SEVERE, ex);
+ }
+ }
+
+ @Override
+ public void removed(IExtension[] extensions) {
+ try {
+ refresh();
+ } catch (Exception ex) {
+ OseeLog.log(getClass(), Level.SEVERE, ex);
+ }
+ }
+
+ @Override
+ public void removed(IExtensionPoint[] extensionPoints) {
+ try {
+ refresh();
+ } catch (Exception ex) {
+ OseeLog.log(getClass(), Level.SEVERE, ex);
+ }
+ }
+ }, "org.eclipse.osee.framework.ui.plugin.XNavigateItem");
+ }
+
+ protected void createActions() {
+ Action refreshAction = new Action("Refresh") {
+
+ @Override
+ public void run() {
+ if (!xNavComp.isDisposed()) {
+ xNavComp.refresh();
+ }
+ }
+ };
+ refreshAction.setImageDescriptor(ImageManager.getImageDescriptor(PluginUiImage.REFRESH));
+ refreshAction.setToolTipText("Refresh");
+
+ }
+
+ public void refresh() {
+ if (!xNavComp.isDisposed()) {
+ xNavComp.refresh();
+ }
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/OteNavigateViewItems.java b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/OteNavigateViewItems.java
new file mode 100644
index 000000000..30159408a
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/OteNavigateViewItems.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.navigate;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.osee.framework.jdk.core.type.OseeCoreException;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.framework.ui.plugin.PluginUiImage;
+import org.eclipse.osee.framework.ui.plugin.xnavigate.XNavigateContributionManager;
+import org.eclipse.osee.framework.ui.plugin.xnavigate.XNavigateExtensionPointData;
+import org.eclipse.osee.framework.ui.plugin.xnavigate.XNavigateItem;
+import org.eclipse.osee.framework.ui.plugin.xnavigate.XNavigateViewItems;
+import org.eclipse.osee.ote.ui.internal.TestCoreGuiPlugin;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class OteNavigateViewItems implements XNavigateViewItems {
+
+ public OteNavigateViewItems() {
+ super();
+ }
+
+ @Override
+ public List<XNavigateItem> getSearchNavigateItems() {
+ List<XNavigateItem> items = new ArrayList<>();
+ try {
+ addExtensionPointItems(items);
+ } catch (OseeCoreException ex) {
+ OseeLog.log(TestCoreGuiPlugin.class, Level.SEVERE, ex);
+ }
+ return items;
+ }
+
+ private void addExtensionPointItems(List<XNavigateItem> items) throws OseeCoreException {
+ Collection<XNavigateExtensionPointData> oteNavigateItemExtensions =
+ XNavigateContributionManager.getNavigateItems(OteNavigateView.VIEW_ID);
+ Map<String, XNavigateItem> categoryToNavigateItem =
+ createCategoriesAndAddToItems(items, oteNavigateItemExtensions);
+ for (XNavigateExtensionPointData data : oteNavigateItemExtensions) {
+ XNavigateItem item = categoryToNavigateItem.get(data.getCategory());
+ try {
+ if (item == null) {
+ items.addAll(data.getNavigateItems());
+ } else {
+
+ for (XNavigateItem navItem : data.getNavigateItems()) {
+ item.addChild(navItem);
+ }
+ }
+ } catch (Throwable th) {
+ OseeLog.log(OteNavigateViewItems.class, Level.SEVERE, th);
+ }
+ }
+ }
+
+ private Map<String, XNavigateItem> createCategoriesAndAddToItems(List<XNavigateItem> items, Collection<XNavigateExtensionPointData> oteNavigateItemExtensions) {
+ Map<String, XNavigateItem> categoryToNavigateItem = new HashMap<>();
+ for (XNavigateExtensionPointData data : oteNavigateItemExtensions) {
+ if (!categoryToNavigateItem.containsKey(data.getCategory())) {
+ String[] path = data.getItemPath();
+ StringBuilder keyBuilder = new StringBuilder(256);
+ XNavigateItem lastItem = null;
+ for (int i = 0; i < path.length; i++) {
+
+ keyBuilder.append(path[i]);
+ String key = keyBuilder.toString();
+ XNavigateItem foundItem = categoryToNavigateItem.get(key);
+ if (foundItem == null) {
+ foundItem = new XNavigateItem(lastItem, path[i], PluginUiImage.FOLDER);
+ categoryToNavigateItem.put(key, foundItem);
+ // if(lastItem != null){
+ // lastItem.addChild(foundItem);
+ // }
+ if (i == 0) {
+ items.add(foundItem);
+ }
+ }
+ lastItem = foundItem;
+ keyBuilder.append('.');
+ }
+ }
+ }
+ return categoryToNavigateItem;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/OteNavigateViewerSorter.java b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/OteNavigateViewerSorter.java
new file mode 100644
index 000000000..f24c62df3
--- /dev/null
+++ b/org.eclipse.osee.ote.ui/src/org/eclipse/osee/ote/ui/navigate/OteNavigateViewerSorter.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2007 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.ui.navigate;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.osee.framework.ui.plugin.xnavigate.XNavigateItem;
+
+/**
+ * @author Donald G. Dunne
+ */
+public class OteNavigateViewerSorter extends ViewerSorter {
+
+ public OteNavigateViewerSorter() {
+ super();
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public int compare(Viewer viewer, Object e1, Object e2) {
+ XNavigateItem item1 = (XNavigateItem) e1;
+ XNavigateItem item2 = (XNavigateItem) e2;
+ return getComparator().compare(item1.getName(), item2.getName());
+ }
+
+}
diff --git a/org.eclipse.osee.ote.version.git.test/.classpath b/org.eclipse.osee.ote.version.git.test/.classpath
new file mode 100644
index 000000000..1fa3e6803
--- /dev/null
+++ b/org.eclipse.osee.ote.version.git.test/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.ote.version.git.test/.project b/org.eclipse.osee.ote.version.git.test/.project
new file mode 100644
index 000000000..b07ebb057
--- /dev/null
+++ b/org.eclipse.osee.ote.version.git.test/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ote.version.git.test</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.version.git.test/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.version.git.test/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..99fff90fa
--- /dev/null
+++ b/org.eclipse.osee.ote.version.git.test/META-INF/MANIFEST.MF
@@ -0,0 +1,9 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OTE Version Git Test (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.version.git.test
+Bundle-Version: 0.25.3.qualifier
+Fragment-Host: org.eclipse.osee.ote.version.git;bundle-version="0.0.0"
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Require-Bundle: org.junit;bundle-version="4.11.0"
+Bundle-Vendor: Eclipse Open System Engineering Environment
diff --git a/org.eclipse.osee.ote.version.git.test/build.properties b/org.eclipse.osee.ote.version.git.test/build.properties
new file mode 100644
index 000000000..34d2e4d2d
--- /dev/null
+++ b/org.eclipse.osee.ote.version.git.test/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .
diff --git a/org.eclipse.osee.ote.version.git.test/pom.xml b/org.eclipse.osee.ote.version.git.test/pom.xml
new file mode 100644
index 000000000..4661264a1
--- /dev/null
+++ b/org.eclipse.osee.ote.version.git.test/pom.xml
@@ -0,0 +1,35 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.osee</groupId>
+ <artifactId>org.eclipse.osee.ote.parent</artifactId>
+ <version>0.25.3-SNAPSHOT</version>
+ <relativePath>../org.eclipse.osee.ote.parent</relativePath>
+ </parent>
+
+ <artifactId>org.eclipse.osee.ote.version.git.test</artifactId>
+ <packaging>eclipse-plugin</packaging>
+ <name>OTE Ui Test Manager (Incubation)</name>
+
+ <build>
+ <!-- workaround for https://issues.sonatype.org/browse/TYCHO-168 -->
+ <resources>
+ <resource>
+ <directory>src</directory>
+ <excludes>
+ <exclude>**/*.java</exclude>
+ </excludes>
+ </resource>
+ </resources>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-source-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.version.git.test/src/org/eclipse/osee/ote/version/git/GitVersionTest.java b/org.eclipse.osee.ote.version.git.test/src/org/eclipse/osee/ote/version/git/GitVersionTest.java
new file mode 100644
index 000000000..3e651f2b3
--- /dev/null
+++ b/org.eclipse.osee.ote.version.git.test/src/org/eclipse/osee/ote/version/git/GitVersionTest.java
@@ -0,0 +1,153 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.version.git;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.jgit.api.errors.GitAPIException;
+import org.eclipse.jgit.api.errors.NoHeadException;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.junit.Assert;
+import org.junit.Ignore;
+import org.junit.Test;
+
+public class GitVersionTest {
+
+ private static final String GIT_REPO_FILTER = "";
+ private static final String GIT_REPO_FOLDER = "";
+
+ private static final String validGitFile = "";
+ private static final String validModifiedGitFile = "";
+ private static final String invalidGitFile = "";
+ private static final String invalidNoGitFile = "";
+
+ private long start;
+ private long end;
+
+ @Ignore
+ @Test
+ public void testGetLastCommit() throws NoHeadException, IOException, GitAPIException {
+ GitVersion gitVersion = new GitVersion(new File(validGitFile));
+
+ RevCommit commit = gitVersion.getLastCommit();
+ Assert.assertNotNull(commit);
+ System.out.println(commit.getCommitterIdent().getName());
+ System.out.println(commit.getCommitterIdent().getWhen());
+ System.out.println(commit.getId().getName());
+ }
+
+ @Ignore
+ @Test
+ public void testGetLastCommitFailFile() throws NoHeadException, IOException, GitAPIException {
+ GitVersion gitVersion = new GitVersion(new File(invalidGitFile));
+ RevCommit commit = gitVersion.getLastCommit();
+ Assert.assertNull(commit);
+ }
+
+ @Ignore
+ @Test
+ public void testGetLastCommitFailRepo() throws NoHeadException, IOException, GitAPIException {
+ GitVersion gitVersion = new GitVersion(new File(invalidNoGitFile));
+ RevCommit commit = gitVersion.getLastCommit();
+ Assert.assertNull(commit);
+ }
+
+ @Ignore
+ @Test
+ public void testModified() throws NoHeadException, IOException, GitAPIException{
+ GitVersion gitVersion = new GitVersion(new File(validGitFile));
+ Assert.assertFalse(gitVersion.getModified());
+
+ gitVersion = new GitVersion(new File(invalidNoGitFile));
+ Assert.assertFalse(gitVersion.getModified());
+
+ gitVersion = new GitVersion(new File(invalidGitFile));
+ Assert.assertFalse(gitVersion.getModified());
+
+ gitVersion = new GitVersion(new File(validModifiedGitFile));
+ Assert.assertTrue(gitVersion.getModified());
+
+ }
+
+ private List<File> getFiles(){
+ File repo = new File(GIT_REPO_FOLDER);
+ File[] wpsfolders = repo.listFiles(new FileFilter(){
+ @Override
+ public boolean accept(File arg0) {
+ return arg0.isDirectory() && arg0.getName().contains(GIT_REPO_FILTER);
+ }
+
+ });
+ List<File> files = new ArrayList<>(200);
+ for(File folder:wpsfolders){
+ getJavaFiles(folder, files);
+ }
+ return files;
+ }
+
+ private void getJavaFiles(File folder, List<File> files){
+ if(folder.isDirectory()){
+ for(File file:folder.listFiles()){
+ if(file.isDirectory()){
+ getJavaFiles(file, files);
+ } else if(file.getAbsolutePath().endsWith(".java")){
+ files.add(file);
+ }
+ }
+ }
+ }
+
+ @Test
+ public void testTime() throws NoHeadException, IOException, GitAPIException{
+ List<File> files = getFiles();
+ System.out.println(files.size());
+ startTimer();
+ for(File timedGitFile: files){
+ GitVersion gitVersion = new GitVersion(timedGitFile);
+ RevCommit commit = gitVersion.getLastCommit();
+// System.out.println(commit.getId());
+ }
+ endTimer();
+ System.out.println(getElapsedTimeInSec());
+
+ GitVersions gitVersions = new GitVersions(files);
+ startTimer();
+ Map<File, RevCommit> commits = gitVersions.getLastCommits();
+// for(File timedGitFile: files){
+// System.out.println(commits.get(timedGitFile).getId());
+// }
+ endTimer();
+ System.out.println(getElapsedTimeInSec());
+
+ }
+
+ private void startTimer(){
+ start = System.nanoTime();
+ }
+
+ private void endTimer(){
+ end = System.nanoTime();
+ }
+
+ private long getElapsedTime(){
+ return end - start;
+ }
+
+ private String getElapsedTimeInSec(){
+ return String.format("%f03", (((float)getElapsedTime())/1000000000f));
+ }
+
+}
diff --git a/org.eclipse.osee.ote.version.git/.classpath b/org.eclipse.osee.ote.version.git/.classpath
new file mode 100644
index 000000000..1fa3e6803
--- /dev/null
+++ b/org.eclipse.osee.ote.version.git/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.ote.version.git/.project b/org.eclipse.osee.ote.version.git/.project
new file mode 100644
index 000000000..0afb2b92c
--- /dev/null
+++ b/org.eclipse.osee.ote.version.git/.project
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ote.version.git</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ds.core.builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.version.git/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.version.git/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..96a09d55a
--- /dev/null
+++ b/org.eclipse.osee.ote.version.git/META-INF/MANIFEST.MF
@@ -0,0 +1,18 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OTE Version Git (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.version.git
+Bundle-Version: 0.25.3.qualifier
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Import-Package: org.eclipse.jgit.api,
+ org.eclipse.jgit.api.errors,
+ org.eclipse.jgit.errors,
+ org.eclipse.jgit.lib,
+ org.eclipse.jgit.revwalk,
+ org.eclipse.jgit.storage.file,
+ org.eclipse.jgit.treewalk,
+ org.eclipse.jgit.treewalk.filter,
+ org.eclipse.osee.ote.version
+Service-Component: OSGI-INF/*.xml
+Bundle-ActivationPolicy: lazy
+Bundle-Vendor: Eclipse Open System Engineering Environment
diff --git a/org.eclipse.osee.ote.version.git/OSGI-INF/GITFileVersionInformationComponent.xml b/org.eclipse.osee.ote.version.git/OSGI-INF/GITFileVersionInformationComponent.xml
new file mode 100644
index 000000000..e03193d0f
--- /dev/null
+++ b/org.eclipse.osee.ote.version.git/OSGI-INF/GITFileVersionInformationComponent.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" immediate="false" name="org.eclipse.osee.ote.version.git.fileProvider">
+ <implementation class="org.eclipse.osee.ote.version.git.GitVersionProvider"/>
+ <service>
+ <provide interface="org.eclipse.osee.ote.version.FileVersionInformationProvider"/>
+ </service>
+</scr:component>
diff --git a/org.eclipse.osee.ote.version.git/build.properties b/org.eclipse.osee.ote.version.git/build.properties
new file mode 100644
index 000000000..6210e849b
--- /dev/null
+++ b/org.eclipse.osee.ote.version.git/build.properties
@@ -0,0 +1,5 @@
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ OSGI-INF/
+source.. = src/
diff --git a/org.eclipse.osee.ote.version.git/pom.xml b/org.eclipse.osee.ote.version.git/pom.xml
new file mode 100644
index 000000000..afe48cf89
--- /dev/null
+++ b/org.eclipse.osee.ote.version.git/pom.xml
@@ -0,0 +1,35 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.osee</groupId>
+ <artifactId>org.eclipse.osee.ote.parent</artifactId>
+ <version>0.25.3-SNAPSHOT</version>
+ <relativePath>../org.eclipse.osee.ote.parent</relativePath>
+ </parent>
+
+ <artifactId>org.eclipse.osee.ote.version.git</artifactId>
+ <packaging>eclipse-plugin</packaging>
+ <name>OTE Ui Test Manager (Incubation)</name>
+
+ <build>
+ <!-- workaround for https://issues.sonatype.org/browse/TYCHO-168 -->
+ <resources>
+ <resource>
+ <directory>src</directory>
+ <excludes>
+ <exclude>**/*.java</exclude>
+ </excludes>
+ </resource>
+ </resources>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-source-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.version.git/src/org/eclipse/osee/ote/version/git/GitFileVersion.java b/org.eclipse.osee.ote.version.git/src/org/eclipse/osee/ote/version/git/GitFileVersion.java
new file mode 100644
index 000000000..5434bc06f
--- /dev/null
+++ b/org.eclipse.osee.ote.version.git/src/org/eclipse/osee/ote/version/git/GitFileVersion.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.version.git;
+
+import java.io.IOException;
+
+import org.eclipse.jgit.api.errors.GitAPIException;
+import org.eclipse.jgit.api.errors.NoHeadException;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.osee.ote.version.FileVersion;
+
+public class GitFileVersion implements FileVersion {
+
+ private RevCommit commit;
+ private boolean modified;
+
+ GitFileVersion(GitVersion gitVersion) throws NoHeadException, IOException, GitAPIException{
+ this.commit = gitVersion.getLastCommit();
+ if(commit == null){
+ throw new IOException("Not a git repo");
+ }
+ }
+
+ GitFileVersion(RevCommit commit) {
+ this.commit = commit;
+ }
+
+ @Override
+ public String getLastChangedRevision() {
+ return commit.getId().getName();
+ }
+
+ @Override
+ public String getURL() {
+ return null;
+ }
+
+ @Override
+ public String getVersionControlSystem() {
+ return "GIT";
+ }
+
+ @Override
+ public String getModifiedFlag() {
+ return "N/A";
+ }
+
+ @Override
+ public String getLastModificationDate() {
+ return commit.getAuthorIdent().getWhen().toString();
+ }
+
+ @Override
+ public String getLastAuthor() {
+ return commit.getAuthorIdent().getName();
+ }
+
+}
diff --git a/org.eclipse.osee.ote.version.git/src/org/eclipse/osee/ote/version/git/GitVersion.java b/org.eclipse.osee.ote.version.git/src/org/eclipse/osee/ote/version/git/GitVersion.java
new file mode 100644
index 000000000..7832fc71c
--- /dev/null
+++ b/org.eclipse.osee.ote.version.git/src/org/eclipse/osee/ote/version/git/GitVersion.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.version.git;
+
+
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.api.LogCommand;
+import org.eclipse.jgit.api.Status;
+import org.eclipse.jgit.api.StatusCommand;
+import org.eclipse.jgit.api.errors.GitAPIException;
+import org.eclipse.jgit.api.errors.NoHeadException;
+import org.eclipse.jgit.errors.NoWorkTreeException;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+
+public class GitVersion extends GitVersionBase {
+
+ private final File file;
+
+ public GitVersion(File file){
+ this.file = file;
+ }
+
+ public String getURL() throws MalformedURLException{
+ return this.file.toURI().toURL().toString();
+ }
+
+ public boolean getModified() throws IOException, NoWorkTreeException, GitAPIException{
+ if(!file.exists()){
+ return false;
+ }
+ File gitFolder = findGitDirUp(file);
+ if(gitFolder == null){
+ return false;
+ }
+ Repository repository = buildRepository(gitFolder);
+ Git git = new Git(repository);
+ StatusCommand status = git.status();
+ String pathFilter = getPathFilterFromFullPathAndGitFolder(file, gitFolder);
+ Status result = status.call();
+ Set<String> modified = result.getModified();
+ if(modified.contains(pathFilter)){
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public RevCommit getLastCommit() throws IOException, NoHeadException, GitAPIException{
+ if(!file.exists()){
+ return null;
+ }
+ File gitFolder = findGitDirUp(file);
+ if(gitFolder == null){
+ return null;
+ }
+ Repository repository = buildRepository(gitFolder);
+ Git git = new Git(repository);
+ LogCommand log = git.log();
+ String pathFilter = getPathFilterFromFullPathAndGitFolder(file, gitFolder);
+ log.addPath(pathFilter);
+ Iterable<RevCommit> iterable = log.call();
+ Iterator<RevCommit> it = iterable.iterator();
+ if(it.hasNext()){
+ return it.next();
+ } else {
+ return null;
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.version.git/src/org/eclipse/osee/ote/version/git/GitVersionBase.java b/org.eclipse.osee.ote.version.git/src/org/eclipse/osee/ote/version/git/GitVersionBase.java
new file mode 100644
index 000000000..8f19899d8
--- /dev/null
+++ b/org.eclipse.osee.ote.version.git/src/org/eclipse/osee/ote/version/git/GitVersionBase.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.version.git;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.io.IOException;
+
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.storage.file.FileRepositoryBuilder;
+
+public class GitVersionBase {
+
+ protected String getPathFilterFromFullPathAndGitFolder(File file, File gitFolder) {
+ String path = file.getAbsolutePath().replace(gitFolder.getParentFile().getAbsolutePath(), "");
+ if(path.startsWith("\\") || path.startsWith("/")){
+ path = path.substring(1);
+ }
+ path = path.replaceAll("\\\\", "/");
+ return path;
+ }
+
+ protected Repository buildRepository(File gitFolder) throws IOException {
+ FileRepositoryBuilder builder = new FileRepositoryBuilder();
+ Repository repository = builder.setGitDir(gitFolder).readEnvironment().findGitDir().build();
+ repository.resolve("HEAD");
+ return repository;
+ }
+
+ protected File findGitDirUp(File file){
+ if(file == null){
+ return null;
+ }
+ File parent = file.getParentFile();
+ if(parent == null){
+ return null;
+ }
+ File[] dirs = parent.listFiles(new FileFilter(){
+ public boolean accept(File file){
+ if(file.isDirectory()){
+ return true;
+ } else {
+ return false;
+ }
+ }
+ });
+ for(File dir:dirs){
+ if(dir.getName().equals(".git")){
+ return dir;
+ }
+ }
+ return findGitDirUp(parent);
+ }
+
+}
diff --git a/org.eclipse.osee.ote.version.git/src/org/eclipse/osee/ote/version/git/GitVersionProvider.java b/org.eclipse.osee.ote.version.git/src/org/eclipse/osee/ote/version/git/GitVersionProvider.java
new file mode 100644
index 000000000..1f84b7688
--- /dev/null
+++ b/org.eclipse.osee.ote.version.git/src/org/eclipse/osee/ote/version/git/GitVersionProvider.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.version.git;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import org.eclipse.jgit.api.errors.GitAPIException;
+import org.eclipse.jgit.api.errors.NoHeadException;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.osee.ote.version.FileVersion;
+import org.eclipse.osee.ote.version.FileVersionInformationProvider;
+
+public class GitVersionProvider implements FileVersionInformationProvider {
+
+ @Override
+ public void getFileVersions(List<File> files, Map<File, FileVersion> versions) {
+ GitVersions gitVersions = new GitVersions(files);
+ Map<File, RevCommit> commits = gitVersions.getLastCommits();
+ for(Entry<File, RevCommit> entry:commits.entrySet()){
+ versions.put(entry.getKey(), new GitFileVersion(entry.getValue()));
+ }
+ }
+
+}
diff --git a/org.eclipse.osee.ote.version.git/src/org/eclipse/osee/ote/version/git/GitVersions.java b/org.eclipse.osee.ote.version.git/src/org/eclipse/osee/ote/version/git/GitVersions.java
new file mode 100644
index 000000000..7ad53c3bd
--- /dev/null
+++ b/org.eclipse.osee.ote.version.git/src/org/eclipse/osee/ote/version/git/GitVersions.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.version.git;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.api.LogCommand;
+import org.eclipse.jgit.api.errors.GitAPIException;
+import org.eclipse.jgit.api.errors.NoHeadException;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+
+public class GitVersions extends GitVersionBase {
+
+ private List<File> files;
+
+ public GitVersions(List<File> files) {
+ this.files = files;
+ }
+
+
+ public Map<File, RevCommit> getLastCommits() {
+ Map<File, RevCommit> commits = new HashMap<>();
+ Map<File, List<File>> gitToFiles = new HashMap<>();
+ for(File file:files){
+ if(!file.exists()){
+ continue;
+ }
+ File gitFolder = findGitDirUp(file);
+ if(gitFolder == null){
+ continue;
+ }
+ List<File> gitfiles = gitToFiles.get(gitFolder);
+ if(gitfiles == null){
+ gitfiles = new ArrayList<>();
+ gitToFiles.put(gitFolder, gitfiles);
+ }
+ gitfiles.add(file);
+ }
+ for(Entry<File, List<File>> entry:gitToFiles.entrySet()){
+ try{
+ Repository repository = buildRepository(entry.getKey());
+ Git git = new Git(repository);
+
+ for(File gitfile:entry.getValue()){
+ LogCommand log = git.log();
+ log.setMaxCount(1);
+ String pathFilter = getPathFilterFromFullPathAndGitFolder(gitfile, entry.getKey());
+ log.addPath(pathFilter);
+ Iterable<RevCommit> iterable = log.call();
+ Iterator<RevCommit> it = iterable.iterator();
+ if(it.hasNext()){
+ RevCommit commit = it.next();
+ commits.put(gitfile, commit);
+ }
+ }
+ }catch(IOException e){
+ e.printStackTrace();
+ } catch (NoHeadException e) {
+ e.printStackTrace();
+ } catch (GitAPIException e) {
+ e.printStackTrace();
+ }
+ }
+ return commits;
+ }
+}
diff --git a/org.eclipse.osee.ote.version.svn/.classpath b/org.eclipse.osee.ote.version.svn/.classpath
new file mode 100644
index 000000000..1fa3e6803
--- /dev/null
+++ b/org.eclipse.osee.ote.version.svn/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.ote.version.svn/.project b/org.eclipse.osee.ote.version.svn/.project
new file mode 100644
index 000000000..bf63408ee
--- /dev/null
+++ b/org.eclipse.osee.ote.version.svn/.project
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ote.version.svn</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ds.core.builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.version.svn/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.version.svn/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..fc6a7705a
--- /dev/null
+++ b/org.eclipse.osee.ote.version.svn/META-INF/MANIFEST.MF
@@ -0,0 +1,19 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OTE Version SVN (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.version.svn
+Bundle-Version: 0.25.3.qualifier
+Require-Bundle: org.eclipse.core.runtime
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Import-Package: org.eclipse.core.filesystem,
+ org.eclipse.core.resources,
+ org.eclipse.osee.framework.logging,
+ org.eclipse.osee.ote.version,
+ org.eclipse.team.svn.core.connector,
+ org.eclipse.team.svn.core.extension,
+ org.eclipse.team.svn.core.extension.factory,
+ org.eclipse.team.svn.core.operation,
+ org.eclipse.team.svn.core.utility
+Service-Component: OSGI-INF/*.xml
+Bundle-Vendor: Eclipse Open System Engineering Environment
diff --git a/org.eclipse.osee.ote.version.svn/OSGI-INF/svnFileVersionInformationComponent.xml b/org.eclipse.osee.ote.version.svn/OSGI-INF/svnFileVersionInformationComponent.xml
new file mode 100644
index 000000000..440f600cf
--- /dev/null
+++ b/org.eclipse.osee.ote.version.svn/OSGI-INF/svnFileVersionInformationComponent.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" immediate="false" name="org.eclipse.osee.ote.version.svn">
+ <implementation class="org.eclipse.osee.ote.version.svn.SvnVersionProvider"/>
+ <service>
+ <provide interface="org.eclipse.osee.ote.version.FileVersionInformationProvider"/>
+ </service>
+ <reference cardinality="1..1" interface="org.eclipse.core.resources.IWorkspace" name="IWorkspace" policy="static"/>
+</scr:component>
diff --git a/org.eclipse.osee.ote.version.svn/build.properties b/org.eclipse.osee.ote.version.svn/build.properties
new file mode 100644
index 000000000..f8831f941
--- /dev/null
+++ b/org.eclipse.osee.ote.version.svn/build.properties
@@ -0,0 +1,6 @@
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ OSGI-INF/svnFileVersionInformationComponent.xml,\
+ OSGI-INF/
+source.. = src/
diff --git a/org.eclipse.osee.ote.version.svn/pom.xml b/org.eclipse.osee.ote.version.svn/pom.xml
new file mode 100644
index 000000000..8c48683c7
--- /dev/null
+++ b/org.eclipse.osee.ote.version.svn/pom.xml
@@ -0,0 +1,35 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.osee</groupId>
+ <artifactId>org.eclipse.osee.ote.parent</artifactId>
+ <version>0.25.3-SNAPSHOT</version>
+ <relativePath>../org.eclipse.osee.ote.parent</relativePath>
+ </parent>
+
+ <artifactId>org.eclipse.osee.ote.version.svn</artifactId>
+ <packaging>eclipse-plugin</packaging>
+ <name>OTE SVN (Incubation)</name>
+
+ <build>
+ <!-- workaround for https://issues.sonatype.org/browse/TYCHO-168 -->
+ <resources>
+ <resource>
+ <directory>src</directory>
+ <excludes>
+ <exclude>**/*.java</exclude>
+ </excludes>
+ </resource>
+ </resources>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-source-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.version.svn/src/org/eclipse/osee/ote/version/svn/ScriptToProject.java b/org.eclipse.osee.ote.version.svn/src/org/eclipse/osee/ote/version/svn/ScriptToProject.java
new file mode 100644
index 000000000..44834f083
--- /dev/null
+++ b/org.eclipse.osee.ote.version.svn/src/org/eclipse/osee/ote/version/svn/ScriptToProject.java
@@ -0,0 +1,82 @@
+/*
+ * Created on Feb 27, 2013
+ *
+ * PLACE_YOUR_DISTRIBUTION_STATEMENT_RIGHT_HERE
+ */
+package org.eclipse.osee.ote.version.svn;
+
+import java.io.File;
+import java.net.URI;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.team.svn.core.utility.SVNUtility;
+
+public class ScriptToProject {
+
+ private final Map<String, Set<String>> projectsScriptsMap = new HashMap<>();
+ private final Map<String, File> scriptNameToScriptFileMap = new HashMap<>();
+ private final IProject[] workspaceProjects;
+
+ public ScriptToProject(IProject[] workspaceProjects) {
+ this.workspaceProjects = workspaceProjects;
+ }
+
+ public void add(File scriptFile) {
+ String scriptName = scriptFile.getName();
+ IProject scriptProject = null;
+ IFile iFile = null;
+ IFile[] files = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocationURI(org.eclipse.core.filesystem.URIUtil.toURI(scriptFile.getAbsolutePath()));
+ if(files.length > 0){
+ iFile = files[0];
+ }
+ for(IProject project:workspaceProjects){
+ String projectName = project.getName();
+ if(iFile.toString().contains(projectName)){
+ scriptProject = project;
+ }
+ }
+ if(scriptProject != null){
+ URI scriptProjectLocationUri = scriptProject.getLocationURI();
+ File scriptProjectFile = new File(scriptProjectLocationUri);
+
+ if (isSvn(scriptProjectFile)) {
+ String scriptProjectLocation = scriptProjectFile.getAbsolutePath();
+ addScriptListValue(scriptProjectLocation, scriptName);
+ scriptNameToScriptFileMap.put(scriptName, scriptFile);
+ }
+ }
+ }
+
+ public Set<String> getProjectsSet() {
+ return projectsScriptsMap.keySet();
+ }
+
+ public void addScriptListValue(String key, String value) {
+ Set<String> values = projectsScriptsMap.get(key);
+ if (values == null) {
+ values = new HashSet<>();
+ projectsScriptsMap.put(key, values);
+ }
+ values.add(value);
+ }
+
+ public File getScriptFileMatch(String project, String itemToMatch) {
+ Set<String> scriptsForProject = projectsScriptsMap.get(project);
+ if(scriptsForProject.contains(itemToMatch)){
+ return scriptNameToScriptFileMap.get(itemToMatch);
+ } else {
+ return null;
+ }
+ }
+
+ protected boolean isSvn(File file) {
+ File svn = new File(file, SVNUtility.getSVNFolderName());
+ return svn.exists();
+ }
+}
diff --git a/org.eclipse.osee.ote.version.svn/src/org/eclipse/osee/ote/version/svn/SvnFileVersion.java b/org.eclipse.osee.ote.version.svn/src/org/eclipse/osee/ote/version/svn/SvnFileVersion.java
new file mode 100644
index 000000000..81f3e75e7
--- /dev/null
+++ b/org.eclipse.osee.ote.version.svn/src/org/eclipse/osee/ote/version/svn/SvnFileVersion.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.version.svn;
+
+import java.text.DateFormat;
+import java.util.Date;
+import java.util.Locale;
+import org.eclipse.osee.ote.version.FileVersion;
+import org.eclipse.team.svn.core.connector.SVNEntryInfo;
+
+
+public class SvnFileVersion implements FileVersion {
+
+ private SVNEntryInfo entry;
+ private DateFormat dateFormat;
+
+ public SvnFileVersion(SVNEntryInfo svnEntryInfo) {
+ this.entry = svnEntryInfo;
+ dateFormat = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT, Locale.getDefault());
+ }
+
+ @Override
+ public String getLastChangedRevision() {
+ return Long.toString(entry.lastChangedRevision);
+ }
+
+ @Override
+ public String getURL() {
+ return entry.url;
+ }
+
+ @Override
+ public String getVersionControlSystem() {
+ return "svn";
+ }
+
+ @Override
+ public String getModifiedFlag() {
+ /*
+ * IFile iFile = AIFile.constructIFile(file.getAbsolutePath());
+ ILocalResource local = SVNRemoteStorage.instance().asLocalResource(iFile);
+ entry.setModifiedFlag(SVNUtility.getStatusText(local.getStatus()));
+ */
+ return "N/A";
+ }
+
+ @Override
+ public String getLastModificationDate() {
+ return dateFormat.format(new Date(entry.lastChangedDate));
+ }
+
+ @Override
+ public String getLastAuthor() {
+ return entry.lastChangedAuthor;
+ }
+
+}
diff --git a/org.eclipse.osee.ote.version.svn/src/org/eclipse/osee/ote/version/svn/SvnVersionProvider.java b/org.eclipse.osee.ote.version.svn/src/org/eclipse/osee/ote/version/svn/SvnVersionProvider.java
new file mode 100644
index 000000000..6cd50ee60
--- /dev/null
+++ b/org.eclipse.osee.ote.version.svn/src/org/eclipse/osee/ote/version/svn/SvnVersionProvider.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.version.svn;
+
+import java.io.File;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.osee.framework.logging.OseeLog;
+import org.eclipse.osee.ote.version.FileVersion;
+import org.eclipse.osee.ote.version.FileVersionInformationProvider;
+import org.eclipse.team.svn.core.connector.ISVNConnector;
+import org.eclipse.team.svn.core.connector.SVNDepth;
+import org.eclipse.team.svn.core.connector.SVNEntryInfo;
+import org.eclipse.team.svn.core.connector.SVNEntryRevisionReference;
+import org.eclipse.team.svn.core.extension.CoreExtensionsManager;
+import org.eclipse.team.svn.core.operation.SVNNullProgressMonitor;
+import org.eclipse.team.svn.core.utility.SVNUtility;
+
+public class SvnVersionProvider implements FileVersionInformationProvider {
+
+ protected boolean isSvn(File file) {
+ File svn = new File(file, SVNUtility.getSVNFolderName());
+ return svn.exists();
+ }
+
+ @Override
+ public void getFileVersions(List<File> scriptFiles, Map<File, FileVersion> versions) {
+
+ IProject[] workspaceProjects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
+ ScriptToProject collection = new ScriptToProject(workspaceProjects);
+
+ for (File scriptFile : scriptFiles) {
+ collection.add(scriptFile);
+ }
+
+ ISVNConnector proxy = CoreExtensionsManager.instance().getSVNConnectorFactory().createConnector();
+ for (String projectName : collection.getProjectsSet()) {
+ try {
+ SVNEntryInfo[] st =
+ SVNUtility.info(proxy, new SVNEntryRevisionReference(projectName), SVNDepth.INFINITY,
+ new SVNNullProgressMonitor());
+ for (SVNEntryInfo entry : st) {
+ String svnEntryPath = entry.path;
+ String itemToMatch = svnEntryPath.substring(svnEntryPath.lastIndexOf("/") + 1);
+ File scriptFile = collection.getScriptFileMatch(projectName, itemToMatch);
+ if (scriptFile != null) {
+ versions.put(scriptFile, new SvnFileVersion(entry));
+ }
+ }
+ } catch (Exception ex) {
+ OseeLog.logf(getClass(), Level.SEVERE, "SVNConnectorException while retrieving script SVN info ", ex);
+ }
+ }
+ }
+}
diff --git a/org.eclipse.osee.ote.version/.classpath b/org.eclipse.osee.ote.version/.classpath
new file mode 100644
index 000000000..1fa3e6803
--- /dev/null
+++ b/org.eclipse.osee.ote.version/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.osee.ote.version/.project b/org.eclipse.osee.ote.version/.project
new file mode 100644
index 000000000..3660d46dd
--- /dev/null
+++ b/org.eclipse.osee.ote.version/.project
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.osee.ote.version</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ds.core.builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.osee.ote.version/META-INF/MANIFEST.MF b/org.eclipse.osee.ote.version/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..709d385af
--- /dev/null
+++ b/org.eclipse.osee.ote.version/META-INF/MANIFEST.MF
@@ -0,0 +1,10 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OTE Version (Incubation)
+Bundle-SymbolicName: org.eclipse.osee.ote.version
+Bundle-Version: 0.25.3.qualifier
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: org.eclipse.osee.ote.version
+Service-Component: OSGI-INF/*.xml
+Bundle-ActivationPolicy: lazy
+Bundle-Vendor: Eclipse Open System Engineering Environment
diff --git a/org.eclipse.osee.ote.version/OSGI-INF/FileVersionInformationComponent.xml b/org.eclipse.osee.ote.version/OSGI-INF/FileVersionInformationComponent.xml
new file mode 100644
index 000000000..0cff46a13
--- /dev/null
+++ b/org.eclipse.osee.ote.version/OSGI-INF/FileVersionInformationComponent.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="org.eclipse.osee.ote.version.FileVersionInformation">
+ <implementation class="org.eclipse.osee.ote.version.internal.FileVersionInformationImpl"/>
+ <service>
+ <provide interface="org.eclipse.osee.ote.version.FileVersionInformation"/>
+ </service>
+ <reference bind="addFileVersionInformationProvider" cardinality="0..n" interface="org.eclipse.osee.ote.version.FileVersionInformationProvider" name="FileVersionInformationProvider" policy="dynamic" unbind="removeFileVersionInformationProvider"/>
+</scr:component>
diff --git a/org.eclipse.osee.ote.version/build.properties b/org.eclipse.osee.ote.version/build.properties
new file mode 100644
index 000000000..c58ea2178
--- /dev/null
+++ b/org.eclipse.osee.ote.version/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ OSGI-INF/
diff --git a/org.eclipse.osee.ote.version/pom.xml b/org.eclipse.osee.ote.version/pom.xml
new file mode 100644
index 000000000..673d77137
--- /dev/null
+++ b/org.eclipse.osee.ote.version/pom.xml
@@ -0,0 +1,35 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.eclipse.osee</groupId>
+ <artifactId>org.eclipse.osee.ote.parent</artifactId>
+ <version>0.25.3-SNAPSHOT</version>
+ <relativePath>../org.eclipse.osee.ote.parent</relativePath>
+ </parent>
+
+ <artifactId>org.eclipse.osee.ote.version</artifactId>
+ <packaging>eclipse-plugin</packaging>
+ <name>OTE Ui Test Manager (Incubation)</name>
+
+ <build>
+ <!-- workaround for https://issues.sonatype.org/browse/TYCHO-168 -->
+ <resources>
+ <resource>
+ <directory>src</directory>
+ <excludes>
+ <exclude>**/*.java</exclude>
+ </excludes>
+ </resource>
+ </resources>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-source-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+
+</project> \ No newline at end of file
diff --git a/org.eclipse.osee.ote.version/src/org/eclipse/osee/ote/version/FileVersion.java b/org.eclipse.osee.ote.version/src/org/eclipse/osee/ote/version/FileVersion.java
new file mode 100644
index 000000000..64fcb2291
--- /dev/null
+++ b/org.eclipse.osee.ote.version/src/org/eclipse/osee/ote/version/FileVersion.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.version;
+
+public interface FileVersion {
+ String getLastChangedRevision();
+ String getURL();
+ String getVersionControlSystem();
+ String getModifiedFlag();
+ String getLastModificationDate();
+ String getLastAuthor();
+}
diff --git a/org.eclipse.osee.ote.version/src/org/eclipse/osee/ote/version/FileVersionInformation.java b/org.eclipse.osee.ote.version/src/org/eclipse/osee/ote/version/FileVersionInformation.java
new file mode 100644
index 000000000..3611fe1b8
--- /dev/null
+++ b/org.eclipse.osee.ote.version/src/org/eclipse/osee/ote/version/FileVersionInformation.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.version;
+
+import java.io.File;
+import java.util.List;
+import java.util.Map;
+
+public interface FileVersionInformation {
+
+ Map<File, FileVersion> getFileVersions(List<File> files);
+
+}
diff --git a/org.eclipse.osee.ote.version/src/org/eclipse/osee/ote/version/FileVersionInformationProvider.java b/org.eclipse.osee.ote.version/src/org/eclipse/osee/ote/version/FileVersionInformationProvider.java
new file mode 100644
index 000000000..1ec6ad8d5
--- /dev/null
+++ b/org.eclipse.osee.ote.version/src/org/eclipse/osee/ote/version/FileVersionInformationProvider.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.version;
+
+import java.io.File;
+import java.util.List;
+import java.util.Map;
+
+public interface FileVersionInformationProvider {
+ void getFileVersions(List<File> files, Map<File, FileVersion> versions);
+}
diff --git a/org.eclipse.osee.ote.version/src/org/eclipse/osee/ote/version/internal/DefaultFileVersion.java b/org.eclipse.osee.ote.version/src/org/eclipse/osee/ote/version/internal/DefaultFileVersion.java
new file mode 100644
index 000000000..67821ba2e
--- /dev/null
+++ b/org.eclipse.osee.ote.version/src/org/eclipse/osee/ote/version/internal/DefaultFileVersion.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.version.internal;
+
+import java.io.File;
+import java.net.MalformedURLException;
+import java.util.Date;
+
+import org.eclipse.osee.ote.version.FileVersion;
+
+public class DefaultFileVersion implements FileVersion {
+
+ private String url;
+ private String lastModified;
+
+ public DefaultFileVersion(File file){
+ if(file.exists()){
+ try {
+ this.url = file.toURI().toURL().toString();
+ } catch (MalformedURLException e) {
+ this.url = e.getMessage();
+ }
+ this.lastModified = new Date(file.lastModified()).toString();
+ } else {
+ this.url = "N/A";
+ }
+ }
+
+ @Override
+ public String getLastChangedRevision() {
+ return "N/A";
+ }
+
+ @Override
+ public String getURL() {
+ return url;
+ }
+
+ @Override
+ public String getVersionControlSystem() {
+ return "NONE";
+ }
+
+ @Override
+ public String getModifiedFlag() {
+ return "N/A";
+ }
+
+ @Override
+ public String getLastModificationDate() {
+ return lastModified;
+ }
+
+ @Override
+ public String getLastAuthor() {
+ return System.getProperty("user.name");
+ }
+
+}
diff --git a/org.eclipse.osee.ote.version/src/org/eclipse/osee/ote/version/internal/FileVersionInformationImpl.java b/org.eclipse.osee.ote.version/src/org/eclipse/osee/ote/version/internal/FileVersionInformationImpl.java
new file mode 100644
index 000000000..59fc5a4ed
--- /dev/null
+++ b/org.eclipse.osee.ote.version/src/org/eclipse/osee/ote/version/internal/FileVersionInformationImpl.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Boeing.
+ * 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:
+ * Boeing - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.osee.ote.version.internal;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.eclipse.osee.ote.version.FileVersion;
+import org.eclipse.osee.ote.version.FileVersionInformation;
+import org.eclipse.osee.ote.version.FileVersionInformationProvider;
+
+public class FileVersionInformationImpl implements FileVersionInformation {
+
+ private CopyOnWriteArrayList<FileVersionInformationProvider> providers;
+
+ public FileVersionInformationImpl(){
+ providers = new CopyOnWriteArrayList<>();
+ }
+
+ public void addFileVersionInformationProvider(FileVersionInformationProvider versionProvider){
+ providers.add(versionProvider);
+ }
+
+ public void removeFileVersionInformationProvider(FileVersionInformationProvider versionProvider){
+ providers.remove(versionProvider);
+ }
+
+ @Override
+ public Map<File, FileVersion> getFileVersions(List<File> files) {
+ Map<File, FileVersion> versions = new HashMap<>(files.size());
+ for(File file:files){
+ versions.put(file, null);
+ }
+ for(FileVersionInformationProvider provider:providers){
+ provider.getFileVersions(files, versions);
+ }
+ for(Entry<File, FileVersion> entry:versions.entrySet()){
+ if(entry.getValue() == null){
+ entry.setValue(new DefaultFileVersion(entry.getKey()));
+ }
+ }
+ return versions;
+ }
+}
diff --git a/org.eclipse.ote.bytemessage.test/.classpath b/org.eclipse.ote.bytemessage.test/.classpath
index ad32c83a7..1fa3e6803 100644
--- a/org.eclipse.ote.bytemessage.test/.classpath
+++ b/org.eclipse.ote.bytemessage.test/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
diff --git a/org.eclipse.ote.bytemessage.test/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.ote.bytemessage.test/.settings/org.eclipse.jdt.core.prefs
index c537b6306..0c68a61dc 100644
--- a/org.eclipse.ote.bytemessage.test/.settings/org.eclipse.jdt.core.prefs
+++ b/org.eclipse.ote.bytemessage.test/.settings/org.eclipse.jdt.core.prefs
@@ -1,7 +1,7 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.6
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/org.eclipse.ote.bytemessage/.classpath b/org.eclipse.ote.bytemessage/.classpath
index ad32c83a7..1fa3e6803 100644
--- a/org.eclipse.ote.bytemessage/.classpath
+++ b/org.eclipse.ote.bytemessage/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
diff --git a/org.eclipse.ote.bytemessage/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.ote.bytemessage/.settings/org.eclipse.jdt.core.prefs
index c537b6306..0c68a61dc 100644
--- a/org.eclipse.ote.bytemessage/.settings/org.eclipse.jdt.core.prefs
+++ b/org.eclipse.ote.bytemessage/.settings/org.eclipse.jdt.core.prefs
@@ -1,7 +1,7 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.6
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/org.eclipse.ote.io.test/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.ote.io.test/.settings/org.eclipse.jdt.core.prefs
index c537b6306..0c68a61dc 100644
--- a/org.eclipse.ote.io.test/.settings/org.eclipse.jdt.core.prefs
+++ b/org.eclipse.ote.io.test/.settings/org.eclipse.jdt.core.prefs
@@ -1,7 +1,7 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.6
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/org.eclipse.ote.io/.classpath b/org.eclipse.ote.io/.classpath
index ad32c83a7..eca7bdba8 100644
--- a/org.eclipse.ote.io/.classpath
+++ b/org.eclipse.ote.io/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
diff --git a/org.eclipse.ote.io/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.ote.io/.settings/org.eclipse.jdt.core.prefs
index c537b6306..0c68a61dc 100644
--- a/org.eclipse.ote.io/.settings/org.eclipse.jdt.core.prefs
+++ b/org.eclipse.ote.io/.settings/org.eclipse.jdt.core.prefs
@@ -1,7 +1,7 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.6
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/org.eclipse.ote.mavenbuild/pom.xml b/org.eclipse.ote.mavenbuild/pom.xml
index 34fc199bd..e6186226a 100644
--- a/org.eclipse.ote.mavenbuild/pom.xml
+++ b/org.eclipse.ote.mavenbuild/pom.xml
@@ -166,7 +166,7 @@
<configuration>
<sourceEncoding>utf-8</sourceEncoding>
<minimumTokens>100</minimumTokens>
- <targetJdk>1.6</targetJdk>
+ <targetJdk>1.8</targetJdk>
<format>xml</format>
<failOnViolation>${pmd.failOnErrors}</failOnViolation>
<outputDirectory>${pmd.reportPath}</outputDirectory>
@@ -420,8 +420,8 @@
<artifactId>tycho-compiler-plugin</artifactId>
<version>${tycho-version}</version>
<configuration>
- <source>1.6</source>
- <target>1.6</target>
+ <source>1.8</source>
+ <target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
@@ -480,7 +480,7 @@
<configuration>
<sourceEncoding>utf-8</sourceEncoding>
<minimumTokens>100</minimumTokens>
- <targetJdk>1.5</targetJdk>
+ <targetJdk>1.8</targetJdk>
<format>xml</format>
<failOnViolation>false</failOnViolation>
</configuration>
diff --git a/org.eclipse.ote.message.lookup/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.ote.message.lookup/.settings/org.eclipse.jdt.core.prefs
index c537b6306..0c68a61dc 100644
--- a/org.eclipse.ote.message.lookup/.settings/org.eclipse.jdt.core.prefs
+++ b/org.eclipse.ote.message.lookup/.settings/org.eclipse.jdt.core.prefs
@@ -1,7 +1,7 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.6
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/org.eclipse.ote.services.core/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.ote.services.core/.settings/org.eclipse.jdt.core.prefs
index c537b6306..0c68a61dc 100644
--- a/org.eclipse.ote.services.core/.settings/org.eclipse.jdt.core.prefs
+++ b/org.eclipse.ote.services.core/.settings/org.eclipse.jdt.core.prefs
@@ -1,7 +1,7 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.6
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/org.eclipse.ote.statemachine.test/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.ote.statemachine.test/.settings/org.eclipse.jdt.core.prefs
index c537b6306..0c68a61dc 100644
--- a/org.eclipse.ote.statemachine.test/.settings/org.eclipse.jdt.core.prefs
+++ b/org.eclipse.ote.statemachine.test/.settings/org.eclipse.jdt.core.prefs
@@ -1,7 +1,7 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.6
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/org.eclipse.ote.statemachine/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.ote.statemachine/.settings/org.eclipse.jdt.core.prefs
index c537b6306..0c68a61dc 100644
--- a/org.eclipse.ote.statemachine/.settings/org.eclipse.jdt.core.prefs
+++ b/org.eclipse.ote.statemachine/.settings/org.eclipse.jdt.core.prefs
@@ -1,7 +1,7 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.6
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/org.eclipse.ote.ui.message.search/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.ote.ui.message.search/.settings/org.eclipse.jdt.core.prefs
index c537b6306..0c68a61dc 100644
--- a/org.eclipse.ote.ui.message.search/.settings/org.eclipse.jdt.core.prefs
+++ b/org.eclipse.ote.ui.message.search/.settings/org.eclipse.jdt.core.prefs
@@ -1,7 +1,7 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.6
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/org.eclipse.ote.util/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.ote.util/.settings/org.eclipse.jdt.core.prefs
index c537b6306..0c68a61dc 100644
--- a/org.eclipse.ote.util/.settings/org.eclipse.jdt.core.prefs
+++ b/org.eclipse.ote.util/.settings/org.eclipse.jdt.core.prefs
@@ -1,7 +1,7 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.6
+org.eclipse.jdt.core.compiler.source=1.8

Back to the top